💡 개요
오늘은 각 프로세스마다 CPU를 할당받는 기법인 스케줄링 기법에 대해 정리해 보자.
📕 스케줄링 기법
스케줄링은 다중 프로그래밍을 가능하게 하는 운영체제의 동작 기법이다.
쉽게 말하면, 현재 대기 중인 프로세스들 중에서 어떤 프로세스가 실행될지를 결정하는 기술이다.
하나의 컴퓨터에서는 여러 프로세스가 동시에 실행될 수 있는데, 만약 사용자가 여러 프로세스를 동시에 실행하려 한다면, CPU는 어떤 프로세스를 먼저 실행할지 결정하거나, 현재 실행 중인 프로세스를 잠시 멈추고 새로 들어온 프로세스를 우선 실행할 수도 있다.
이렇게 스케줄링은 비선점형 스케줄링과 선점형 스케줄링으로 나뉜다.
🛠️ 비선점형 스케줄링
비선점형 스케줄링은 말 그대로 선점당하지 않은 것을 뜻한다.
만약 한 프로세스가 CPU를 할당받아 작업을 수행 중이라면 다른 프로세스는 CPU에 접근하지 못하는 방식이다.
이러한 스케줄링은 FCFS(First-Come-First-Served) 스케줄링과 SJF 스케줄링이 있다.
❗️ FCFS (First-Come-First-Served)
FCFS 스케줄링은 가장 간단한 스케줄링 방법으로, FIFO(선입선출) 방식과 동일하게 동작한다.
큐는 자료를 선입선출 구조로 관리하는데, 이와 같은 방식에서는 작업 시간이 적게 소요될 것 같은 프로세스가 들어와도, 해당 작업은 앞에 먼저 온 프로세스가 완료될 때까지 대기해야 한다.
즉, 작업의 예상 소요 시간이나 작업량과 관계없이, 무조건 먼저 들어온 프로세스가 CPU를 먼저 할당받는 방식이다.
❗️ SJF 스케줄링
SJF 스케줄링은 기존의 FCFS 스케줄링 방식의 문제점을 해결한 방식이다.
물론 SJF 스케줄링도 비선점형 스케줄링이기 때문에 CPU를 할당받아 작업을 수행 중인 프로세스를 건드리지는 못한다.
하지만 현재 대기 중인 프로세스들 간의 순서 교환이 이루어지는 것이다.
🛠️ 선점형 스케줄링
선점형 스케줄링은 하나의 프로세스가 현재 CPU를 할당받아 작업을 수행 중인 다른 프로세스의 자리를 빼앗을 수 있는 것이다.
이러한 선점형 스케줄링 방식에는 반드시 알아둬야 할 기술이 있다.
바로 문맥 교환 (Context Switching)이다.
문맥 교환이란, 현재 CPU에 할당되어 작업을 수행 중인 프로세스가 잠시 중단되고, 다른 프로세스가 CPU를 할당받는 상황을 뜻한다.
참고로 현재 작업을 수행중인 프로세스(CPU를 빼앗길 프로세스)의 작업 정보는 PCB(Process Control Block)에 저장된다.
❗️라운드 로빈 (Round Robin)
라운드 로빈 방식에서는 모든 프로세스가 동일한 시간만큼 CPU를 할당받는다.
이 시간을 Time Quantum (타임 퀀텀)이라고 하며, CPU를 한 번에 사용할 수 있는 최대 시간을 의미한다.
프로세스가 Time Quantum 내에 작업을 완료하면 종료되지만, 완료하지 못하면 CPU를 빼앗기고 대기 큐의 가장 뒤로 이동한다.
이를 통해 CPU 시간을 분할하여 시분할 시스템(Time-Sharing System)을 구성할 수 있다.
❗️SRT (Shortest Remaining Time First)
SRT는 예상 작업 시간이 더 짧은 프로세스가 도착하면, 현재 CPU를 사용 중인 프로세스를 중단하고 새로운 프로세스를 우선 실행하는 스케줄링 방식이다.
이를 통해 얻을 수 있는 장점은 프로세스의 평균 대기 시간이 짧아진다.
하지만 문맥 교환 또한 자주 발생하기 때문에 이로 인한 오버헤드가 크다.
뿐만 아니라 계속해서 우선순위에 밀리는 프로세스가 CPU를 할당받지 못하는 기아 현상이 발생할 수 있다.
❗️ 다단계 큐 (Multi Level Queue)
다단계 큐 스케줄링은 프로세스를 여러 개의 우선순위 큐로 나누어 관리하는 스케줄링 방식이다.
쉽게 설명하면 각각의 프로세스는 우선순위가 정해져 있다.
만약 온라인 게임이나 화상 채팅과 같은 프로세스는 실시간 응답이 중요하다.
그렇기 때문에 이러한 프로세스는 우선순위가 높은 큐에 배치된다.
하지만 파일 다운로드와 같이 실시간 응답에 중요하지 않은 작업은 우선순위가 낮은 큐에 배치된다.
쉽게 생각하면 컴퓨터를 사용하는 사용자가 눈앞에서 보고 있고, 실시간으로 응답받는 것이 적합한 작업은 우선순위가 높은 것이고, 백그라운드 작업, 즉 우리가 바라보고 있는 화면 뒤에서 묵묵히 수행되는 작업은 우선순위가 낮은 프로세스이다.
그런데 이러한 다단계 큐에도 문제가 있다.
일단 다단계 큐 또한 Time Quntaum이 정해져 있기 때문에 할당된 시간 내에 작업을 완료하지 못하면 본인이 속한 큐의 마지막 순서에 배치되게 된다.
이렇게 우선순위가 높은 프로세스가 계속해서 배치된다면 우선순위가 낮은 프로세스는 CPU를 할당받을 수 없는 기아 현상이 발생한다.
이러한 문제를 해결하기 위해 다단계 피드백 큐가 도입되었다.
❗️ 다단계 피드백 큐
다단계 피드백 큐는 현재 많은 운영체제가 사용 중인 스케줄링 방식이다.
다단계 피드백 큐의 가장 큰 특징은 Time Quantum 내에 작업을 완료하지 못한 프로세스가 원래의 우선순위 큐로 돌아가는 것이 아니라, 가장 낮은 우선순위 큐로 이동한다는 점이다.
이 방식 덕분에 우선순위가 낮은 프로세스도 결국에는 CPU를 할당받아 실행될 기회를 얻을 수 있다.
그러나 우선순위가 높은 새로운 작업들이 계속해서 들어오면, 낮은 우선순위의 프로세스는 계속 밀려나면서 실행되지 못하는 기아 현상이 발생할 수 있다.
이를 방지하기 위해 다단계 피드백 큐에서는 Aging 기법을 적용한다.
즉, 오랫동안 대기한 프로세스의 우선순위를 점진적으로 높여, 결국에는 CPU를 할당받을 수 있도록 한다.
'개발 일기' 카테고리의 다른 글
[개발 일기] 2025.03.24 - JIT 컴파일러 (0) | 2025.03.24 |
---|---|
[개발 일기] 2025.03.23 - 무중단 배포 (0) | 2025.03.23 |
[개발 일기] 2025.03.21 - 외부에서의 주입이 테스트 코드에 용이한 이유 (0) | 2025.03.21 |
[개발 일기] 2025.03.20 - 에러 로그를 찍어도 되나? (Feat : 시큐어 코딩) (0) | 2025.03.20 |
[개발 일기] 2025.03.19 - @Valid (0) | 2025.03.19 |