현대의 컴퓨터는 한번에 여러 프로세스가 돌아가는 것을 허용합니다. 하지만 실제로 CPU 코어는 한번에 하나의 프로세스만 실행할 수 있습니다. 코어가 여러개여도 코어의 개수에 비해 실행해야할 프로세스는 많습니다. 이 때 단일 코어를 기준으로, 어떠한 프로세스가 코어에 할당이 될 지를 결정하는 과정이 필요한데 이 과정을 스케쥴링이라고 합니다. 스케쥴링은 또한 선점형과 비선점형으로 나뉘어집니다. 그 이전에 선점이란게 무엇인지 알아야 합니다.

  • 선점(preemptive)
    preemptive를 영어 사전에서 검색하면 다음과 같이 나옵니다.

    PreemptiveDefinition

    즉, 선점이란 컴퓨터의 자원(스케쥴링에서는 주로 CPU 사이클을 뜻합니다)을 우선적으로 차지할 수 있는 권한을 뜻합니다. 다만 여기서 오해할 수 있는데 선점권을 가진 것은 실행 대기중인 프로세스입니다. 현재 CPU에서 실행중인 프로세스를 A라고 하고, 실행을 대기중인 프로세스가 있어서 이를 B라고 한다면 B프로세스가 A프로세스의 실행을 중단시키고 CPU를 차지할 수 있습니다. 물론 아무런 기준 없이 교환이 일어난다면 문맥교환 비용이 굉장히 많이 일어날 것이므로, 기본적으로는 운영체제가 자원을 관리하다가 프로세스의 요청을 받으면 특정 조건을 확인 후 자원을 할당하고 허용한 만큼만 사용후 다시 자원을 반납하는 식으로 동작하게 됩니다.

    반면에 비선점 방식이라면 프로세스가 자발적으로 자원을 반납하기 전까지는 문맥교환이 일어나지 않습니다. 자발적인 자원 반납은 프로세스가 작업을 마치고 종료하거나, I/O 요청을 위해 대기상태로 들어갈 때 일어납니다.

  • 선점형 스케쥴링 vs 비선점형 스케쥴링
    선점형 스케쥴링과 비선점형 스케쥴링을 서로 비교하면 다음과 같습니다.

    1. 선점형 스케쥴링은 프로세스에게 한번 실행될 때 제한된 시간을 할당합니다. 그렇기 때문에 프로세스가 작업을 수행하는 도중에 자원을 반납하고 대기 상태에 진입할 수 있습니다. 하지만 비선점형 스케쥴링은 프로세스가 종료되거나 I/O를 수행하기 위해 자발적으로 대기상태에 들어가지 않는 한 자원을 반납하지 않습니다.

    2. 선점형 스케쥴링은 프로세스가 실행되는 중에 인터럽트를 허용합니다. 하지만 비선점형 스케쥴링은 인터럽트를 허용하지 않습니다.

    3. 선점형 스케쥴링은 프로세스의 우선순위에 따라 스케쥴링을 하게됩니다. 따라서 우선순위가 낮은 프로세스는 자원을 할당받지 못하게 되는 기아 현상(starvation)이 발생할 수 있습니다. 비선점형 스케쥴링은 수행시간이 긴 프로세스가 자원을 점유하게 되면 그 이후에 실행되어야 할 프로세스들이 기아 상태에 빠지게 됩니다.

    4. 선점형 스케쥴링은 문맥 교환이 자주 일어나기 때문에 오버헤드가 있습니다. 비선점형 스케쥴링은 필수적인 문맥교환 외에 추가적인 오버헤드가 없습니다.

    5. 선점형 스케쥴링은 우선순위가 높은 프로세스를 먼저 처리하도록 할 수 있는 유연성을 가지지만, 비선점형 프로세스는 그것이 불가능합니다.

    6. 선점형 스케쥴링은 공유 자원에 접근하고 있는 프로세스가 여러개 존재할 수 있기 때문에 이를 적절히 관리하는 비용이 많이 소요되지만, 비선점형 스케쥴링은 비교적 그런 부분에서 자유롭습니다.

    이러한 차이들 때문에 선점형 시스템은 우리가 주로 쓰는 대화형 시스템에 많이 쓰이고, 비선점형 스케쥴링은 배치 시스템에 많이 쓰입니다.

참조 링크
위키백과-스케쥴링
Preemptive and Non-Preemptive Scheduling