> For the complete documentation index, see [llms.txt](https://real-dev.gitbook.io/real-library/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://real-dev.gitbook.io/real-library/os_with_joonion/3-..md).

# 3강. 프로세스 개요

* 실행 중인 프로그램 단위를 일컫는다.
* 프로세스를 위해선 CPU, Memory, 파일, IO 디바이스에 대한 제어가 필요하다.
* 보통 프로그램을 실행할때 HDD, SSD에 저장된 프로그램을 메모리에 로딩하면 CPU에서 실행할 수 있게 되는데, 이 `로딩된 프로그램` 을 프로세스라고 한다.
* 메모리 영역은 여러개의 섹션으로 나눠져 있다.
  * 실행 가능한 코드들이 저장된 `텍스트 섹션`
  * 전역 변수들이 저장된 `데이터 섹션`
  * 동적인 객체들이 저장되는 `힙 영역`
  * 지역변수, 함수 파라미터, 리턴 값 등이 저장되는 `스택 섹션`
* 프로세스 상태는 `new, running, waiting, ready, terminated`로 나뉜다.
* fork()를 통해 `new` 상태 → 초기화가 끝나면 `Ready` → CPU 시간을 할당받으면 `Running` → CPU 시간을 빼앗기면 `Waiting` → 끝나면 `Terminated`
* 프로세스의 상태를 저장하기 위해선 Proccess Control Block (PCB)에 모든 정보를 넣어두고 관리한다. 프로세스 상태, 프로그램 카운터 (메모리 위치), CPU Registers (Context), CPU 스케쥴링 정보, 메모리 정보, 계정 정보, IO 상태 정보
* 해당 PCB들을 운영체제가 관리함.
* 현대적인 프로그램에선 여러 프로세스를 동시에 실행할 수 있도록 지원함. 프로세스 안에서도 여러개의 쓰레드를 실행하기 위해선 멀티 쓰레드 프로그래밍이 지원됨
* 그래서 `*thread is a lightweight process.*` 라고 하기도 함. 쓰레드가 프로세스보다 가볍기 때문에 멀티 프로세스보다 좋은 점이 많음. 일단 빠르고, 경량임
* 동시에 여러 작업을 빠르게 실행하기 위해선 `스케줄링 큐`를 통해 제어해야 함
* 여러 개의 프로세스들은 레디큐에서 CPU 자원의 할당을 기다린다. Linked Queue를 통해 구현하면 되겠죠. IO가 있으면 waiting queue에서 기다리다가 IO가 끝나면 레디큐로 이동하여 대기함
* 이런 동작들을 개별적으로 Context 즉 문맥이라고 함. Context Switch는 결국 CPU 제어권을 다음 프로세스에게 넘겨주는 일. 현재 프로세스의 상태를 저장하고 다음 프로세스의 상태를 변경한다.
* 프로세스는 새로운 프로세스를 생성할 수 있다. 그럼 자식 프로세스와 동시에 실행될수도, 자식 프로세스가 종료될 때까지 기다릴 수도 있다.
* fork를 통해서 자식 프로세스를 생성해놓고 부모 프로세스가 웨이트를 실행해놓고 있으면 좀비 프로세서, 반대로 부모 프로세스가 종료되면 고아 프로세스가 된다.

<br>
