
자원(resource)들을 필요로 한다. ➡️ CPU time, files, memory, I/O devices
initialized / unintialized 나눠짐fork() 를 통해 생성
: 각 프로세스들은 운영체제에서 PCB라는 형태로 표현된다.
PCB가 포함하고 있는 것들 🧱
- 프로세스의 상태 (Process State) : 위에서 언급한 new, run, wait, ready, terminate 다섯 가지 중 하나이다.
- 프로그램 카운터 (Program Counter) : fetch해 올 메모리의 주소를 담는다.
- CPU 레지스터 (CPU Register) : IR(Instruction Register), DR(Data Register), PC(Program Counter) 등을 포함하여 레지스터 정보들을 가지고 있다.
- CPU 스케줄링 정보 (CPU Scheduling Information) : 프로세스들 사이의 실행 순서를 정하는 정보
- 메모리 관리 정보 (Memory management Information) : 동적 할당 등에 관한 정보
- 계정 정보(Accounting Information) : 사용자에 대한 정보
- 입/출력 상태 정보(I/O Status Information) : 어떤 파일을 open하고 close했는지 등의 정보
➡️ 위와 같이 구성된 PCB들을 운영체제가 관리해줘야 한다.
〰️ 프로세스(Process)
- 프로세스는 하나의 싱글 쓰레드를 실행하는 프로그램이다.
(프로그램이 한 줄로 실행된다는 것을 의미❗️ 하단 쓰레드와 다른 것❗️)- 한번에 하나의 task만 실행이 가능하다.
- 현대 운영체제 시스템은 프로세스가 멀티 쓰레드(Multi Thread)를 실행할 수 있게 한다. 고로, 한 타임에 여러 작업을 처리할 수 있게 한다.
➡️ 운영체제의 핵심 기능은멀티태스킹과멀티 프로세싱을 적용할 수 있게 하는 것 ❗️
🪡 쓰레드(Thread)
- 하나의 싱글 쓰레드에서 파생되어, 프로세스 안에 또 다른 작은 프로세스를 의미한다.
- 여러 개의 프로세스를 실행하는 것보다, 여러 개의 쓰레드를 실행하는 것이 훨씬 장점이 많다.

Ready 상태이고 CPU의 코어에서 실행하기를 기다리고 있을 때, 프로세스들이 시스템 상에 들어오면 ready queue 에서 대기한다.running 상태에 있던 프로세스들은 보통 다시 ready queue로 돌아가지만, 특정한 이벤트가 발생하기를 기다리는 프로세스들은 wait queue에 들어간다.
ready queue, wait queue 와 같은 큐들은 일반적으로 PCB들의 연결 리스트(linked list)로 구현된다. ready queue 와 wait queue 를 표현한 그림이다. 

running) 프로세스의 주소를 PC(program counter)에 저장해놓고, 재개 가능 시(ready queue에 있다가 CPU의 running 상태를 획득했을 때) 문맥을 복구시킨다. 1) 현재 프로세스의 state를 PC에 저장하기
2) 다른 프로세스의 state를 restore해오기
아래 그림은 프로세스와 프로세스 사이의 문맥 교환을 나타낸 그림이다.
프로세스 P0를 진행하다가 interrupt 혹은 system call이 발생하면 현재 프로세스 P0의 상태를 PCB0에 저장하고, 프로세스 P1의 상태를 PCB1으로부터 불러온다.
P1의 실행이 종료되면, P1의 상태를 PCB1에 저장하고, P0의 상태를 PCB0으로부터 불러온다. 

➡️ 하나의 프로세스는 또 다른 프로세스를 생성할 수 있다.
➡️ fork()를 통해 위와 같은 프로세스들의 트리 관계가 성립될 수 있다.
1️⃣ 부모 프로세스와 자식 프로세스가 동시에 실행되는 경우
2️⃣ 부모 프로세스가 자식 프로세스가 종료될 때까지 기다리는 경우
1️⃣ 자식 프로세스가 부모 프로세스와 똑같은 일을 수행
2️⃣ 자식 프로세스가 부모 프로세스와 다른 새로운 일을 수행

➡️ fork()가 진행되면 child process가 실행되고, parent process는 wait 상태가 된다.
➡️ child process가 종료되었을 때 parent process가 실행된다.
exit() 이라는 시스템 콜을 이용할 수도 있다. 아직 wait() 명령을 호출하지 않아 삭제되지 않는 프로세스들을 좀비 프로세스라고 한다. wait()하지 않고 return해서 종료된 경우 해당 자식 프로세스를 고아 프로세스라고 한다.