프로세스 스케줄링
Intro
프로세스 스케줄링이란, 하나의 CPU 자원을 여러 프로세스가 공유하는 상황에서, CPU 자원을 효율적으로 사용하기 위해 실행할 프로세스를 선택하는 것을 말한다.
여러 프로세스가 한 시스템에서 실행될 때 크게 두 가지를 고려해 스케줄링 할 수 있다. 첫째, I/O 장치를 많이 활용하는 프로세스인가? 둘째, CPU 컴퓨팅을 많이 활용하는 프로세스인가? 이 두 가지를 고려해 각 프로세스를 효율적으로 스케줄링 할 수 있다.
다음으로, 스케줄링을 위해 사용되는 두 가지 자료구조를 살펴보자.
Ready Queue
프로세스는 상태를 가진다 프로세스가 시스템에 진입하면 ready 상태가 되고, 이때 ready 큐에 진입하게 된다. ready 큐에 있는 프로세스는 CPU 코어에서 실행되기를 wait/ready 한다.
ready 큐는 연결 리스트 형태로 구현한다. ready 큐 헤더는 첫 PCB에 대한 포인터를 가지고 있고, 각 PCB는 다음 PCB에 대한 포인터를 가지고 있다.
Wait Queue
시스템은 ready 큐 외에 wait 큐도 가지고 있다. 프로세스가 CPU 코어에 할당되면 실행/종료/인터럽트/대기를 하는데, I/O 요청과 같은 이벤트가 완료될 때까지 대기하는 동안에는 wait 큐에 삽입된다.
프로세스는 종료되는 시점까지 ready 큐와 각 요청 (I/O, Child process terminate 등)을 처리할 때 대기하는 wait 큐에 삽입, 삭제되는 과정을 반복한다.
종료시점에는 큐에서 제거되고, PCB와 자원이 해제된다.
CPU scheduling
프로세스는 ready 큐와 wait 큐 사이를 이주하는데, 이때 CPU 스케줄러의 역할이 중요하다. CPU 스케줄러는 ready 큐에서 하나의 프로세스를 선택하고, 이를 CPU 코어에 할당하는 역할을 수행한다.
I/O 장치를 많이 활용하는 프로세스의 경우 잠깐 CPU 실행 후 I/O 요청 후 wait 큐에서 대기한다. 이때 CPU 스케줄러는 다른 프로세스를 코어에 할당한다.
CPU 컴퓨팅을 많이 활용하는 프로세스의 경우 I/O 장치를 많이 활용하는 프로세스에 비해서는 많은 시간 할당되겠지만, CPU 스케줄러는 기본적으로 한 프로세스가 CPU 코어를 오랫동안 점유하는 것을 방지한다.
CPU 스케줄러는 최소 100ms마다 스케줄링 한다.
Swapping
CPU는 때로 Swapping이라는 기법을 사용하기도 하는데, 이는 메모리에 적재된 프로세스를 다시 디스크로 보내고, 디스크에 있는 프로세스를 메모리로 가져오는 기법이다.
하지만 이는 메모리가 초과 사용되어 해제되어야 할 때만 필요한 기법이다.
Context Switching (Interrupts)
인터럽트는 OS가 현재 task로부터 CPU 코어를 빼앗아 커널의 루틴을 실행하게 한다. 인터럽트가 발생하게 되면 CPU는 현재 실행중인 프로세스의 맥락을 PCB에 저장하고, 프로세스가 다시 실행될 때 이를 복구한다.