프로세스 : 컴퓨터에서 실행되고 있는 프로그램을 말함.
CPU 스케쥴링의 대상이 되는 작업(task)라는 용어와 유사한 의미.
스레드 : 프로세스 내 작업의 흐름을 지칭.
프로그램이 메모리에 올라가면 프로세스가 되는 인스턴스화 일어나고, 운영체제의 CPU 스케줄러에 따라 CPU가 프로세스를 실행.
1. 프로세스와 컴파일 과정
- 프로세스 : 프로그램으로부터 인스턴스화 된 것을 말함.
ㄴ ex) 프로그램 : chrome.exe / 두번 클릭시 구글 크롬 '프로세스' 시작.
1. 컴파일러(Compiler)
- 특정 프로그래밍 언어로 쓰여 있는 문서를 다른 프로그래밍 언어 혹은 컴퓨터 언어로 옮기는, 일종의 번역 프로그램.
- 비주얼, 터보, 볼랜드 등 언어에 따라 다양한 컴파일러 종류가 존재한다.
- 보통 high-level 프로그래밍 언어를 실행 프로그램으로 만들기 위한 lower level언어(ex 어셈블리 언어, object 코드, 등)로 바꾸는 데에 사용
- 원래의 문서를 '소스 코드' 혹은 원시 코드라고 부름
- 출력된 문서를 '목적 코드'라고 부름
1) 컴파일러 실행 단계
(1) 구문 분석 : 소스 코드 파일을 읽어 추상 구문 트리 생성, 문법에 맞지 않는 소스 코드는 사용자에게 알림
(2) 최적화 : 추상 구문 트리 분석 및 최적화.
(3) 코드 생성 : 목적 코드 생성.(기계어 번역의 경우 레지스터 할당, 연산 순서 바꾸기 외)
(4) 링킹 : 기계어 번역의 경우, 여러 라이브러리의 목적 코드를 묶어 하나의 실행파일 생성.
- 일부는 이 과정을 컴파일 과정에서 제외함.
2) 컴파일 과정
(1) 전처리기(Prrprocessor) : #include 등 #이 붙은 전처리기 구문을 처리.
(2) 컴파일러로 컴파일
(3) 어셈블러(Assembler) : 완전히 기계어로 바꾸어주는 역할
(4) 링커(Linker) 여러 개의 오브젝트 파일을 하나로 합치거나, 라이브러리를 합침
3) 컴파일러의 필수 조건
(1) 컴파일러는 옮김의 과정에서 프로그램의 뜻을 보존하여야 함
즉, 입력받은 프로그램의 의미를 충실히 따라야 함
(2) 컴파일러는 입력으로 들어온 프로그램을 실용적으로 개선해야 함
4) 컴파일러의 기능
(1) 고급언어를 직접 기계어 코드로 변환
(2) 자바의 경우 바이트 코드로 변환한다. 중간단계의 코드를 생성하고 이를 해석하여 실행
자바는 마이크로프로세서에서 실행되도록 개발되었기 때문.
- 장점 : 한 번 컴파일된 바이트 코드는 다른 플랫폼에서 재컴파일 없이 실행할 수 있음.
- 단점 : 바이트 코드를 해석해서 실행할 프로그램 구조가 필요. 직접 기계어 코드 실행시보다 느림
(3) C/C++의 경우 직접 기계어 코드로 변환
(4) 마이크로프로세서는 각각 다른 기계어 코드를 가지고 있기에, 다른 기계어 코드를 생성해야 함
즉, 마이크로프로세서에 맞는 컴파일러를 사용해야 함
*전처리
소스코드의 주석을 제거 및 헤더파일을 병합하여 매크로를 치환
*컴파일러
오류처리, 코드 최적화 작업을 하며 어셈블리어로 변환
*어셈플러
어셈블리어는 목적 코드로 변환됩니다.
*링커
프로그램 내에 있는 라이브러리 함수 또는 다른 파일들과 목적 코드를 결합하여 실행파일을 만듭니다.
*정적 라이브러리 & 동적 라이브러리
- 정적 라이브러리 : 프로그램 빌드 시 라이브러리가 제공하느 모든 코드를 실행 파일에 넣는 방식, 시스템환경 등 외부 의존도가 낮은 장점이 존재하지만 코드 중복등 메모리 효율성이 떨어지는 단점 존재
- 동적 라이브러리 : 프로그램 실행 시 필요할때만 DLL이라는 함수 정보를 통해 참조하는 방식, 메모리 효율성에서 큰 장점이 존재하나, 외부의존도가 높아지는 단점 존재.
2. 프로세스의 상태
프로세스의 상태는 크게 활동 상태 (Active)와 지연 상태(suspended) 로 나뉨.
- 활동상태 : 프로세스가 기억장치를 할당 받은 상태를 의미
- 지연상태 : 프로세스가 기억장치를 할당 받지 못한 상태를 의미
1] 생성 상태
프로세스가 처음 생성되는 상태를 생성 상태 라고 하며 준비 상태 ,혹은 지연 준비 상태로 가기전 임시로 걸치는 상태. 프로세스에 할당할 충분한 공간이 있으면 준비 상태로 전이시키고 그렇지 않으면 지연 준비 상태로 전이됨.
2] 대기 상태
메모리 공간이 충분하면 메모리를 할당받고 아니면 아닌 상태로 대기하고 있으며, CPU스케줄러로부터 CPU소유권이 넘어오기를 기다리는 즉, 자원을 요청후 할당받을때 까지 기다리는 상태를 뜻함. 자원이 할당되면 다시 준비상태로 전이(wake up) 됨.
3] 대기 중간 상태(ready suspended)
메모리 부족으로 일시 중단된 상태.
4] 실행 상태
CPU소유권과 메모리를 할당받고 인스트럭션을 수행중인, 즉 프로세스에 의해 실행되고 있는 상태를 뜻하며 시간할당량이 끝 (Time runout)나거나 우선순위가 높은 프로세스가 들어오면 선점(Preemption)으로 프로세스를 반납합니다 . 만약 프로세스 실행중 자원요청이 들어오면 대기 상태(block) 로 전이 됩니다.
4] 중단 상태(blocked)
어떤 이벤트가 발생한 이후 기다리며 프로세스가 차단된 상태. I/O디바이스에 의한 인터럽트로 인해 발생하기도 함.
5] 일시 중간 상태(blocked suspended)
대기중단과 유사. 중단된 상태에서 프로세스가 실행되려고 했지만 메모리 부족으로 일시 중단된 상태.
7] 종료 상태(terminated)
말그대로 종료상태. 메모리와 CPU 소유권을 모두 놓고 가는 상태. 자연스로운 종료와, 비자발적 종료(abort)도 있음. 자식 프로세스에 할당된 자원의 한계치를 넘어서거나, 부모프로세스가 종료되거나, process.kill 등 여러 명령어로 프로세스를 종료할 때 발생.
3. 프로세스의 메모리 구조
프로세스의 주소 공간은 코드(code), 데이터(data), 스택(stack), 힙(heap) 영역으로 구성.
1. code 영역
- 사용자가 작성한 프로그램 함수들의 코드가 CPU에서 수행할 수 있는 기계어 명령 형태로 변환되어 저장되는 공간
컴파일(compile) 타임에 결정되고 중간에 코드를 바꿀 수 없게 Read-Only 로 되어있음.
2. data 영역
- 전역 변수 또는 static 변수 등 프로그램이 사용하는 데이터를 저장하는 공간.
- BSS영역과 Data영역으로 나뉘고, BSS영역은 초기화가 되지 않는 변수가 0으로 초기화되어 저장되며 DATA영역은 0ㅇ이 아닌 다른 값으로 할당된 변수들이 저장됨.
- 전역 변수 또는 static 값을 참조한 코드는 컴파일이 완료되면 data 영역의 주소값을 가르키도록 바뀜.
전역변수가 변경 될 수도 있어 Read-Write로 되어있음.
3. stack 영역
- 스택에는 지역변수, 매개변수, 함수가 저장되고 컴파일 시에 크기가 결정되며 '동적'인 특징을 가짐.
- 함수 호출시 기록하고 함수의 수행이 완료되면 사라진다. 메커니즘은 자료구조(stack)에서 배운 LIFO(Last In First Out) 방법을 따름.
- 컴파일 시 stack 영역의 크기가 결정되기 때문에 무한정 할당 할 수 없음.
ㄴ재귀함수가 반복해서 호출되거나 함수가 지역변수를 메모리를 초과할 정도로 너무 많이 가지고 있다면 stack overflow가 발생.
4. heap 영역
- 힙은 동적할당할때 사용되며 런타임 시 크기가 결정됨.
ㄴEX) 동적 배열 벡터
- 프로그래머가 필요할 때마다 사용하는 메모리 영역.
- heap 영역은 런타임에 결정됨 -> 자바에서는 객체가 heap영역에 생성되고 GC에 의해 정리됨.
4. PCB(Process Control Block) : 프로세스를 실행하는데 필요한 주요한 정보를 보관하는 자료구조
PID : 프로세스의 고유번호
상태 : 준비, 대기, 실행, 보류 준비, 보류대기 등의 상태
포인터 : 다음 실행될 프로세스의 포인터 ->pcb를 연결하여 준비상태나 대기상태의 큐를 구현할때 포인터 사용
Register save area : 레지스터 관련 정보
우선순위 : 스케줄링 및 프로세스 우선순위
할당된 자원정보
Account : cpu 사용시간, 실제 사용된 시간
입출력 상태정보: 프로세스에 할당된 I/O디바이스 목록
* 컨텍스트 스위칭(context switching) : PCB를 교환하는 과정을 말함.
5. 멀티프로세싱
- 여러 개의 '프로세스', 즉 멀티 프로세스를 통해 동시에 두 가지 이상의 일을 수행할 수 있는 것
- 하나 이상의 일을 병렬로 처리할 수 있으며 특정 프로세스의 메모리, 프로세스 중 일부에 문제가 발생하더라도 다른 프로세스를 이용해서 처리할 수 있으므로 신뢰성이 높은 강점이 있음.
ex) 웹 브라우저 : 멀티 프로세스이자 멀티 스레드
* IPC (Inter Process Communication)
- 프로세스끼리 데이터를 주고받고 공유 데이터를 관리하는 메커니즘
ex) 클라이언트가 데이터를 요청하고 서버는 클라이언트 요청에 응답하는 것
1] 공유 메모리 : 공유 메모리를 통해 여러 프로세스가 하나의 메모리를 공유할 수 있음.
ㄴ 메모리 자체를 공유하기 때문에 불필요한 데이터복사의 오버헤드가 발생하지 않아 가장 빠르고, 동기화가 필요.
ㄴIPC 중에서는 가장 빠르다.
2] 파일 : 디스크에 저장된 데이터 또는 파일 서버에서 제공한 데이터
3] 소켓 : 동일한 컴퓨터의 다른 프로세스나 네트워크의 다른 컴퓨터로 네트워크 인터페이스를 통해 전송하는 데이터
4] 익명 파이프 : 프로세스 간에 FIFO 방식으로 읽히는 임시 공간인 파이프를 기반으로 데이터를 주고받으며, 단방향 방식의 읽기 전용, 쓰기 전용 파이프를 만들어서 작동하는 방식
ㄴ 부모, 자식 프로세스 간에만 사용할 수 있으며 다른 네트워크상에서는 사용이 불가능
5] 명명된 파이프 : 파이프 서버와 하나 이상의 파이프 클라이언트 간의 통신을 위한 명명된 단방향 또는 이중 파이프
ㄴ서버용 파이프와 클라이언트용 파이프로 구분해서 작동하며 하나의 인스턴스를 열거나 여러 개의 인스턴스를 기반으로 통신.
6] 메시지 큐 : 메시지를 큐 데이터 구조 형태로 관리하는 것. MQ라고도 부름.
ㄴ커널에서 전역적으로 관리되며 다른 IPC 방식에 비해서 사용 방법이 매우 직관적이고 간단함.
ㄴ공유 메모리의 대안으로 많이 사용.(쓰기 및 읽기 빈도가 높으면 동기화 때문에 구현이 복잡해지기 때문)
6. 스레드와 멀티스레딩
1) 스레드 : 프로세스 내에서 실행되는 가장 작은 단위.(프로세스는 여러 스레드를 가질 수 있음)
ㄴ 프로세스 : 코드, 데이터, 스택, 힙을 각각 생성 / 스레드 : 코드, 데이터, 힙은 스레드끼리 공유.
2) 멀티 스레딩
- 프로세스 내 작업을 여러 개의 스레드, 멀티 스레드로 처리하는 기법
- 스레드끼리 서로 자원을 공유하기 때문에 효율성 좋음.
- 한 스레드가 중단되어도 다른 스레드는 실행 상태일 수 있기 때문에 중단되지 않은 빠른 처리가 가능.
- 단점 : 한 스레드에 문제가 생기면 다른 스레드에도 영향을 끼쳐, 프로세스에 영향을 줄 수 있음..
7. 공유자원과 임계영역
1) 공유 자원(shared resource)
- 시스템 안에서 각 프로세스, 스레드가 함께 접근할 수 있는 모니터, 프린터, 메모리, 파일, 데이터 등의 자원이나 변수 등을 의미
- 경쟁 상태( race condition) : 공유 자원을 두 개 이상의 프로세스가 동시에 읽거나 쓰는 상황.
ㄴ 동시에 접근을 시도할 때 접근의 타이밍이나 순서 등이 결괏값에 영향을 줄 수 있는 상태.
2) 임계 영역
- 둘 이상의 프로세스 또는 스레드가 공유자원에 접근할 때 순서 등의 이유로 결과가 달라지는 '코드'영역
- 1) 임계 영역을 해결하기 위한 방법은 크게 뮤텍스, 세마포어, 모니터 세 가지가 존재.
ㄴ 모두 상호 배제, 한정 대기, 융통성이란 조건을 만족
- 2) 상호 배제 : 한 프로세스가 임계 영역에 들어갔을 때 다른 프로세스는 들어갈 수 없음.
- 3) 한정 대기 : 특정 프로세스가 영원히 임계 영역에 들어가지 못하면 안됨.
- 4) 융통성 : 한 프로세스가 다른 프로세스의 일을 방해해서는 안됨.
- 5) 잠금(lock) : 임계 영역을 화장실에 비유하여 A라는 사람이 문을 잠그고 나오면 그 다음 사람이 쓸 수 있다.
3) 뮤택스(mutex)와 세마포어(semaphore)
(1) 뮤택스 : 스레드가 공유 자원을 lock()을 통해 잠금설정하고 사용한 후에 unlock()을 통해 잠금해제하는 객체
ㄴ 잠금이 설정되면 다른 스레드는 잠긴 코드 영역에 접근할 수 없고 해제는 그와 반대
- 뮤텍스는 한 개의 프로세스 또는 스레드만의 임계영역접근을 처리하지만 세마포어는 여러 개의 임계영역접근을 처리.
(2) 세마포어 : 일반화된 뮤텍스로, 간단한 정수 값과 두 가지 함수 wait(p 함수) 및 signal(v 함수)로 공유 자원에 대한 접근을 처리
ㄴ wait() : 자신의 차례가 올 때까지 기다리는 함수, signal()은 다음 프로세스로 순서를 넘겨주는 함수
ㄴ signal 작업 : 프로세스가 공유 자원에 접근하면 세마포어에서 wait 작업을 수행하고 프로세스가 공유 자원을 해제하면 signal 작업을 수행
- 세마포어에는 조건변수가 없고 프로세스가 세마포어 값을 수정할 때 다른 프로세스는 동시에 세마포어 값을 수정할 수 없음.
(3) 바이너리 세마포어 : 0과 1의 두 가지 값만 가질 수 있는 세마포어
ㄴ 뮤텍스와 유사해보이지만, 신호를 기반으로 상호배제가 일어나는 신호메커니즘이 들어간 객체.
(4) 카운팅 세마포어 : 카운팅 세마포어는 여러 개의 값을 가질 수 있는 세마포어
ㄴ여러 자원에 대한 접근을 제어하는 데 사용
4) 모니터
- 둘 이상의 스레드나 프로세스가 공유 자원에 안전하게 접근할 수 있도록 공유자원을 숨기고 해당 접근에 대해 인터페이스만 제공
8. 교착상태(deadlock) : 두개 이상의 프로세스들이 서로가 가진 자원을 기다리며 중단된 상태
1) 원인
- 상호 배제 : 한 프로세스가 자원을 독접하고 있으며 다른 프로세스들은 접근이 불가능
- 점유 대기 : 특정 프로세스가 점유한 자원을 다른 프로세스가 요청하는 상태
- 비선점 : 다른 프로세스의 자원을 강제적으로 가져올 수 없다음
- 환형 대기 : 프로세스 A는 프로세스 B의 자원을 요구하고, 프로세스 B는 프로세스 A의 자원을 요구하는 등 서로가 서로의 자원을 요구하는 상황
2) 해결방법
- 자원을 할당할 때 애초에 조건이 성립되지 않도록 설계
- 교착 상태 가능성이 없을 때만 자원이 할당되며, 프로세스 당 요청할 자원들의 최대치를 통해 자원 할당가능 여부를 파악하는 '은행원 알고리즘'을 사용
- 교착 상태가 발생하면 사이클이 있는지 찾아보고 이에 관련된 프로세스를 한개씩 지움
- 교착 상태는 매우 드물게 일어나기 때문에 이를 처리하는 비용이 더 커서 사용자가 작업을 종료. (현대 운영체제는 이 방법을 택함. '응답없음')
'CS > CS' 카테고리의 다른 글
[TIL] HTTP 멱등성 (0) | 2023.05.29 |
---|---|
[TIL] HTTP 메서드 (1) | 2023.05.29 |
[CS] CPU스케줄링 알고리즘 (0) | 2022.10.25 |
[CS] 운영체제(OS)와 컴퓨터 (0) | 2022.10.25 |
[CS] 메모리란? (0) | 2022.10.25 |
야나의 코딩 일기장 :) #코딩블로그 #기술블로그 #코딩 #조금씩,꾸준히
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!