프로세스 개념
- 운영체제는 다양한 프로그램들을 실행한다.
- 실행중인 프로그램 -> 프로세스
- 프로세스는 다음을 포함한다.
- 텍스트 섹션(text section), 프로그램 코드
- 데이터 섹션(data section), 전역 변수
- 스택(stack), 함수의 매개변수, 리턴 주소, 지역 변수
- 힙(heap), 동적으로 할당되는 메모리
- 프로그램 카운터(program counter), 실행 중인 프로그램 다음에 실행할 명령어의 메모리 주소

프로세스 상태
프로세스는 실행되면서 그 상태가 변한다.
- New
- 프로세스를 생성한다.
- Running
- 명령어들이 실행되고 있다.
- Waiting(blocked, sleep)
- 프로세스가 어떤 사건이 일어나기를 기다린다.
- Ready
- 프로세스가 프로세서에 할당되기를 기다린다.
- Terminated
- 프로세스의 실행이 종료되었다.
Diagram of Process State

Process Control Block(PCB)
PCB : 운영체제가 프로세스에 대한 중요한 정보를 저장해 놓을 수 있는 저장 장소,
데이터를 관리하기 위한 메타데이터
구성 요소
- Process ID
- 프로세스의 고유 번호
- Process state
- new, ready, running, waiting, terminated 등의 실행 상태
- Program counter
- 다음에 실행될 명령의 주소
- CPU registers
- 스택 보인터, 일반적인 리지스터
- CPU scheduling information
- 스케줄링 정보
- Memory-management information
- 할당된 자원 정보
- Accounting information
- CPU 사용량
- I/O status information
- 할당된 입출력 장치
Process Scheduling Queues
프로세스는 수행하면서 상태가 여러 번 변하는데 이에 따라 서비스를 받아야하는 곳이 다르다. 그리고 프로세스는 일반적으로 여러 개가 한 번에 수행되므로 그에 따른 순서가 필요하다. 이러한 순서를 대기하는 곳을 큐(Queue)라고 부른다.
- Ready queue
- 메인 메모리에 상주하면서 실행을 기다리는 모든 프로세스들의 집합
- Device queue
- 입출력 장치를 기다리는 프로세스들의 집합
- 프로세스는 다양한 큐를 이동한다.

Scheduler(스케줄러)
CPU scheduler
- 다음으로 수행될 프로세스를 선택하고 CPU에 할당
프로세스들은 다음과 같이 분류될 수 있다.
- I/O-bound 프로세스
- 계산보다 입출력에 많은 시간을 보낸다.
- 많고 짧은 cpu burst, 큰 I/O burst

CPU burst는 말그대로 cpu명령을 실행하는 것을 말하고,
I/O burst는 I/O를 요청한 다음 기다리는 시간을 말한다.
- CPU-bound 프로세스
- 계산을 하는데 많은 시간을 보낸다.
- 적고 긴 cpu burst

Context Switch 문맥 교환
- CPU가 다른 프로세스로 바꿀 때, 시스템은....
- 지금까지의 프로세스 상태를 저장하고,
- 새로운 프로세스의 저장된 상태를 로드한다.
- 문맥 교환 시간은 순수하게 오버헤드이다.
- 문맥 교환을 하는 동안 유용한 작업을 할 수 없기 때문
- 문맥 교환 시간은 하드웨어에 영향을 받는다.

