1️⃣ 문맥 교환 (Context Switch)
- CPU가 현재 프로세스의 상태(CPU 레지스터 값 등)를 PCB에 저장하고, 다른 프로세스의 PCB 정보를 불러와 레지스터에 적재하는 과정
- 문맥 = 프로세스 상태 / 문맥 교환 = 상태 교환
- 오버헤드 발생: 이 동안 유용한 작업(실행) 은 하지 않음
- 문맥 교환은 사용자 프로그램을 실행하는 게 아니라, 운영체제 내부에서 cpu를 전환하기 위한 행정 처리를 하고 있는 시간 - 문맥 교환 시간은 하드웨어 성능에 따라 다름 (레지스터 수, 메모리 속도, 특수 명령어 유무 등)
- cpu는 문맥 교환을 하는 동안에는 다른 작업을 하지 못하기 때문에, 문맥 교환 시간을 줄이는 것이 좋음.
- P0가 실행되는 도중, 시스템 콜이나 인터럽트를 받으면 P0의 현재 상태를 운영체의 PCB0에 저장
- 이후, 인터럽트를 받은 P1을 실행하기 위해, 운영체제의 PCB1에서 P1의 상태 정보를 가져와 CPU의 PC값에 로드
2️⃣ 프로세스 스케줄링
- 목적: CPU를 최대한 쉬지 않게 활용하기 위함
- 다중 프로그래밍: 여러 프로세스를 메모리에 올려두고 CPU 사용률 향상
- 시분할 시스템: 각 프로세스에게 CPU 시간을 조금씩 분할해서 제공
- 준비 상태의 프로세스들 중에서 어떤한 프로세스를 선택해서 실행할 것인지를 선택함.
3️⃣ 스케줄링 큐 (Scheduling Queue)
운영체제는 스케줄링을 위해 PCB를 큐(Queue)로 관리함.

📌 준비 큐 (Ready Queue)
- CPU를 기다리는 Ready 상태의 프로세스들의 PCB를 연결 리스트로 관리
- 헤더는 첫 PCB, 마지막 PCB를 가리킴
- 각 PCB는 다음 PCB를 가리키는 포인터 보유
📌 입출력 큐 (I/O Queue)
- 각 I/O 장치마다 개별 큐 보유
- I/O 요청 중인 프로세스들이 대기
- I/O 완료 시 인터럽트 발생 → Ready Queue로 이동
4️⃣ 프로세스 상태와 큐 이동
- 새 프로세스 → Ready Queue로
- 프로세스가 생성되면 Ready 상태가 되어 ready queue에 들어감. - 프로세스는 CPU가 할당하면 실행
- 운영체제의 스케줄러가 dispatch를 통해 CPU에 프로세스를 할당하면 PCB에 저장된 프로세스의 메모리 주소 값을 CPU의 PC에 로드

