Process
프로세스는 실행 중인 program 혹은 메모리에 로드된 프로그램이다.
현대 os는 multi threads를 다루는 Process를 지원한다.
프로세스의 메모리 배치

text, data 부분은 고정되며, stack과 heap 부분은 동적으로 바뀐다.
- text: 실행 코드
- data: 전역 변수
- Heap: 프로그램 실행 중에 동적으로 할당되는 메모리
- Stack: 함수를 호출할 때 임시 데이터 저장 장소
함수 매개변수, 지역변구

Process State

- new: process 생성
- ready: cpu에게 할당되기를 대기하는 상태
- running: 프로세스의 instruction이 실행 중인 상태
- waiting: 입출력이나 특정 이벤트 발생를 기다리는 상태이다.
- terminaged: 실행 종료 상태
PCB
특정 프로세스와 연관된 모든 정보의 저장소이다. doubly linked list로 구현된다.

- process state: new, ready, running, waiting, halted
- program counter: 다음 실행될 명령어 주소
- cpu registers: cpu의 각종 레지스터의 상태 정보 저장
- cpu scheduling: 프로세스 우선순위,, 스케줄 큐에 대한 포인터 정보 저장
- 메모리 관리 정보:
- accounting 정보
- 입출력 상태 정보
Thread
프로세스 안에 하나의 작업의 단위를 말한다.
multi thread
- process가 여러 실행 thread를 가지고 한 번에 하나 이상의 task를 실행
Process Scheduling
multi programming: 여러 process들이 실행하도록 하여 CPU 이용률을 최대화한다.
Time sharing: process 사이에 CPU를 자주 switch한다.
Scheduling Queue
- 프로세스가 시스템에 진입하면 → Ready Queue에 삽입되어 cpu에서 실행되기를 ready/wait 한다.
- ready queue, wait queuesms Linked list 형태로 저장된다.
- queue의 head는 PCB의 첫 포인터를 가지고 각 pcb는 다음 pcb의 포인터를 가진다.

CPU Scheduling
CPU Scheduler 역할
ready queue에 있는 하나의 process를 선택하고 cpu를 할당한다.
swapping
메모리 과부화 상태일 때 프로세스를 제거하는 것을 말한다. 메모리가 초과 사용되어 해제되어야 할 때만 필요
- swapped out → 메모리 → 디스크
- swapped in → 디스트 → 메모리
Context Switch
context란 현재 실행되고 있는 process의 PCB에 저장된 내용을 말한다.
interrupt가 발생 시 cpu에서 실행 중인 현재 context를 저장하고 interrupt 처리가 끝나면 context를 복원한다.
이처럼 다른 process에게로 cpu를 switch하는 것을 말한다.
아래 그림 처럼 p0 프로세스 실행 중 interrupt나 system call이 발생하면 현재 프로세스 상태를 PCB_0에 저장하고 실행할 새로운 프로세스의 PCB1를 load한다.

- pure overhead: 스위칭 동안 쓸모있는 일을 하지 않고 하드웨어 지원에 의해 크게 좌우
Operations on Processes
프로세스 생성
- 프로세스가 실행되는 동안 여러개의 새로운 프로세스들을 생성할 수 있다.
이때 생성한 프로세스 = 부모, 생성된 프로세스 = 자식
- pid(Process Identifier) : 고유한 프로세스 아이디
- 자식 프로세스를 생성할 때, 자식 프로세스의 자원을 운영체제로부터 직접 얻거나 부모가 가진 자원의 부분 집합만 사용하도록 제한할 수 있다.
- 부모 자식을 실행할 때 1) 부모/자식 병렬 실행 2) 부모가 자식이 종료될 떄 까지 기다릴 수 있다.
- 주소 공간 측면에서 볼때 1) 자식 프로세스는 부모 프로세스의 복사본이면 부모와 동일한 프로그램과 데이터를 가진다. → fork() 2) 자식 프로세스가 자신에게 적재될 새로운 프로그램을 가지고 있다
프로세스 종료
- 프로세스가 마지막 문장의 실행을 끝내고, exit 시스템 콜을 사용하여 운영체제에 자신의 삭제를 요청하면 종료한다.
- 이 시점에서 프로세스는 자신을 기다리고 있는 부모 프로세스에 (wait 시스템 콜을 통해) 상태값(통상 정수값) 을 반환할 수 있다
- 부모 프로세스가 종료되면 자식 프로세스도 종료된다.
- 좀비 프로세스 종료되었거나 부모가 아직 wait()를 호출하지 않은 process 부모가 wait()를 호출하면 좀비 process의 pid와 pcb의 항목이 해제됨
- 고아 프로세스 부모가 wait()를 호출하지 않고 종료한 경우 → pcb에 정보가 계속 남음
Interprocess Communication
프로세스 간 통신이 필요한 이유
- 정보 공유
- 계산 가속화
- 모듈성
Shared Memory
- 공유 메모리 영역을 만들 때만 system call이 일어나므로 빠르다.
- 공유 메모리 영역은 공유 메모리 segment를 생성하는 process의 주소 공간에 위치한다.
- 공유 메모리가 만들어지면 모든 접근이 일상적인 접근으로 취급되고 커널의 도움이 필요없다.
- 공유 메모리는 둘 이상의 프로세스가 접근하지 않게 제어해야 한다.
Message Passing
- 작은 data를 교환할 때 유용
- 분산 system 환경에서 구현이 쉽고 느리다.
- 최소 send(), receiver() 2가지 연산을 제공한다.
- 하나의 링크와 send()/receive() 연산을 논리적으로 구현하는 방법은 3가지 있다. 1) 직접 또는 간접 통신 2) 동기식 또는 비동기식 통신 3) 자동 또는 명시적 버퍼링