이 글은 프로세스 등의 이해가 필요합니다.
CPU라는 빠른 연산장치를 이용하는데 하나의 프로그램만 돌려봅시다.
CPU에서 돌아가는 하나의 프로그램이 가끔은 화면에 무엇인가를 출력하기도 하고, 가끔은 특정 파일에 접근하는 등 I/O 작업도 수행할 것입니다.
I/O 작업을 수행할 경우 CPU는 I/O 작업이 끝나길 기다려야 합니다.
이 말은 CPU라는 빠른 연산장치를 제대로 활용할 수 없다는 것을 의미합니다.
CPU Burst 시간을 표로 확인하면 다음과 같습니다.
표를 보면 CPU를 오래 사용하는 작업은 그렇게 많지 않습니다.(= I/O 작업을 기다리는 시간이 더 많습니다.)
이런 상황에서 멀티 프로그래밍의 아이디어가 나옵니다.
먼저 메모리에 여러 프로그램을 올리자. 그리고 현재 실행중인 프로세스가 I/O 작업을 수행하면 CPU가 놀게되니까, 현재 실행중이지 않고 메모리에 올라와 있는 여러 프로세스 중 하나를 선택해서 실행시키자.
멀티 프로그래밍의 아이디어는 정말 좋은 생각인것 같습니다.
근데 마지막에 "선택해서 실행시키자."라는 말이 나왔는데,
어떻게 선택하고 어떻게 실행시킬까요?
이는 운영체제의 CPU 스케줄러가 처리해줍니다.
운영체제에서 CPU에서 실행할 프로세스를 선택하는 CPU 스케줄러와,
운영체제에서 CPU에서 프로세스를 실행하도록 CPU에 올려주는 디스패처에 대해 알아봅시다.
앞서 설명한 아이디어를 좀 있어보게 말하면 다음과 같습니다.
CPU가 유휴 상태가 되면 레디큐에서 프로세스를 하나 선택해서 실행시키자.
레디큐는 꼭 FIFO 큐로 구현될 필요가 없습니다.
다른 글에서 확인할 CPU 스케줄링 알고리즘에 따라 레디큐는 FIFO 큐, 트리, 우선순위 큐 등등으로 구현될 수 있습니다.
메모리에 올라와 있는 프로세스 중 하나를 선택해야 하는데 마구잡이로 프로세스를 선택할 수는 없습니다. 모든 프로세스들이 균등하게 CPU를 활용할 수 있도록 어떤 규칙을 세워야 하는데, 이런 규칙을 스케줄링 알고리즘이라 합니다.
CPU 스케줄러는 스케줄링 알고리즘을 정하고 프로세스를 선택합니다.
스케줄링 알고리즘은 굉장히 긴 내용이기 때문에 다른 글에서 다루도록 하고,
CPU가 어떤 프로세스를 선택할지(=스케줄링할지) 결정해야 하는 상황을 먼저 알아봅시다.
CPU가 스케줄링을 결정해야 하는 4가지 상황을 프로세스의 상태로 알아봅시다.
1 ~ 3번의 경우는 이해가 가지만
4번의 경우 왜 스케줄링을 결정해야 하는 상황인지 이해가 안가실 수 있습니다.
만약 Wait에서 Ready 상태로 전환되는 프로세스가 우선순위가 정말 높고, 실행이 안되면 전체 시스템에 영향을 줄 수 있는 프로세스라고 생각해봅시다.
이 경우에는 해당 프로세스를 스케줄링하여 실행시키는 것을 고려해야 합니다.
그래서 4번의 경우도 CPU가 스케줄링을 결정해야하는 상황입니다.
다시 그림을 확인해봅시다.
1,2번의 경우 CPU 스케줄러에게 선택의 여지는 없습니다.
CPU를 사용하던 프로세스가 종료되었거나 대기큐로 들어가 버렸기 때문에 레디큐에 프로세스가 하나라도 존재할 경우 실행시켜야 합니다.
3,4번의 경우 CPU 스케줄러에게 선택의 여지가 있습니다.
3번의 경우 인터럽트가 발생한 경우 더 우선순위가 높은 다른 프로세스를 선택할 수 있습니다.
4번도 우선순위를 고려해서 선택할 수 있습니다.
1,2번의 경우에서만 스케줄링이 발생하는 것을 비선점 스케줄링이라 말합니다.
즉 실행중인 프로세스가 CPU를 자발적으로 나오지 않는 이상 CPU를 계속 사용하게되는 스케줄링입니다.
따라서 매우 단순하지만 실시간 시스템과 같이 복잡한 환경에서는 비효율적인 스케줄링 방법입니다.
반면에 1~4 모든 경우에서 스케줄링이 발생하는 것을 선점 스케줄링이라 말합니다.
오늘날 Windows, macOS, Linux 및 Unix를 포함한 모든 운영체제들은 선점 스케줄링 알고리즘을 사용합니다.
스케줄링 알고리즘에 대한 내용은 많기 때문에 다른 글에서 다루도록 하겠습니다.
디스패처는 CPU 코어의 제어을 CPU 스케줄러가 선택한 프로세스에게 주는 모듈을 말합니다.
디스패처는 운영체제의 CPU 스케줄링 기능에 포함된 하나의 요소입니다.
CPU 코어의 제어를 주기 위해서는
현재 실행중인 CPU의 상태를 PCB에 저장하고
선택된 프로세스의 상태를 CPU에 복원해주어야 합니다.
즉 컨텍스트 스위칭을 해주어야 합니다.
디스패처가 컨텍스트 스위칭을 해주는 역할을 담당합니다.
디스패치는 그림과 같이 프로세스의 상태를 저장하고 복원합니다.
P0을 멈추고 P1을 실행시키는데 중간 과정이 디스패치가 처리하면서,
P1의 실행까지 시간이 지연됩니다.
이 시간을 디스패치 지연시간(Dispatch latency)이라고 합니다.
이런 지연시간은 작을수록 좋습니다.
즉 디스패처의 동작속도가 빠를수록 좋습니다.