0. 프로그램과 프로세스
1️⃣ 프로그램이 저장되어 있는 곳 → 보조기억장치
- ex) 카카오톡 프로그램이 저장되어 있는 곳 : 보조기억장치(하드)
2️⃣ 프로그램이 로딩되는 곳 → 주기억장치
- 운영체제에서 켜져있는 프로그램
- ex) 카카오톡 프로그램이 로딩되어 실행되는 곳 : 주기억장치(RAM)

3️⃣ 프로그램을 실행해주는 주체 → 프로세스
- ex) 카카오톡 프로그램을 실행하는 프로세스 (CPU)
4️⃣ 작업을 처리해주는 주체 → 쓰레드
- ex) 메시지 발송을 처리하는 쓰레드, 메시지 수신을 확인하는 쓰레드
- 쓰레드는 필요할 때마다 생성됨
5️⃣ 프로세스 상태변화와 스케줄링
스케줄링 알고리즘에 따라 프로세스들은 상태변화가 일어나며, 준비/수행 상태일 때 CPU를 사용하게 됨.
🟠은 프로세스들의 상태를 의미하고, ⤴️는 스케줄링에 따라 상태가 변화되는 동작을 의미한다.

- ① 수행 → 대기 : i/o 요청이 발생하거나, 자식프로세스가 종료 대기를 할 때
- ② 수행 → 종료 : 프로세스를 종료시켰을 때
- ③ 수행 → 준비 : 인터럽트가 발생했을 때 (예외상황 발생)
- ④ 대기 → 준비 : i/o가 완료되었을 때
비선점 스케줄링
- ①과 ②는 프로세스가 스스로 CPU를 반환함

선점 스케줄링
- ③과 ④는 프로세스가 CPU를 강제로 할당(회수) 해야함

1. 프로세스 생명주기
프로세스 상태변화 = 프로세스 생명주기
1️⃣ 프로세스 상태 (Status)
📌 신규 (NEW)
- 프로세스가 이제 막 메인메모리에 올라온 상태
- 아직 실행하는 것은 X
- 수용동작(admit)을 거쳐야 준비단계로 넘어감
📌 준비 (Ready)
- 변수 초기화 등 기초 준비작업을 모두 끝낸 후, 실행할 수 있는 상태
- 스케줄러를 통해 발송(dispatch) 되어야 수행상태가 됨
- 아래 케이스를 통해 준비상태가 됨
- 신규 프로세스 수용
- 대기 프로세스의 i/o, 이벤트 완료
- 수행 프로세스 중단
📌 수행 (Running)
- CPU가 실제로 프로세스를 수행하고 있는 단계
- 선점 스케줄링에 의해 중단되면(interrupt) → 준비상태
- i/o, 이벤트가 필요하면 → 대기상태
- 수행이 완료되면 → 종료상태
- 아래 케이스를 통해 수행상태가 됨
📌 대기 (Waiting)
- 프로세스 도중에 i/o 작업이 필요하여 수행하는 상태
- 이때 CPU는 i/o를 기다리며 다른 프로세스를 수행함
- 대기상태가 끝나면 프로세스는 다시 준비상태가 되고, 다시 수행상태가 됨
📌 종료 (Terminated)
- 최종적으로 프로세스가 종료된 상태
- 사용하던 메모리 영역이 해제됨
2️⃣ 대기 큐 (Waiting Queue)

📌 Job Queue
- HDD에 있던 프로그램들이 메인메모리에 올라올 때, 만약 메인메모리가 가득 찼거나 CPU가 다른 작업 수행중이면 메인메모리에 올라오기 전 대기해야 함
- HDD의 프로그램들이 잠시 기다리는 곳을 Job Queue라고 함
📌 Ready Queue
- 메인메모리에 프로그램이 올라와도 바로 CPU 서비스를 받을 순 없음
- 다른 프로그램이 수행 중이면 기다렸다가 수행중인 프로그램이 i/o를 시작하거나 시공유시스템의 경우 시간초과되면 실행됨
- 이미 메인메모리에 올라온 프로세스들이 실행을 위해 대기하는 곳을 Ready Queue라고 함
📌 Device Queue
- i/o 장치를 사용하려면 기존 i/o 작업이 끝나길 기다렸다가 밀려있던 모든 작업이 끝나면 비로소 i/o 장치를 사용할 수 있음
- 프린터 큐, 마우스 큐, 키보드 큐 등 각각의 대기큐를 가지고 있는데 이를 통틀어서 Device Queue라고 함
💡 Terminated Waiting Queue가 없는 이유
- 어떠한 프로세스가 종료될 때에는 기다릴 필요 없이 즉시 종료되기 때문
3️⃣ 스케줄링 (Scheduling)

