🎂 단기, 중기, 장기 스케쥴러
스케쥴러: 어떤 프로세스에게 자원을 할당하는지를 결정하는 운영체제 커널의 모듈
장기 스케쥴러 (작업 스케쥴러)
- 어떤 프로세스를 준비큐에 넣을 것인지 결정
- 디스크에서 어떤 프로그램을 가져와 커널에 등록 (준비큐에 등록)할지 결정
- 디스크에서 하나의 프로그램을 가져와 커널에 등록하면 프로세스가 됨
- 메모리에 동시에 올라가 있는 프로세스의 수 조절
- 수십초~수분 단위로 호출 > 상대적으로 속도 느린 것이 허용됨
- 현대의 시분할 시스템에서 사용되는 운영체제는 일반적으로 장기 스케쥴러 X
- 현대 운영체제는 프로세스가 시작되면 장기스케쥴러 없이 바로 그 프로세스에 메모리를 할당해 준비 큐에 넣어줌
중기 스케쥴러
단기 스케쥴러
- 준비 상태에 있는 프로세스 중 어떤 프로세스를 CPU에 할당할지 결정
- ms 단위로 빈번하게 호출 > 빠른 속도 요구됨
🎂 현대 OS에서 스케쥴러의 사용
과거) 적은 양의 메모리를 많은 프로세스에게 할당하면 프로세스당 메모리 보유량이 적어져 장기 스케쥴러가 이를 조절하는 역할로 필요
현대) 프로세스가 시작되면 장기스케쥴러 없이 바로 그 프로세스에 메모리를 할당해 준비큐에 넣어주게 됨
가상메모리시스템의 발달로 장기스케쥴러가 필요 없어짐
🎂 프로세스의 스케쥴링 상태
- New: 프로세스 생성 중
- Running: CPU 할당 받아 명령어 실행 중
- Waiting/Blocked: 프로세스가 이벤트를 대기하는 중
- Ready: 프로세스가 CPU에 스케쥴링되기를 대기중
- Terminated: 프로세스 종료
- Suspended: 프로세스 중지
- 메모리를 강제로 빼앗긴 상태
- 외부에서 다시 재개시키지 않는 이상 다시 활성화될 수 없음
- suspended ready: 준비 상태에 있던 프로세스가 디스크로 스왑아웃
- suspended blocked: 봉쇄 상태에 있던 프로세스가 디스크로 스왑아웃
🎂 Preemptive & Non-preemptive 스케쥴링
Preemptive scheduling:
- 두가지 상황에 발생:
- running > ready: timeout, interrupt
- waiting > ready: I/O or event 끝
- ready queue 상태의 변경이 필수적으로 일어남 > 우선순위를 고려해 다시 CPU 재할당 필요
- 새로 ready queue에 들어온 프로세스가 가장 효율적이라 판단되면 지금 사용되고 있는 CPU를 가져와서 할당되는 상황도 발생
- 우선순위가 높은 프로세스를 빠르게 처리
- 비교적 높은 효율성
- 오버헤드가 큼
Nonpreemptive scheduling: 비선점형
- 두가지 상황에 발생: 모두 ready queue와 관련 없는 곳으로 감 (돌발상황 X)
- running > waiting: I/O 발생
- terminates: exit
- 이미 할당된 자원을 다른 프로세스가 강탈할 수 없음
- 돌발상황 없음 > 응답시간의 예측이 쉬움
- 일괄처리에 적합
- 비효율적
Preemptive/non-preemptive 스케줄링에서 존재할 수 없는 상태:
없음
🎂 메모리가 부족할 때 프로세스의 상태
Swapping, Paging:
- 물리 메모리가 부족하면 가상 메모리를 응용하는 방식
- 저장 장치의 일부를 일시적으로 메모리 대신 사용
- 메모리보다 저장 장치에 접근하는 속도가 현저히 느림
- 시스템이 만성적으로 메모리가 부족하면 스와인/스왑아웃이 반복되는 thrashing 상태 발생
- 스와핑: 스왑영역을 물리 메모리 영역으로 되돌리는 것
- 스왑아웃: 물리 메모리 영역을 스왑 영역으로
그래도 메모리가 부족하면 시스템은 Out of Memory 상태가 됨: 가장 죽이기 좋은 프로세스 선택 (가장 큰 메모리 확보 & 시스템에 큰 영향 X)
프로세스는 suspended가 된다
suspended state: 메모리를 할당받지 못한(혹은 빼앗긴) 상태
- 메모리 부족으로 인해 메모리를 빼앗기면 메모리의 상태도 사라짐
- 메모리의 상태가 사라지면 잠시 대기 중인 프로세스는 처음부터 실행하거나 혹은 아예 실행하지 않는 문제 발생
- 이를 방지하고자 기록하고 있는 memory image를 swap device에 저장함 > swap-out
참고: