코드네임 :

⚙️ 운영체제 - CPU 스케줄링 기본 ⚙️ 본문

컴퓨터와 함께해요/운영체제

⚙️ 운영체제 - CPU 스케줄링 기본 ⚙️

비엔 Vien 2024. 10. 17. 18:11

< CPU 스케줄링이 실행되는 4가지 상황 >

1. 스레드가 시스템 호출 끝에 I/O를 요청하여 블록될 때 

- 스레드가 입출력(I/O) 작업을 요청하면, CPU는 더 이상 해당 스레드가 필요하지 않기 때문에 해당 스레드를 블록 상태로 만듦

➡️ CPU의 활용률 극대화 목적

 

2. 스레드가 자발적으로 CPU를 반환할 때

: 스레드가 자발적으로 yield() 호출을 통해 CPU를 반환

: 커널은 현재 스레드를 준비 리스트에 넣고, 새로운 스레드 선택

➡️ 균등한 CPU 분배 목적

 

3. 스레드의 타임 슬라이스가 소진되어 타이머 인터럽트 발생

: 스레드가 정해진 타임 슬라이스를 모두 사용하면, 타이머 인터럽트가 발생하고 현재 스레드를 중단시키고 준비 리스트에 있는 다음 스레드로 CPU를 할당

➡️ 균등한 CPU 분배 목적

 

4. 더 높은 순위의 스레드가 요청한 입출력 작업 완료, 인터럽트 발생

: 현재 스레드를 강제 중단(preemption)시켜 준비 리스트에 넣고높은 순위의 스레드를 깨워 스케줄링

➡️ 우선순위를 지키기 위한 목적


 

[ CPU 스케줄링과 디스패치 ]

 

< CPU 스케줄링 코드의 실행  >

스케줄링 코드의 위치: CPU 스케줄링은 커널 내에 위치한 함수

- 독립된 스레드가 아님

 - 시스템 호출이나 인터럽트 서비스 루틴이 끝날 때 호출됨

스케줄링 코드가 실행되는 시점 : 시스템 호출 또는 인터럽트 서비스 루틴이 끝난 시점

 

<디스패처 코드의 실행 >

디스패처의 역할: 스케줄러에 의해 선택된 스레드를 CPU에서 실제로 실행하도록 함

                          컨텍스트 스위칭을 담당

                          이 과정에서 커널 모드에서 사용자 모드로 전환됨

 

➡️ 스케줄러와 디스패처 모두 실행 시간이 짧도록 작성

 

 

  •  

4. 스케줄링과 디스패칭 과정

  • 스레드 A 실행 중: 시스템 호출을 통해 스레드 A가 실행되던 중, 시스템 호출 처리 루틴 또는 인터럽트 서비스 루틴이 발생합니다.
  • 스케줄링 코드 실행: 스레드 A가 블록되거나 타임 슬라이스가 소진되면, 스케줄링 코드가 실행되어 준비 리스트에서 새로운 스레드(B)를 선택합니다.
  • 디스패처 코드 실행: 선택된 스레드 B의 레지스터 값을 복구하고 스레드 A의 레지스터 값을 저장하는 컨텍스트 스위칭이 발생합니다. 그 후 스레드 B가 CPU에서 실행되기 시작합니다.

 

< 선점 스케줄링 vs 비선점 스케줄링 >

비선점 스케줄링

: 현재 실행중인 스레드를 강제로 중단시키지 않고 계속 실행하는 방식

: 실행 중인 스레드가 완료될 때까지 다른 스레드가 CPU를 사용할 수 없음!

-  스케줄링 시점

  : CPU를 더 이상 사용할 수 없게 된 경우  (예: I/O 요청으로 블록 상태로 전환될 때, sleep 등)

  : 자발적으로 CPU 양보할 때 (예: yield() 호출)

  : 종료할 때

 

 

선점 스케줄링

: 현재 실행 중인 스레드를 강제로 중단시키고, 준비 상태에 있는 다른 스레드를 실행하는 방식

-  스케줄링 시점

  : 타임슬라이스가 소진되어 타이머 인터럽트가 발생될 때

  : 인터럽트나 시스템 호출 종료 시점에서 더 높은 순위의 스레드가 대기 상태일 때

 

차이점 요약  :

  • 비선점 스케줄링: 스레드가 CPU를 자발적으로 반환하거나, I/O 요청으로 블록 상태가 될 때만 스케줄링이 발생합니다. 현재 스레드가 완료되기 전에는 다른 스레드가 CPU를 사용할 수 없습니다.
  • 선점 스케줄링: 타임 슬라이스에 기반한 스케줄링으로, 스레드가 CPU를 일정 시간 동안 사용하면 다른 스레드로 전환되며, 더 높은 우선순위를 가진 스레드가 있을 경우 현재 스레드가 강제로 중단됩니다.