프로세스는 생성, 준비, 실행, 대기와 같은 여러 상태를 거치며 작업이 이루어진다는 것을 앞에서 살펴보았다. CPU 스케줄러는 프로세스가 생성된 후 종료될 때까지 모든 상태 변화를 조정하는 일을 한다.
스케줄링은 여러 프로세스의 상황을 고려하여 CPU와 시스템 자원을 어떻게 배정할지 결정하는 일을 말한다.
CPU 스케줄러도 관리의 범주를 나누어 스케줄링을 한다. CPU 스케줄링은 규모에 따라 고수준 스케줄링, 중간 수준 스케줄링, 저수준 스케줄링으로 구분된다.
가장 큰 틀에서 이루어지는 CPU 스케줄링을 고수준 스케줄링high level scheduling 또는 장기 스케줄링long-term scheduling, 작업 스케줄링job scheduling이라고 한다.
많은 작업을 동시에 하면 시스템에 과부하가 걸려 작업이 원활하게 이루어지지 않는다. 이는 식당 관리자가 주방 상황을 고려하지 않고 무조건 손님을 많이 받으면 요리를 제공하는데 문제가 생기는 것과 같다.
고수준 스케줄링은 시스템 내의 전체 작업 수를 조절하는 것을 말한다. 여기서 작업은 운영체 제에서 다루는 일의 가장 큰 단위로, 1개 또는 여러 개의 프로세스로 이루어진다.
고수준 스케줄링 단계에서는 어떤 작업을 시스템이 받아들일지 또는 거부할지를 결정한다. 일단 작업이 시작되면 시스템 자원을 사용하기 때문에 기존 작업에 영향을 미친다. 작업 요청이 오면 스케줄러가 시스템의 상황을 고려하여 작업을 승인할지, 거부할지를 결정하므로 고수준 스케줄링을 승인 스케줄링admission scheduling이라고도 한다. 고수준 스케줄링에 따라 시스템 내에서 동시에 실행 가능한 프로세스의 총개수가 정해진다.
고수준 스케줄링과 반대로 가장 작은 단위의 스케줄링을 저수준 스케줄링low level scheduling이라고 한다.
CPU 스케줄러 입장에서 저수준 스케줄링은 어떤 프로세스에 CPU를 할당할지, 어떤 프로세스를 대기 상태로 보낼지 등을 결정하는 일이다.
준비 상태에 있는 프로세스 중 하나를 골라 실행 상태로 보내고, 실행 상태에 있는 프로세스를 대기 상태로 보내며, 대기 상태의 프로세스를 준비 상태로 보내는 것을 예로 들 수 있다.
앞서 학습했던 프로세스 상태에 관한 내용은 대부분 저수준 스케줄링에 해당한다. 저수준 스케줄링은 아주 짧은 시간에 일어나기 때문에 단기 스케줄링short-term scheduling이라고 부른다.
중간 수준 스케줄링middle level scheduling은 고수준 스케줄링과 저수준 스케줄링 사이에 일어나는 스케줄링이다. 고수준 스케줄링은 프로세스를 활성화할지 말지를 결정하여 전체 프로세스의 수를 조절하는 방식이지만, 프로세스가 활성화된 후에도 여러 가지 사정으로 시스템에 과부하가 걸릴 수 있다.
중간 수준 스케줄링은 중지suspend와 활성화active로 전체 시스템의 활성화된 프로세스 수를 조절하여 과부하를 막는다. 즉 일부 프로세스를 중지 상태로 옮김으로써 나머지 프로세스가 원만하게 작동하도록 지원한다. 이는 프로세스의 상태 중 보류 상태에 해당하며, 저수준 스케줄링이 원만하게 이루어지도록 완충하는buffer 역할을 한다.
고수준 스케줄링에서는 전체 시스템의 부하를 고려하여 작업을 시작할지 말지를 결정한다. 이 결정에 따라 시스템의 전체 프로세스 수가 결정되는데 이를 멀티프로그래밍 정도degree of multiprogramming라고 한다. 고수준 스케줄링은 메인프레임과 같은 큰 시스템에서 규모가 큰 일괄 작업을 처리할 때 사용된다.
시스템의 부하를 조절하려면 고수준 스케줄링 대신 중간 수준 스케줄링을 고려해야 한다. 시스템에 과부하가 걸려서 전체 프로세스 수를 조절해야 한다면 이미 활성화된 프로세스 중 일부를 보류 상태로 보낸다. 보류된 프로세스는 처리 능력에 여유가 생기면 다시 활성화된다.
저수준 스케줄링에서는 실제 작업이 이루어진다. 오늘날의 CPU 스케줄러는 대부분 중간 수준 스케줄링과 저수준 스케줄링으로 구성되어 있다.
CPU 스케줄러는 필요에 따라 준비 상태에 있는 프로세스를 실행 상태로 옮기기도 하고, 대기 상태로 보내기도 하며, 타임아웃으로 준비 상태로 돌려보내기도 한다. 준비 상태에 있는 프로세스 중 어떤 프로세스를 선택할지, 어떤 기준에 따라 타임 슬라이스를 정할지 등은 시스템의 성능에 많은 영향을 미친다.
그렇다면 저수준 스케줄러가 어떤 기준에 따라 프로세스를 선택하고, 그 선택이 시스템에 어떤 영향이 미치는지를 살펴보자. 이후의 CPU 스케줄러는 특별한 명시가 없는 한 저수준 스케줄러를 의미한다.
CPU 스케줄링의 원래 목적은 모든 프로세스가 공평하게 작업하도록 하는 것이다. 특정 프로세스에 편중되지 않게 골고루 자원을 배분하기 위해 공평성을 유지하면서도 안정적으로 작동 해야 한다. 즉 특정 프로세스가 시스템 자원을 독점하거나 파괴하는 것을 막기 위해 중요도에 따라 우선순위를 배정해야 한다.
또한 시스템 자원을 효율적으로 배분하여 전체적인 시스템의 성능도 높여야 한다. 확장성도 고려해야 하는데, 확장성은 프로세스의 개수가 증가해도 성능에 갑작스러운 변화가 없어야 함을 의미한다.
CPU 스케줄링의 목적을 정리하면 다음과 같다.
보통은 모든 프로세스가 공평하게 CPU를 할당받아야 한다. 그러나 시스템의 안정성과 효율성을 높이기 위해 특정 프로세스를 먼저 처리해야하는 경우가 있으므로 CPU 스케줄러는 일정 부분 공평성을 희생해야한다.
일반적으로 운영체제 프로세스는 일반 프로세스보다 우선적으로 CPU를 배정받는다. 또한 일반 프로세스 간에도 우선순위에 따라 CPU 배정 순서가 달라진다.
CPU 스케줄러가 어떤 프로세스에 우선적으로 CPU를 할당할지 결정할 때 고려해야 할 사항들에 대해 알아보자.
선점형 스케줄링(preemptive scheduling)과 비선점형 스케줄링(non-preemptive scheduling)은 다음과 같이 정의할 수 있다.
선점형 스케줄링에서는 운영체제가 필요하다고 판단하면 실행 상태에 있는 프로세스의 작업을 중단시키고 새로운 작업을 시작할수 있다. 선점형 스케줄링 방식의 대표적인 예로는 인터 럽트 처리를 들 수 있다. CPU가 인터럽트를 받으면 현재 실행 중인 작업을 중단하고 커널을 깨워서 인터럽트를 처리시키며, 인터럽트 처리가 완료되면 원래의 작업으로 돌아간다.
선점형 스케줄링은 문맥 교환같은 부가적인 작업으로 인해 낭비가 생기는 것이 단점이다. 그러나 하나의 프로세스가 CPU를 독점할 수 없기 때문에 빠른 응답 시간을 요구하는 대화형 시스템이나 시분할 시스템에 적합하다. 대부분의 저수준 스케줄러는 선점형 스케줄링 방식을 사용한다.
비선점형 스케줄링에서는 어떤 프로세스가 실행 상태에 들어가 CPU를 사용하면 그 프로세스가 종료되거나 자발적으로 대기 상태에 들어가기 전까지는 계속 실행된다.
비선점형 스케줄링은 선점형 스케줄링보다 스케줄러의 작업량이 적고 문맥 교환에 의한 낭비도 적다. 그러나 CPU 사용 시간이 긴 프로세스 때문에 CPU 사용 시간이 짧은 여러 프로세스가 오랫동안 기다리게 되어 전체 시스템의 처리율이 떨어진다. 비선점형 스케줄링은 과거 일괄 작업 시스템에서 사용하던 방식이다.
선점형 스케줄링 방식의 스케줄러에도 비선점형 프로세스가 있을 수 있다. 예를 들어 시스템을 백업하는 프로세스는 비선점형으로 작동한다. 비선점형과 선점형 프로세스가 혼재하는 경우에는 비선점형 프로세스의 중요도를 매우 낮게 설정하여 선점형 프로세스에 영향을 덜 미치도록 한다.
프로세스의 우선순위가 없다는 것은 모든 프로세스의 중요도가 같다는 의미이다. 우선순위가 없는 모든 프로세스는 준비 상태에 한 줄로 서서 순차적으로 실행되는데, 이는 준비 상태의 큐가 하나인 것과 마찬가지이다.
대부분의 CPU 스케줄러는 우선순위를 사용한다. 우선순위가 있다는 것은 프로세스의 중요도 가 다르다는 의미이다. 레스토랑에서도 예약 손님은 일반 손님보다 우선순위가 높다. 예약을 했는데도 일반 손님처럼 줄을 서야 한다면 굳이 예약을 할 필요가 없을 것이다.
프로세스는 크게 커널 프로세스와 일반 프로세스로 나뉜다. CPU 스케줄러는 각 프로세스에 우선순위를 부여하는데 커널 프로세스의 우선순위가 일반 프로세스보다 높다. 만약 커널 프로세스와 일반 프로세스를 같은 우선순위로 처리한다면 커널과 관련된 중요한 프로세스의 작업이 제대로 이루어지지 않을 것이다.
우선순위가 높다는 것은 더 빨리 자주 실행된다는 의미이다. 준비 상태의 커널 프로세스와 일반 프로세스가 하나씩 있다면 커널 프로세스의 우선순위가 더 높기 때문에 커널 프로세스가 먼저 실행되며 작업이 끝날 때까지 계속 CPU를 사용한다. 또한 같은 커널 프로세스라 하더라도 더 중요한 커널 프로세스는 우선순위가 높고, 덜 중요한 프로세스는 우선순위가 낮다.
일반 프로세스도 중요도가 각각 다르기 때문에 우선순위가 서로 다르다. 예를 들어 워드프로세서와 비디오 플레이어 중에서는 비디오 플레이어의 우선순위가 높다. 워드프로세서의 경우 사람이 타이핑하는 속도가 CPU의 연산 속도보다 느리기 때문에 천천히 실행되어도 문자 입력 처리가 가능하다. 그러나 비디오 플레이어는 실시간으로 데이터를 읽어와 영상과 소리를 출력해야 하기 때문에 자주 실행되지 않으면 화면이 끊긴다.
일반 프로세스의 우선순위는 사용자가 조절할 수 있다. 유닉스 운영체제에서는 nice
명령어 를 사용하여 프로세스의 우선순위를 조절할 수 있다. 단, 관리자administrator만 우선순위를 높일 수 있고 일반 계정은 우선순위를 낮추는 것만 가능하다.
윈도우 운영체제의 경우 작업 관리자에서 프로세스의 우선순위를 조절하는 것이 가능하다.