Thread/Windows

[스크랩][Thread][Windows] Sleep과 SwitchToThread의 차이

Binceline 2014. 9. 29. 07:54

원문 : http://sweeper.egloos.com/viewer/2942286


Sleep과 SwitchToThread는 얼핏보면 비슷해 보이지만, 의외로 많은 차이점이 있다.

이 차이점에 대해 명확하게 정리하고 넘어가자.

Sleep


스레드는 Sleep 함수를 호출하여 일정 시간 동안 자신을 스케쥴하지 않도록 운영체제에게 명령을 내릴 수 있다.

VOID Sleep(DWORD milliseconds);

이 함수를 호출하면, milliseconds 매개변수로 주어진 시간만큼 쓰레드를 일시 정지시키게 된다.
Sleep 함수는 다음과 같은 특징을 가진다.

1) Sleep을 호출하면 쓰레드는 자발적으로 남은 CPU 타임 슬라이스(퀀텀)을 포기한다.

2) 시스템은 지정된 시간 동안 쓰레드를 스케쥴 불가능 상태로 유지한다. 
만일 시스템에게 10 밀리 세컨드만큼 정지 상태를 유지하도록 요구하면 쓰레드는 그 시간동안 스케쥴 불가 상태가 된다.
그러나, 정확하게 쓰레드가 10 밀리초뒤에 깨어나지 않음에 항상 주의하라.
다른 쓰레드가 CPU를 선점하고 있으면 스케쥴링 알고리즘에 따라 10밀리초가 훨씬 넘는 시간 뒤에 깨어날 수 있다.

다시 말해, Sleep의 매개변수 밀리초가 모두 지났다고 해서 해당 쓰레드가 다시 실행되는 것이 아니라,
스케쥴링 대상으로 다시 돌아가는 ready 상태가 되는 것 뿐이다.

3) Sleep(0); 을 호출하면 쓰레드가 남은 타임 슬라이스를 자발적으로 포기하여 시스템이 다른 쓰레드를 스케쥴링하게 된다.
그런데 시스템에 이 함수를 호출한 쓰레드와 우선순위가 같거나 높은 쓰레드 중에 스케쥴 가능 쓰레드가 없다면,
Sleep 함수를 호출한 쓰레드가 다시 호출될 수도 있다.

헌데, Sleep(0)이 동일 또는 이상의 우선순위를 가지는 쓰레드만 찾던 것(우선 순위 체크)이 WindowsServer 2003부터 사라졌다.

SwitchToThread


윈도우 OS는 스케쥴 가능 상태에 있는 다른 쓰레드를 수행하기 위한 SwitchToThread 함수를 제공한다.

BOOL SwitchToThread();

이 함수를 호출하면 시스템은 현재 프로세서에 ready 상태에 있는 쓰레드가 있는지 확인한다.
(현재 프로세서라는 말이 매우 중요한데, 다른 코어가 팡팡 놀고 있어도 현재 코어에서만 스위칭이 발생한다)

만일 그러한 쓰레드가 없다면, SwitchToThread 함수는 즉시 FALSE를 반환한다.

하지만, 일정 시간 CPU 할당을 받지 못했던 쓰레드가 있다면, 해당 쓰레드는 CPU를 양보하고, 시스템은 해당 쓰레드를 스케쥴링한다.
(보통 일정 시간 이상 CPU 할당을 받지 못했다면, 쓰레드 우선순위가 낮을 것이다)

이 함수를 통해 CPU 할당을 받은 쓰레드는 단일 퀀텀 시간 동안만 수행되며, 이후 스케쥴러는 이전과 동일하게 스케쥴링을 수행한다.

Sleep vs SwitchToThread 요약

SwitchToThread를 호출하는 것은 Sleep(0)을 호출하는 것과 비슷해 보인다.

차이점이라면, SwitchToThread의 경우 함수를 호출한 쓰레드보다 낮은 우선순위의 쓰레드를 수행할 수도 있다는 것이다.
Sleep()의 경우 설사 낮은 우선순위의 쓰레드들이 오랜 시간 CPU 할당을 받지 못했다 하더라도, 
Sleep 함수를 호출한 쓰레드를 다시 스케쥴링한다.


반응형