Process Creation 프로세스 생성
부모 프로세스가 자식 프로세스를 만들고,
자식 프로세스가 다른 프로세스를 만들고,
결국 프로세스 트리를 형성한다.
- 자식 프로세스는 자원을 필요로 한다.
- 자원 공유
- 부모와 자식은 모든 자원을 공유한다.
- 자식은 부모의 자원의 부분을 공유한다.
- 부모와 자식은 자원을 공유하지 않는다.
- 실행
- 부모와 자식은 동시에 실행한다.
- 부모는 자식이 종료될 때까지 기다린다.
- 주소 공간
- 자식은 부모를 복제하거나
- 자식에 새로운 프로그램아 로드된다.
- 요약
- 운영체제 커널에 PCB를 생성
- 메모리 공간을 할당
- 바이너리 프로그램 로드
- 프로그램을 초기화
- 유닉스의 경우
Process Termination 프로세스 종료
- 프로세스가 마지막 줄을 실행하고 운영체제에게 종료를 요구한다.
- 자식 프로세스는 상태 값을 부모에게 리턴한다.(wait)
- 자식 프로세스의 자원은 운영체제에 의해 할당이 해제된다.
- 부모가 자식의 프로세스의 실행을 종료할 수도 있다.(abort-비정상 종료)
- 만약 자식이 할당된 자원을 초과한다면
- 만약 자식에게 할당된 일이 더 이상 필요하지 않다면
- 몇몇의 운영체제는 부모 프로세스가 종료되었을 때 자식 프로세스가 존재하는 것을 허용하지 않는다. 만약 프로세스가 종료되면, 그것의 자식 프로세스도 종료되어야한다.
- 부모 프로세스는 wait() 시스템 콜을 사용해서 자식 프로세스가 끝나기를 기다릴 수 있다.
- 그 콜은 상태 정보와 종료된 프로세스의 pid를 반환한다.
- 만약 자식 프로세스가 종료되었는데 아직 부모 프로세스가 wait 시스템 콜을 호출하지 않았다면 자식은 좀비 프로세스(zombie)
- 만약 부모 프로세스가 wait을 호출하지 않고 종료했다면, 자식은 고아 프로세스(orphan)
Cooperating Processes
- Independent process 독립적인 프로세스
- 다른 프로세스의 실행이 영향을 주지도 받지도 않는다.
- Cooperating process
- 다른 프로세스의 실행에 의해 영향을 주거나 받는다.
- 프로세스간 협력의 장점
Producer-Consumer Problem 생산자-소비자 문제
- 생산자 프로세스는 소비자 프로세스가 소비하는 정보를 생산한다.
- 데이터를 생산하는 쪽이 생산자, 소비하는 쪽이 소비자
- 컴파일러는 어셈블러에 의해 소비되는 어셈블리 코드를 생산한다.
- 어셈블러는 로더에 의해 소비되는 객체 모듈을 생산한다.
- 무한 버퍼(unbounded-buffer) - 버퍼의 사이즈가 무제한이다.
- 유한 버퍼(bounded-buffer) - 버퍼의 사이즈가 제한적이다.
생산자 소비자 문제란?
생산자가 데이터를 생성하여 버퍼에 저장하고, 소비자가 버퍼에서 데이터를 가져와 소비하는 과정에서 발생할 수 있는 문제를 뜻한다. 대표적으로 공유 자원에 대한 임계구역 문제와 busy waiting 문제가 있다.
Direct Communication
- 프로세스는 각자를 명확하게 이름을 붙인다
- send(P, message) - 프로세스 p에게 메시지 보내기
- receive(Q, message) - 프로세스 q로부터 메시지 받기
- 프로세스의 식별자가 변경되면?
- 예전 식별자에 대한 참조는 찾아서 바꿔야한다.
Indirect Communication
- 메시지는 메일박스로 보내지고, 메일박스로부터 받을 수 있다.
- 메일박스
- 프로세스에 의해 메시지가 배치될 수도, 제거될 수도 있다.
- 각각의 메일박스는 고유한 id를 가진다.
- 프로세스는 그들이 메일박스를 공유해야 소통할 수 있다.
- 실행
- 메일박스를 생성
- 메시지를 메일박스를 통해 주고 받음
- 메일박스 파괴
- send(A, message) - 메일박스A로 메시지 보내기
- receive(A, message) - 메일박스A로부터 메시지 받기
Synchronization 동기화
- 메시지는 블로킹 또는 논블로킹으로 전달된다.
- 블로킹(Blocking)은 자신의 작업을 진행하다가 다른 주체의 작업이 시작되면 자신의 작업을 멈추고 해당 작업을 기다렸다가 다시 자신의 작업을 시작한다. synchronous(동기)
- 논블로킹(Non-blocking)은 다른 주체의 작업에 관련 없이 자신의 작업을 하는 것을 의미한다. asynchronous(비동기)