📌 Job Scheduler
- Job Queue의 프로그램들을 어떤 순서로 메인메모리에 올릴 것인지 결정함
- 본 과정은 프로그램이 새로 시작될 때, 메인메모리가 가득 찬 경우 등의 상황에만 드물게 발생함
→ Long Term Scheduler라고 함
📌 CPU Scheduler
- Ready Queue의 프로세스들을 어떤 순서로 서비스 할 것인지에 대한 스케줄러
- 모든 스케줄링 중에서 CPU 스케줄링이 가장 중요함
- 시공유시스템(대화식_다중프로그래밍)의 경우 본 과정은 1초에도 수십~수백번 발생함
→ Short Term Scheduler라고 함
📌 Device Scheduler
- Device Queue의 프로세스들을 어떤 순서로 i/o 장치를 이용하게 할 것인지에 대한 스케줄러
[i/o Bound Process 🆚 CPU Bound Process]
i/o Bound Process
- 대부분의 시간을 i/o하는데 쓰는 프로세스
CPU Bound Process
- 대부분의 시간을 CPU로 연산하는데 쓰는 프로세스
👉🏻 운영체제(Job Scheduler)는 이들을 적절하게 배합해 i/o 장치와 CPU 모두 너무 오랫동안 쉬지 않게 해야함 (for 성능)
4️⃣ 주-보조교환 (Swapping)
임시 메모리의 목적으로 사용되는 HDD 공간을 뜻함 → Backing Store or Swap Device
(메모리 효율화를 위해 작업현황을 파악 후 프로세스를 'HDD ↔︎ 메모리' 동적으로 Swapping)
서버와 같이 여러 사용자가 하나의 메모리를 공유하는 경우, 만약 한 사용자가 자리를 비우면 그 사용자가 돌아올 때 까지 해당 프로세스에 메모리를 할당할 이유가 없음.
때문에 PCB(Process Control Block)의 CPU Time 등을 확인해 오랫동안 동작이 없는 프로세스는 잠시 HDD로 내려놓고, 다른 프로세스를 실행하거나 기존 프로세스에 메모리를 더 할당하는 등의 메모리 효율화를 함
그러다 동작없던 프로세스 사용자가 돌아와 작업을 수행하면 다시 HDD에서 메모리로 프로세스를 올림
| Swapping 종류 | 내용 |
|---|
| Swap Out | - 메모리에서 HDD로 내리는 작업 |
| Swap In | - HDD에서 다시 메모리로 올리는 작업 |
💡 Midium Term Scheduler
- Swapping 역시 여러 프로세스들이 HDD로 내려가고 다시 메인메모리로 올라오고 하기에
어떤 순서로 프로세스를 먼저 내리고 올릴지 결정이 필요함
- 본 스케줄링 작업은 Short보다는 빈번하고 Long보다는 드물기에 Midium Term이라 정의함
5️⃣ 문맥교환 (Context Switching)
📌 Context Switching
- CPU 시간공유 시스템의 경우 일정시간이 지나면 기존 프로세스를 준비상태로 만들고 다른 프로세스를 수행상태로 만들어 실행함
- 이렇게 실행하는 프로세스를 Switch하는 것을 통틀어 Context Switching 이라고 함
📌 Scheduler
- Context Switching을 전담하는 스케줄러는 CPU 스케줄러임
(Ready Queue의 프로세스들을 어떤 순서로 서비스 할 것인지에 대한 스케줄러)
📌 Dispatcher
- 만일 프로세스 A의 코드 중, 100번 라인까지 실행했고 작업중에 10개의 데이터를 레지스터에 저장했다면
스위치할 때 이 정보들을 보존해야 A의 차례가 돌아왔을 때 이전수행 작업이 끊기지 않고 유지될 수 있음
- 때문에 Switch 될 때 작업정보를 저장하고 차례가 돌아왔을 때 정보를 다시 꺼내 PC, SP, Register 등에 할당함
💡 대부분의 OS는 CPU 스케줄링 방법 중 시간공유시스템을 사용할까?
👉🏻 YES!!
대부분의 운영체제는 CPU 시간을 여러 프로세스나 스레드에 공평하게 분배하는 CPU 시간공유시스템을 사용함
CPU 시간 효율화를 위해, CPU를 사용하지 않는 프로세스나 스레드가 있다면 다른이에게 CPU 시간을
할당해줌
CPU 시간공유시스템을 사용함으로써, 여러 프로세스나 스레드가 동시에 실행되는 것처럼 보일 수 있으나
실제로는 CPU가 매우 빠르기 때문에 매우 짧은 시간에 여러 프로세스나 스레드를 번갈아가며 실행할 수 있음
참고
와 정말 잘 이해가 되네요.