스케줄링이란?
-
스케줄링은 프로세스가 생성되어 실행될 때 필요한 시스템의 여러 자원을 해당 프로세스에게 할당하는 작업을 의미합니다. 스케쥴링은 CPU에서 자원을 효율적으로 사용하기 위한 목적으로 사용됩니다.
-
스케줄러의 종류에는 장기 스케줄러, 중기 스케줄러, 단기 스케줄러가 있습니다.
- 장기 스케줄러는 실행 중인 프로세스의 수를 제어
- 중기 스케줄러는 메모리에 너무 많은 프로그램이 동시에 올라가는 것을 조절
- 단기 스케줄러는 CPU에 프로세스를 적재하는 역할
Context Switching이란?
왜 필요한가?
IF. 컴퓨터가 매번 하나의 Task만 처리할 수 있다면?
- 해당 Task가 끝날때까지 다음 Task는 기다릴 수 밖에 없음
- 또한, 반응속도가 매우 느리고 사용하기 불편
So. 다양한 사람들이 동시에 사용하는 것처럼 하기 위해선?
- Computer multitasking을 통해 빠른 반응속도로 응답할 수 있음
- 빠른 속도로 Task를 바꿔가며 실행하기 때문에 사람의 눈으론 실시간처럼 보이게 되는 장점이 있음
- CPU가 Task를 바꿔가며 실행하기 위해 Context Switching이 필요하게 됨
개념
- 현재 진행하고 있는 Task(Process, Thread)의 상태를 저장하고 다음 진행할 Task의 상태 값을 읽어 적용하는 과정
- Task의 대부분 정보는 Register에 저장되고 PCB로 관리되어 짐
- PCB: 프로세스의 상태 정보를 저장하는 구조체
- 현재 실행하고 있는 Task의 PCB정보를 저장하게 됨(Process Stack, Ready Queue)
- 다음 실행할 Task의 PCB정보를 읽어 Register에 적재하고 CPU가 이전에 진행했던 과정을 연속적으로 수행할수 있음
PCB(Process Control Block) 구조
- Process State: 프로세스 상태(Create, Ready, Running, Waiting, Terminated)
- Process Counter: 다음 실행 명령어의 주소값
- CPU Registers: accumulator, index register, stack pointers, general purpose registers
Cost
Context Switching 발생 시 많은 Cost가 소요됨
- Cache 초기화
- Memory Mapping 초기화
- Kernel은 항상 실행되어야 함(메모리 접근을 위해)
- Process가 Thread보다 비용이 많이 듬
- Thread는 Stack 영역을 제외한 모든 메모리를 공유하기 때문에 Context Switching 발생 시 Stack 영역만 변경을 진행하면 됨
프로세서 스케줄링 기법
[개념정리]
⭐️ PCB(Process Control Block)
- 운영체제가 프로세스를 제어하기 위해 정보를 저장해 놓는 곳으로, 프로세스의 상태 정보를 저장하는 구조체이다.
- PCB는 프로세스 생성 시 만들어지며 주기억장치에 유지된다.
- 프로세스들이 교체되어 수행되고 나면 다시 다른 프로세스를 불러와야 함. 이 말은 이전 작업에 대한 내용을 기억하고 있어야 하며, 이를 위해 프로세스 단위로 정보를 저장해주는 BLOCK이 있음. 이게 바로 PCB.
⭐️ Context Switching(문맥교환)
- CPU가 이전의 프로세스 상태를 PCB에 보관하고, 또 다른 프로세스의 정보를 PCB에서 읽어 레지스터에 적재하는 과정
- 프로세스가 [준비 → 실행] or [실행 -> 준비] or [실행 -> 대기] 등으로 상태 변경될 때 발생
⭐️ 스케줄러
- 각각의 Queue에 프로세스들을 넣고 빼는 스케줄러 종류 3가지
- 장기 스케줄러
- 메모리와 디스크 사이의 스케줄 담당
- 어떤 프로세스에 각종 리소스를 할당할 지 결정
- 실행중인 프로세스의 수 제어
- 중기 스케줄러
- 여유 공간 마련을 위해 프로세스를 통째로 메모리에서 디스크로 쫓아냄(swapping)
- 메모리를 deallocate
- 실행중인 프로세스의 수 제어
- 메모리에 너무 많은 프로그램이 동시에 올라가는 것 조절
- 단기 스케줄러
- CPU와 메모리 사이의 스케줄 담당
- Ready Queue에 있는 프로세스 중 어떤 프로세스를 Running 시킬지 결정
- CPU에 프로세스 할당(dispatch)
- 프로세스의 5가지 상태
- 생성(create): 프로세스가 생성되는 중
- 실행(running): 프로세서를 차지해 명령어들이 실행되는 중
- 준비(ready): CPU가 할당되기를 기다리는 중
- 대기(waiting): I/O 완료, 시그널 수신 등 어떤 사건을 기다리는 중
- 종료(terminated): 실행이 종료
⭐️ 프로세서 스케줄링 기법
- 선점(preemptive)와 비선점(non-preemptive) 형태가 있음
비선점 스케줄링
- FCFS(First Come First Served)
- 대기 큐에 도착한 순서에 따라 CPU를 할당
- 일단 프로세스가 CPU를 차지하면 완료될 때까지 수행
- 긴 작업이 짧은 작업을 오랫동안 기다릴 수도 있으며, 중요하지 않은 작업이 중요한 작업을 기다리게 할 가능성이 존재
- 대화식 Real time 시스템에는 부적합 함
- SJF(Shortest Job First) or SPN(Shortest Process Next)
- 준비 큐에서 기다리고 있는 프로세스 중에서 가장 CPU 요구량이 적은 것을 먼저 실행시켜 주는 방식
- 평균 응답 시간을 최소화할 수 있으나, 실행 시간이 긴 프로세스가 CPU를 할당받지 못하고 계속해서 대기하는 무한 대기 현상이 발생할 수 있음
선점 스케줄링
CPU 사용권을 선점한다고 생각하면 됨. 특정 요건에 따라 각 프로세스의 요청이 있을 때 프로세스에게 분배하는 방식
- 라운드 로빈(Round-Robin/RR)
- FCFS 스케줄링 기반으로 CPU를 할당하되, 각 프로세스는 한 번에 쓸 수 있는 CPU 시간 할당량이 지나면 시간 종료 인터럽트에 의해 CPU를 뺏기게 됨
- 주로 우선순위 스케줄링(Priority scheduling)과 결합해 프로세스의 시간 할당량을 조절하는 방식으로 활용
- FCFS에서 프로세스 하나가 CPU를 독점하는 단점을 방지하지만, 문맥교환의 오버헤드를 감수해야 함
- SRT(Shortest Remaining Time)
- 준비 큐에서 완료까지 남은 CPU 요구량이 가장 짧은 것을 먼저 실행시켜주는 방식
- 실행 도중 남은 실행 시간이 더 적은 프로세스가 Ready Queue에 들어올 경우, 현재 실행 중인 것을 중단하고 새 프로세스에게 CPU를 할당함
[참고]
https://nesoy.github.io/articles/2018-11/Context-Switching
https://byeongmoo.tistory.com/4
https://velog.io/@hax0r/%EC%84%A0%EC%A0%90%EB%B9%84%EC%84%A0%EC%A0%90-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4-%EC%8A%A4%EC%BC%80%EC%A4%84%EB%A7%81