Thread Scheduling 유형
Windows 운영체제는 thread라는 최소 실행단위에 의해서 프로그램이 실행되는데, 여러 개의 thread가 각각 교대로 CPU에 의해서 매우 빠른 속도로 실행되면서 마치 동시에 여러 응용 프로그램이 함께 실행되는 것과 같은 결과를 보여주고 있습니다. Thread Scheduling이란 이렇게 시스템에서 실행 중인 여러 개의 thread 간에 어떠한 thread를 실행할 지, 그리고 다음에는 어떠한 thread를 실행할 지에 대해서 결정하는 매카니즘입니다. 오늘은 thread scheduling이 발생하는 유형에 대해서 간단히 알아보도록 하겠습니다.
(원래 내용은 Windows Internals 6장의 내용을 바탕으로 작성되었으며 그림은https://www.microsoft.com/mspress/books/sampchap/4354c.aspx에서 발췌하였습니다.)
1. Voluntary Switch (자발적인 교체)
아래 그림처럼 현재 Priority 19로 running 상태에 있던 thread가 스스로 wait 상태로 들어가면서 Priority 17에서 ready 상태에 있던 thread로 교체되는 시나리오를 생각해 볼 수 있습니다. WaitForSingleObject나 WaitForMultipleObjects와 같은 함수를 호출하면서 어떠한 object의 상태가 변경될 때까지 wait 상태로 들어감으로써 다른 thread에게 실행 권한을 넘겨주는 경우입니다.
2. Preemption (선점)
이는 현재 running 상태에 있던 thread가 다른 thread에 의해서 밀려나는 것을 의미합니다. 더 높은 우선순위를 가지고 Wait 상태에 있던 thread가 깨어나거나, 다른 thread의 우선 순위가 오르거나 또는 현재 thread의 우선순위가 낮아짐으로써 다른 thread에게 선점 당하는 경우에 해당합니다.
아래 그림은 Priority 16으로 실행 중이던 thread가 Wait 상태에서 깨어난 Priority 18의 thread에게 실행 제어권을 넘겨주고 다시 waiting queue에 들어가는 경우를 보여주고 있습니다.
3. Quantum End (퀀텀 만료)
Quantum이란 한 thread가 running 상태로 실행될 수 있는 기간으로 일정 시간 동안 CPU에 의해서 실행이 되면 다른 thread가 실행될 수 있도록 스스로 제어권을 물려주게 됩니다.
이 Quantum의 길이는 운영체제마다 다릅니다. 예를 들어 Winodws 2000 Pro와 Windows XP는 기본값으로 2 clock을, Windows Server system에서는 12 clock을 부여합니다. 이는 서버 장비의 경우 Quantum을 조금 더 길게 부여함으로써 실행 중이던 서비스를 처리할 수 있는 시간을 충분히 주고 성능을 높이려는 의도입니다. 대신 일반 사용자 PC의 경우 사용자와 키보드, 마우스를 이용해서 interaction이 많으므로 보다 짧은 quantum을 부여합니다.
4. Termination (종료)
ExitThread가 호출되거나 TerminateThread에 의해서 강제로 종료되는 경우에 해당합니다.