안녕하세요! 피피아노입니다 🎵
이번 포스팅에서는 오랜만에 운영체제에 대해서 다뤄볼건데 그 중에서도 CPU 스케줄링에 대해서 한번 정리를 해보려고 합니다.
본론에 들어가기에 앞서서!
운영체제가 CPU로 할당하는 대상에는 프로세스 뿐만 아니라 스레드도 포함이 되어 있지만 이번 포스팅에서는 이 두가지를 '프로세스'로 통칭해서 포스팅한다는 점 유의하고 봐주시면 감사하겠습니다.
스케줄링이란?
먼저 기본적인 부분부터 짚고 넘어가겠습니다.
모든 프로세스와 스레드는 실행되기 위해 자원을 필요로 합니다. 여기서 자원이란 프로세스가 실행되기 위해 요구되는 모든 요소를 의미하죠. 따라서 자원 배분은 매우 중요한 문제입니다.
하지만 만약 이 중요한 자원을 무작위로 배분해, 어떤 프로세스에는 100 중 80을 주고, 다른 곳에는 10이나 5만 주게 된다면 어떻게 될까요? 당연히 시스템이 제대로 작동하지 않겠죠.
그래서 운영체제는 공정하고 합리적인 방식으로 자원을 배분하게 되는데, 이를 스케줄링이라고 부릅니다. 즉, 스케줄링이란 운영체제가 자원을 공정하게 분배하는 방법이라고 정의할 수 있습니다.
이제 오늘 다룰 주제는 바로 CPU 스케줄링입니다. 자원에는 다양한 요소들이 포함되지만, 그중 CPU도 중요한 자원 중 하나입니다. 이번 글에서는 CPU 자원에 대해 집중적으로 살펴볼 것입니다.
따라서 CPU 스케줄링이란, 운영체제가 CPU 자원을 공정하고 합리적으로 분배하는 방법이라고 정리할 수 있겠죠?
공평한 스케줄링 방법?
실행 중인 프로세스는 여러 개고, CPU 자원은 한정되어 있다면 어떻게 배분하는 것이 가장 합리적일까요?
정답은 프로세스 우선순위에 맞게 배분하는 것이 가장 합리적입니다.
프로세스마다 우선순위가 다른데 이 우선순위는 PCB에 명시가 되어 있습니다.
이 우선순위를 확인하고 싶다면
$ ps -el
이 명령어를 입력하시면 아래처럼 리스트가 쭉 나오는데 그 중에서 상단에 PRI, NI 로 확인할 수 있습니다.
PRI, NI 가 낮을수록 높은 우선순위를 가지고 있습니다.
그 외에도 확인 할 수 있는 명령어들이 있는데 nice 명령어나 top 명령어를 통해서도 확인하실 수 있습니다.
Top에서는 PR, NI을 확인하시면 되는데, PR, NI 값이 낮을수록 높은 우선순위를 가집니다.
즉, 숫자가 낮을수록 CPU를 더 많이, 더 자주 할당 받아서 자주 실행되어야 하는 중요도가 높은 프로세스라고 이해하시면 됩니다.
우선순위가 높은 프로세스
자 이제 어떤 프로세스가 우선순위가 더 높은지 어떻게 확인하는지 알았는데 어떤 프로세스들이 우선순위가 더 높은 거냐??
우선순위가 높은 프로세스 유형들은 굉장히 많지만 그 중에서도 대표적인 프로세스 유형이 있습니다.
바로 I/O bound process, CPU bound process입니다.
(일반적으로 I/O bound process가 CPU bound process보다 우선순위가 높습니다)
I/O bound process와 CPU bound process
- I/O bound process는 입출력 장치를 이용하는 시간이 비교적 많은 프로세스를 의미
- CPU bound process는 입출력 장치를 이용하는 시간보다 CPU를 이용하는 시간이 더 많은 프로세스를 의미
스케줄링 큐
아까도 말했다시피 자원은 한정되어 있고 실행 중인 프로세스는 여러 개입니다. 그런데 어떤 프로세스는 메모리를 쓰고 싶을 수 있고 또 어떤 프로세스는 CPU를 더 쓰고 싶을 수 있고, 또 어떤 프로세스는 하드디스크를 쓰고 싶어 할 수도 있겠죠?
그런데 이렇게 요구사항이 다 다르면 운영체제 입장에서는 이 모두를 관리하기가 까다롭기 때문에 프로세스들의 요구사항을 일목요연하게 관리하는 방법이 필요해지게 됩니다. 그 방법이 바로 스케줄링 큐입니다.
스케줄링 큐 = 프로세스 요구사항을 관리하는 방법
조금 더 쉽게 말하자면 어떤 작업이 언제 실행될지 정하는 대기열입니다.
운영체제는 동시에 여러 프로그램을 실행해야 하지만, 실제로 CPU는 한번에 하나의 작업만 처리할 수 있습니다.
이때 스케줄링 큐가 중요한 역할을 합니다. 작업들을 순서대로 나열하고, CPU가 어떤 작업을 먼저 실행할지 결정하는 데 도움을 줍니다.
스케줄링 큐는 크게 세 가지로 나눌 수 있습니다.
- 준비 큐 (Ready Queue): 실행을 기다리는 모든 작업들이 들어가 있는 큐로, 이 큐에 있는 작업들은 바로 CPU에서 실행될 수 있는 상태입니다.
- 입출력 대기 큐 (I/O Queue): 작업이 완료되려면 가끔 입력이나 출력을 기다려야 하는 경우가 있는데 이때 작업이 입출력 장치의 처리를 기다리는 동안 머무는 큐입니다.
- 종료 큐 (Termination Queue): 작업이 완료되면 더 이상 CPU가 필요하지 않죠. 그때 작업은 이 큐로 이동하게 됩니다.
스케줄링 큐를 통해 운영체제는 CPU 사용을 최적화하고, 여러 작업들이 공정하게 처리되도록 관리할 수 있습니다.
선점형 스케줄링과 비선점형 스케줄링
선점형 스케줄링과 비선점형 스케줄링은 CPU가 작업을 처리하는 방식에서 중요한 두 가지 개념입니다. 이 두 방식은 작업들이 CPU를 어떻게 차지하고, 다른 작업으로 전환되는지에 차이가 있습니다.
선점형 스케줄링 (Preemptive Scheduling)
먼저 선점형 스케줄링은 현재 실행 중인 작업이 중간에 멈출 수 있는 방식입니다. 즉, 다른 작업이 더 중요하거나 우선순위가 높으면 현재 작업을 잠깐 멈추고 그 새로운 작업을 실행할 수 있습니다.
쉽게 말하면, 게임을 하고 있다가 갑자기 알람이 울리면, 게임을 멈추고 알람을 끄는 것과 비슷하다고 볼 수 있습니다. 알람이 더 중요해서 게임을 잠시 멈추는 거죠.
특징
- 실시간으로 우선순위가 변경될 수 있음, 중요한 작업이 오면 현재 작업을 멈추고 중요한 작업을 처리
- 멀티태스킹에 적합, 여러 작업을 빠르게 번갈아 가며 처리할 수 있음
- 응답 속도가 빠름, 중요한 작업이 즉시 실행될 수 있기 때문에, 급한 작업 처리가 효율적임
예시
운영체제의 타임 슬라이스 방식이 대표적인 방식입니다.
각 작업에 일정한 시간만큼만 CPU를 사용하게 하고, 시간이 지나면 다른 작업으로 교체합니다.
라운드 로빈 (Round Robin) 방식이나 우선순위 스케줄링이 여기에 해당됩니다.
비선점형 스케줄링 (Non-Preemptive Scheduling)
비선점형 스케줄링은 작업이 한 번 CPU를 잡으면 끝날 때까지 계속 실행되는 방식으로 중간에 멈추지 않고, 그 작업이 다 끝나야 다른 작업이 실행될 수 있습니다.
비유해서 설명하자면 식당에서 주문한 음식이 나올 때까지 기다리는 것과 같습니다. 한 번 주문을 받으면, 요리사가 다른 주문을 처리하기 전에 먼저 그 요리를 완성해야 하는 상황이라고 생각하시면 됩니다.
특징
- 작업이 끝날 때까지 방해받지 않음 한 번 CPU를 차지하면 다른 작업이 들어와도 그 작업을 계속 처리
- 작업 완료가 보장됨 한 번 시작한 작업은 끝까지 실행되므로 작업 완료를 확실히 보장 받음
- 응답 속도가 느릴 수 있음 긴 작업이 먼저 실행되면, 급한 작업이 오더라도 처리되지 않고 기다려야 함
예시
- FCFS (First Come, First Served) 방식: 먼저 온 작업을 먼저 처리하고, 그 작업이 끝날 때까지 다른 작업은 기다림
- SJF (Shortest Job First) 방식: 가장 짧은 작업부터 처리하고 끝난 후에 다른 작업을 실행함
차이점
- 선점형: 현재 작업 중간에 멈추고 다른 작업으로 전환 가능
- 비선점형: 한 번 시작된 작업은 끝날 때까지 계속 실행
이 두 가지 방식은 작업의 성격이나 우선순위에 따라 적절히 선택됩니다. 급한 작업이 많다면 선점형이 유리하고, 처리 중인 작업을 끝까지 안정적으로 실행해야 하는 경우에는 비선점형이 적합합니다.
오늘은 여기까지 :)
감사합니다.
잘못된 내용이 있거나 더 좋은 내용 피드백은 언제나 환영합니다!
궁금하신 부분은 댓글로 질문 부탁드립니다!
'CS > 운영체제' 카테고리의 다른 글
[운영체제] 프로세스의 메모리 구조 (0) | 2023.05.17 |
---|---|
[운영체제] 프로세스와 스레드 (0) | 2023.05.14 |
[운영체제] 메모리 (1) (0) | 2023.04.16 |
[운영체제] 메모리 및 성능향상 기법 (0) | 2023.03.31 |
[운영체제] 운영체제 구조와 종류 (0) | 2023.03.17 |