- 실행 중 입출력 요청 → I/O Queue로( 실행 중이던 프로세스는 Ready 상태에서 Waiting 상태로 넘어가며, I/O 완료 인터럽트를 기다림)
- I/O 완료 인터럽트를 받으면 Waiting 상태에서 Ready 상태로 돌아가 다시 스케줄러의 dispatch를 기다림 - 타이머 인터럽트 → Ready Queue로 돌아감 (시분할 시스템)
- 각 프로세스마다 할당된 CPU 사용 시간(?) 이 지나면, 실행 중이던 프로세스를 중단하고 다시 Ready 상태로 돌아감
- 보통 단기 스케줄러가 수십 밀리 초(프로세스의 타이머 주기)마다 한번 씩 새로운 프로세스를 선택함. - fork() 시스템 호출이 발생하면 운영체제가 기본적으로는 자식과 부모 프로세스 모두를 Ready 상태로 보냄
- 만약에, 부모 클래스에서 wait()을 하면 부모 프로세스는 대기 상태(대기 큐), 자식 프로세스는 Running이 되어, 부모 프로세스는 자식 프로세스의 완료 시그널을 기다림 → 자식 프로세스 종료 후 Ready Queue 복귀 - 위 그림에서는 인터럽트를 기다리면서 인터럽트를 받으면 프로세스를 중단하고, 준비 상태(Ready queue)로 복귀함
- 인터럽트 대기 상태가 따로 있는 것이 아니라, CPU가 프로세스를 처리하는 동안 인터럽트를 받게 되면 프로세스를 중단하는 것!
5️⃣ 스케줄러(Scheduler)
| 종류 | 역할 |
| 장기 스케줄러 (Long-term) | 2차 저장장치(하드 디스크) 의 작업 중 일부를 메모리로 가져옴 (Ready 상태 진입 결정) |
| 단기 스케줄러 (Short-term) | Ready Queue에서 어떤 프로세스를 CPU에 줄지 결정(프로세스의 타이머 주기마다 한번 씩 실행되어 새로운 프로세스를 선택함.) |
| 중기 스케줄러 (Medium-term) | 프로세스를 swap out / swap in 하여 메모리 부하 조절 |
- 장기 스케줄러는 다중 프로그래밍 정도를 제어
- 메모리에 미리 많은 프로세스가 있을 경우, 메모리 부족이 일어날 수 있음
- 메모리에 프로세스가 너무 없을 경우, CPU가 노는 시간이 발생할 수 있음 - I/O 중심 / CPU 중심 프로세스를 적절히 섞는 것이 성능에 중요
- 메모리에 I/O 중심 프로세스만 있으면, CPU가 놀게 되고 CPU 중심 프로세스만 있으면, I/O가 놀게 됨.
- I/O와 CPU의 효율적인 사용을 위해서는 두 종류의 프로세스의 비율이 1:1인 것이 좋음
- 이 비율을 장기 스케줄러가 하드 디스크에서 메모리로 프로세스를 로드하면서 조절
6️⃣ 중기 스케줄러와 Swap
- 지금까지 CPU가 인터럽트나 I/O 장치로 인해 실행 도중에 중단하고 Ready 상태로 돌아간 프로세스가 있음.
- 이러한 부분적으로 실행된 프로세스를 하드 디스크에 저장해놨다가 나중에 메모리(주 기억장치)로 불러와 처리
이러한 작업을 Swapping(Swap out과 Swap in)이라 하고, 이를 하는 것이 중기 스케줄러!!
- 실행 중이던 프로세스를 디스크로 내보내기 (swap out)
- 이후 다시 메모리에 적재 (swap in)
- 이 과정에서 다른 물리 주소에 로드될 수 있음
- swap in, swap out 될 때, 프로세스와 함께 PCB도 같이 저장 및 복원함.
- Swap out할 때 Swap in 할 때의 PCB 주소와 다른 주소로 로드될 수 도 있음 - 이 처럼, 다른 주소로 Swap out 하게 되면, OS는 PCB와 페이지 테이블 정보를 최신화함.( 새로 로드된 주소를 PCB에 저장)
7️⃣ 프로세스 생성과 시스템 호출
- 초기 프로세스: init (부팅 시 OS가 생성)
- fork(): 부모 프로세스가 자식 프로세스를 복제
→ 주소 공간도 함께 복사 - exec(): 자식 프로세스 주소 공간에 새 프로그램 적재
- wait(): 부모가 자식이 종료될 때까지 대기(Blocked)
📌 주소 공간
- 부모와 자식은 주소 공간을 복사 또는 공유할 수 있음 (선택 가능)
📌 메모리 공간
- 부모와 자식은 메모리 공간을 모두(기억장치, 개방된 파일, 입출력 버퍼 등) 공유할 수도 있고, 일부만 공유할 수도 있고, 모두 공유를 안할 수도 있음(선택)
📌 실행
- fork() 시 부모와 자식은 함께 실행되며, 자식은 fork()된 위치부터 코드를 시작(복사된 파일의 처음부터 실행되는 것이 x)
- 부모가 wait()를 하면, 부모는 자식이 끝나 종료 시그널을 보낼 때까지 기다림(대게의 경우, 부모는 wait()을 함)

- 메모리에서 P1 프로세스가 실행되는 도중에 fork()를 만남!!
- fork()는 시스템 호출이기 때문에, OS에서 이를 처리함. OS에 저장된 PCB1을 복사해서 자식 프로세스를 만듬.
- 자식과 부모의 PID는 서로 다름. 부모의 PCB1에는 현재 실행 중인 코드 줄(PC) 정보가 있기 때문에, 자식 생성 후에 자식 프로세스의 fork() 다음 줄의 주소 값을 PC로 넘겨 자식 프로세스에서 fork() 다음줄부터 실행 가능
- 위의 C코드에서 pid = fork()를 하면, 저 코드와 똑같은 자식이 생김. fork()의 리턴 값인 pid는 fork() 실패 시엔 -1, 성공 시엔 자식의 PID(양수)를 반환, 자식 프로세스의 경우 0을 가지고 있음.
- 때문에 fork()된 서로 같은 두 자식과 부모 코드여도 자식은 if(pid == 0)의 코드를 실행 후에 부모에게 종료 시그널을 보내고, 부모닌 else문으로 들어가서 자식의 종료 시그널을 기다려(wait()) 프로세스를 종료함(exit 0).
'OS' 카테고리의 다른 글
| [운영체제] 쓰레드(Thread) 란?? (0) | 2025.04.07 |
|---|---|
| [운영체제] 프로세스 종료와 통신 (1) | 2025.04.02 |
| [운영체제] 프로세스의 상태(Process State) 란? (0) | 2025.03.26 |
| [운영체제] 프로세스(Process) 란? (0) | 2025.03.24 |
| [운영체제] 사용자 인터페이스와 운영체제 (0) | 2025.03.24 |
