선점형 스케쥴링(Preemptive Scheduling)과 협조적 스케줄링(Cooperative Scheduling) 비교
선점형 스케줄링 모델과 협조적 스케줄링 모델은 여러 작업이 프로세서나 하드웨어 스레드 같은 컴퓨팅 리소스를 공유하도록 해주는 두 가지 일반적인 방법이다.
선점형 스케줄링 및 협조적 스케줄링
선점형 스케줄링은 지정된 시간 동안 모든 작업이 번갈아 가면서 컴퓨팅 리소스에 대한 독점적 액세스를 제공하는 우선 순위 기반의 라운드 로빈 메커니즘이다.
선점형 스케줄링은 Windows와 같은 멀티태스킹 운영 체제에서 일반적이다.
협조적 스케줄링은 작업이 완료될 때까지 또는 태스크에서 리소스에 대한 액세스를 양보할 때까지 모든 작업에 컴퓨팅 리소스에 대한 독점 액세스를 제공하는 메커니즘이다.
동시성 런타임(ConcurrencyRuntime)은 처리 리소스를 최대한 사용하기 위해 협조적 스케줄링을 운영 체제의 선점형 스케줄러와 함께 사용한다.
선점형 스케줄러와 협조적 스케줄러의 차이점
선점형 스케줄러는 여러 스레드에 컴퓨팅 리소스에 대한 동일한 액세스를 제공하여 모든 스레드가 진행될 수 있도록 한다. 컴퓨팅 리소스가 많은 컴퓨터에서는 공정한 액세스를 보장하는 것은 별로 문제가 되지 않으며, 오히려 리소스의 충분한 활용을 보장하는 것이 더 문제가 된다.
선점형 커널 모드 스케줄러에서는 애플리케이션 코드가 운영 체제를 사용하여 스케줄링을 결정해야 한다. 반대로, 사용자 모드의 협조적 스케줄러는 애플리케이션 코드가 스스로 스케줄링을 결정하도록 한다.
협조적 스케줄링의 경우 애플리케이션이 많은 스케줄링 결정을 내리기 때문에 커널 모드 동기화와 관련된 오버헤드가 상당히 줄어든다.
일반적으로 협조적 스케줄러는, 운영 체제 커널에 예약할 다른 작업이 없는 경우 운영 체제 커널에서 스케줄링을 결정하도록 한다. 또한 협조적 스케줄러는 커널에 전달되는 차단 작업이 있을 경우 운영 체제 스케줄러에서 스케줄링을 결정하도록 하지만, 해당 작업은 사용자 모드 스케줄러에 전달되지 않는다.
협조적 스케줄링 및 효율성
선점형 스케줄러에 대해서는 동일한 우선 순위를 가진 모든 작업이 동등하다.
일반적으로 선점형 스케줄러는 생성된 순서대로 스레드를 예약한다. 또한 선점형 스케줄러는 스레드 우선 순위에 따라 라운드 로빈 방식으로 모든 스레드에 시간을 배분한다.
이 메커니즘은 공정하지만(모든 스레드가 진행됨) 효율성 면에서는 다소 떨어진다. 예를 들어 계산 집중적인 것이 많은 알고리즘에는 공정성이 필요하지 않는다. 대신 관련 작업을 최소한의 시간에 마치는 것이 중요하다.
협조적 스케줄링에서는 애플리케이션이 좀 더 효율적으로 작업을 예약할 수 있다. 많은 스레드가 있는 애플리케이션을 예로 들 수 있다. 동시에 실행되는 리소스를 공유하지 않는 스레드를 예약하면 동기화 오버헤드를 줄이는 한편 효율성을 높일 수 있다. 작업을 예약하는 또 다른 효율적인 방법은 각 파이프라인 단계의 입력이 메모리 캐시에 이미 로드 되도록 동일한 프로세서에서 작업의 파이프라인(각 작업이 이전 작업의 출력을 기반으로 작동)을 실행하는 것이다.
선점형 스케줄링과 협조적 스케줄링을 함께 사용
협조적 스케줄링이 모든 스케줄링 문제를 해결하지는 못한다. 예를 들어 다른 작업에 공정하게 양보하지 않는 작업은 사용 가능한 컴퓨팅 리소스를 모두 소비함으로써 다른 작업이 진행되는 것을 방해할 수 있다.
동시성 런타임은 협조적 스케줄링의 효율성 이점을 사용하여 선점형 스케줄링의 공정성 보장을 보완한다.
기본적으로 동시성 런타임은 작업 가로채기(워크 스틸) 알고리즘을 사용하는 협조적 스케줄러를 제공하여 컴퓨팅 리소스 간에 작업을 효율적으로 배포한다.
하지만 동시성 런타임 스케줄러는 또한 운영 체제의 선점형 스케줄러를 사용하여 애플리케이션 간에 리소스를 공정하게 배포한다. 스레드 실행을 세부적으로 제어하기 위해 애플리케이션에서 사용자 지정 스케줄러 및 스케줄러 정책을 만들 수 있다.
이 글은 2020-04-10에 작성되었습니다.