[운영체제(OS)] CPU스케쥴링(CPU Scheduling) - 1
resilient
·2021. 12. 31. 01:24
0. CPU 스케쥴링을 공부하기 전, 스케쥴러에 대해서 알아보고 가겠습니다.
우리가 흔히 얘기하는 스케쥴러 는 short term scheduler을 의미합니다. 그럼 long term scheduler도 있을까요?
물론입니다. 예전에는 스케쥴러를 long term , short term 스케쥴러가 나눠져 있었습니다.
그럼 long term은 왜 사용하지 않고 short term 만 남았는지 한 번 알아보겠습니다.
스케쥴러는 Long-term Scheduler, Short-term Scheduler, Medium-term Scheduler, 3개로 나눌 수 있는데요,
먼저 Long-term scheduler 에 대해서 알아보겠습니다.
Long-term scheduler 는 하드 디스크에서 메모리로 프로세스를 Load 해서 ready 상태로 만들어 줄 프로세스를 선별하는 역할을 합니다.
예를 들어서 지금 수행해야하는 프로그램이 10개라고 가정을 해봤을 때, 메모리에는 5개밖에 올리지 못하는 상황이라면 10개 중 5개를 골라서 메모리에 올려주는 녀석들이죠.
다음은 Short-term scheduler 입니다. Process Scheduling 이라고도 하죠.
Short-term scheduler 는 ready 상태가 되어 Ready queue에 들어온 녀석 들 중 CPU를 차지할 프로세스들을 선택합니다.
예를 들어보면, Short-term scheduler 는 Long-term scheduler에 의해 선별된 5개의 프로세스 중 실제로 CPU를 차지할 녀석들을 선별하는 역할을 합니다.
우리가 이번시간에 자세히 다룰 CPU Scheduling이 바로 Short-term scheduler 라고 할 수 있습니다.
그럼 왜 Long-term(장기) Short-term(단기) Scheduler라고 할까요?
운영체제 정리를 시작하고 계속 강조하지만, CPU는 놀면 안됩니다!
CPU는 A 프로세스를 처리하다가 잠깐 쉬는 시간이 생기면 B 프로세스를 바로바로 실행 해 줘야 합니다. 그러다가 또 I/O가 입력되면 다시 프로세스를 이어서 실행하기 위해 CPU로 불러오겠죠?
즉, Short-term Scheduler는 최소 100ms 마다 수행되고 짧은 텀마다 계속계속 수행되기 때문에 단기라고 부릅니다.
반면, Long-term Scheduler는 메모리로 올린 프로세스가 끝나야 새로 다시 채워주고 프로세스가 너무 많으면 때에 따라 채우지 않고 기다리는 시간이 길기 때문에 장기라고 부르는 것이죠.
Long-term Scheduler가 오늘날 사용되지 않는 이유는 뭘까?
위에서 언급했듯이, Long-term Scheduler는 오늘날 사용되지 않습니다. 또한 스케쥴러 라고 하면 CPU Scheduling 하고 같은 의미다라는 글도 가끔 보이는 군요. 이유가 뭘까요?
10 개의 프로세스 중 5개를 골라서 메모리에 채워주는게 Long-term Scheduler라고 했는데 요즘은 10개 중 10개를 바로바로 올려버립니다. 어떻게 가능할까요?
virtual memory가 가능해졌기 때문인데요, 가상메모리는 메모리가 무한대로 있는 것처럼 운영체제가 만들어줍니다. 10개 중 몇 개를 선택할 필요가 없어졌기 때문에 Long-term Scheduler가 소용 없어지고 Long-term Scheduler가 있어야 Short-term Scheduler도 있는 건데, Long-term Scheduler가 없으니까 그냥 CPU Scheduling이라고 하는 것이죠.
그럼 마지막으로 Medium-term Scheduler 는 뭘까요?
Medium이라서 Long 과 Short 사이에 생긴 건 아니고, 제일 마지막에 생겼지만 지금 Long-term Scheduler 처럼 요즘에는 잘 사용하지 않습니다.
위에서 들었던 예시를 가져와서, Long-term Scheduler가 10개의 프로세스 중 메모리에 5개를 올렸다고 가정해보겠습니다.
엇 근데 CPU에서 5개를 수행하려고 했는데 감당하기가 힘들어 보입니다. 5개 중 하나를 빼주면 나머지 프로세스들은 잘 돌아갈 것 같은데.... 그럼 하나는 어떻게 골라서 빼줘야 할까요? 고르는 결정을 바로 Medium-term Scheduler가 수행합니다. 우선순위가 낮은 프로세스나 일정 시간 활성화되지 않았던 프로세스들을 빼주는 것이죠.
여기서 빼는 결정과정을 swap in ( 메모리가 남았을 때 더 가져오는 과정)/ swap out (메모리가 부족하면 더 빼는 과정)이라고 합니다.
1. 그럼 이제, CPU 스케쥴링 이란?
프로세스가 CPU를 사용할 때 한 프로세스가 아닌 여러 프로세스를 동시에 실행시켜 관리한다는 사실은 이전 게시물에서 정리해봤습니다.
CPU스케쥴링은 여러 프로세스들의 실행 순서를 어떻게 정하고 얼만큼의 시간일 할당할 것인가를 결정하는 과정입니다.
스케쥴링 과정을 이해하기 위해서는 아래 두가지 개념을 알아야 합니다. 두 개념의 차이는 CPU 사용권을 넘겨주는 방법에 있습니다.
- preemptive(선점) scheduling
- 실행중인 작업이 끝나지 않아도 운영체제에 의해 강제로 CPU 사용권을 빼앗는 방식입니다.
- non-preemptive(비선점) scheduling
- 실행 중인 작업이 끝나야만 CPU 사용권을 넘겨주는 방식입니다.
이전에 다뤘던 프로세스 상태에 대한 내용을 다룰 때 아래와 같은 그림을 사용했었습니다.
위 그림에서 볼 수 있는 스케쥴링은 다음 네 가지 경우가 있습니다.
- 프로세스가 running 에서 waiting 상태로 스위칭 될 때
- 프로세스가 running 에서 ready 상태로 스위칭 될 때
- 프로세스가 waiting 에서 ready 상태로 스위칭 될 때
- 프로세스가 종료되었을 때
스케쥴링이 첫 번째와 네 번째 경우에만 일어났을 때 non-preemptive 스케쥴링 이라 하고 non-preemptive 스케쥴링은 프로세스가 대기 상태에 들어가거나 종료되지 않고는 스위칭이 발생하지 않습니다.
스케쥴링이 위의 네 가지 경우 모두에 일어난다면 preemptive 스케쥴링이라고 하고 preemptive 스케쥴링에서는 위에서 언급했듯이 운영체제가 프로세스에 할당되었던 CPU를 자체적으로 빼앗아 올 수 있습니다.
2. dispatcher 란?
dispatchers는 cpu의 제어권을 스케쥴링으로 선택된 프로세스에게 넘겨주는 CPU 코어에서 제공해주는 모듈입니다.
dispatcher의 기능은 context switching을 해주고 kernel을 user mode로 전환해주고 다음 프로그램의 시작을 위해 해당 주소로 이동하는 역할을 합니다.
dispatcher는 위에서 언급한 short term scheduler에 의해서 수행되기 때문에 context switching이 일어날 때마다 실행되기 때문에 가능한 빨라야 합니다.
dispatcher가 실행 중인 프로세스를 멈추고 다른 프로세스에게 cpu의 제어권을 넘기는 시간을 dispatch latency라고 합니다.
3. CPU burst vs I/O burst
프로세스는 CPU burst 와 I/O burst 가 왔다 갔다 바뀌면서 프로그램을 실행합니다.
CPU burst 는 말그대로 CPU 명령을 실행하는 것을 의미하고 I/O burst 는 I/O를 요청한 다음 기다리는 시간의 의미합니다.
프로세는 CPU bound process 와 I/O bound process 두 종류로 나눌 수 있습니다.
CPU bound process는 말 그대로 CPU에서 처리해야 하는 일이 많은 프로세스를 의미하고 I/O bound process는 I/O 작업에서 필요한 시간이 많은 프로세스를 의미하죠.
두 종류의 차이에 따라 스케쥴링을 할 때 영향을 미치기도 합니다.
4. 정리
오늘은 스케쥴러가 무엇인지, CPU Scheduling 이 무엇인지에 대해서 알아봤습니다.
다음 포스팅에서는 이제 CPU Scheduling을 하는 기준이 무엇인지, 어떻게 하는지에 대해 알아보도록 하겠습니다.
감사합니다.
'CS & Network > 운영체제(OS) & 컴퓨터구조' 카테고리의 다른 글
[운영체제(OS)] 동기화(Synchronization) 와 임계구역 문제(Critical Section Problem) - 2 (0) | 2022.01.10 |
---|---|
[운영체제(OS)] 동기화(Synchronization) 와 임계구역 문제(Critical Section Problem) - 1 (0) | 2022.01.09 |
[운영체제(OS)] 쓰레드(Thread)와 멀티 쓰레드 프로그래밍(Multi Thread Programming) 이란? (1) | 2021.12.22 |
[운영체제(OS)] 프로세스와 컨텍스트 스위칭(Context Switching)이란? (0) | 2021.12.15 |
프로세스 메모리 구조 에서의 스택(Stack) 이란? (0) | 2021.12.05 |