IT 공부/운영체제

6-2. CPU 스케줄링 기본

unnimm 2023. 4. 13. 12:46

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

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

  • 스레드를 블록 상태로 만들고 스케줄링
  • CPU 활용률 향상 목적

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

  • yield() 시스템 호출 등을 통해 스레드가 자발적으로 CPU 반환
  • 커널은 현재 스레드를 준비 리스트에 넣고, 새로운 스레드 선택
  • CPU의 자발적 양보

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

  • 균등한 CPU 분배 목적

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

  • 인터럽트 서비스 루틴에서 현재 스레드를 강제 중단시켜 준비 리스트에 넣고
  • 높은 순위의 스레드를 깨워 스케줄링
  • 우선순위를 지키기 위한 목적

CPU 스케줄링 코드의 위치와 실행 시점

  • 스케줄링 담당하는 커널 스레드나 프로세스가 있는가? 없다.
  • 스케줄링 코드는 어디에 위치하는가? 커널 내 함수로
    • 스케줄링 코드는 커널 코드의 일부
    • 별도로 실행되는 프로세스나 스레드의 형태가 아니다.
    • 커널은 마치 응용프로그램을 컴파일(빌드)하여 완성한 바이너리 모듈 같다. 메모리에 그대로 적재되는 한 덩어리의 바이너리
  • 스케줄링 코드가 실행되는 시점
    • 시스템 호출이나 인터럽트 서비스 루틴이 끝나는 마지막 단계에서 실행
  • 디스패쳐(dispatcher) 코드 실행
    • 디스패쳐 코드란 컨텍스트 스위칭을 실행하는 커널 코드
      • 스케줄러에 의해 선택된 스레드를 CPU가 실행하도록 하는 작업
      • 커널 모드에서 사용자 모드로 전환
      • 새로 선택된 스레드가 이전에 중단된 곳에서 실행하도록 점프
    • 스케줄러와 디스패쳐 모두 실행 시간이 짧도록 작성

CPU 스케줄링과 디스패치(dispatch)

CPU 스케줄링과 디스패치(dispatch)


선점 스케줄링과 비선점 스케줄링

실행중인 스레드의 강제 중단 여부에 따른 CPU 스케줄링 타입

  • 비선점 스케줄링(non-preemptive scheduling)
    • 현재 실행중인 스레드를 강제로 중단시키지 않는 타입
      • 일단 스레드가 CPU를 할당 받아 실행을 시작하면, 완료되거나 CPU를 더 이상 사용할 수 없는 상황이 될 때까지 스레드 강제 중단시키지 않고 스케줄링도 하지 않는 방식
    • 스케줄링 시점
      • CPU를 더 이상 사용할 수 없게 된 경우 : I/O로 인한 블록 상태, sleep
      • 자발적으로 CPU 양보할 때
      • 실행 중 종료될 때
  • 선점 스케줄링(preemptive sheduling)
    • 현재 실행중인 스레드를 강제 중단시키고 다른 스레드 선택, CPU 할당
    • 스케줄링 시점
      • 타임슬라이스가 소진되어 타이머 인터럽트가 발생될 때
      • 인터럽트나 시스템 호출 종료 시점에서, 더 높은 순위의 스레드가 준비 상태일 때

오늘날 범용 운영체제

  • 선점 스케줄링 타입 사용

비선점 스케줄링과 선점 스케줄링 비교


기아와 에이징

기아

  • 스레드가 스케줄링에서 선택되지 못한 채 오랫 동안 준비 리스트에 있는 상황
  • 사례
    • 우선순위를 기반으로 하는 시스템에서, 더 높은 순위의 스레드가 계속 시스템에 들어오는 경우
    • 짧은 스레드를 우선 실행시키는 시스템에서, 자신보다 짧은 스레드가 계속 도착하는 경우
  • 스케줄링 알고리즘 설계 시 기아 발생을 면밀히 평가
    • 기아가 발생하지 않도록 설계하는 것이 바람직함.

에이징(aging)

  • 기아의 해결책
  • 스레드가 준비 리스트에 머무르는 시간에 비례하여 스케줄링 순위를 높이는 기법
    • 오래 기다릴 수는 있지만 언젠가는 가장 높은 순위에 도달하는 것을 보장