Windows_/Windows32_API

Windows :: 스레드의 상태 컨트롤과 프로세스및 스레드의 우선순위

sosal 2014. 7. 24. 10:19
반응형

/*

 * http://sosal.kr/

 * made by so_Sal

 */

 




스레드의 상태는 프로세스의 상태를 떠올리시면 됩니다.
실제로 Windows에서 상태가 변화하는 주체는 프로세스가 아닙니다.
스레드가 변화하는 것입니다.



위 그림은 프로세스의 상태변화를 나타내는 대표적인 그림입니다.
위 상태를 나타내는 준비, 실행, 대기 (ready, running, block)에 관한 내용은
스레드의 상태를 나타낸다고 보셔도 무방합니다.

:: 프로세스의 상태와 우선순위에 대한 자세한 내용을 잘 모르신다면
:: 링크로 " LINK_ "


프로세스 우선순위 설정 함수
BOOL SetPriorityClass(
    HANDLE hProcess,
    DWORD dwPriorityClass)

원하는 프로세스의 핸들을 첫 매개변수에 넣습니다.

dwPriorityClass 인자에 들어갈 Flag 입니다.

 IDLE_PRIORITY_CLASS 우선순위 4
 NORMAL_PRIORITY_CLASS 우선순위 9 (Default)
 HIGH_PRIORITY_CLASS 우선순위 13
 REALTIME_PRIORITY_CLASS  우선순위 24





스레드 상태 컨트롤 관련 함수

DWORD SuspendThread(HANDLE hThread);
Block 상태로 변경하고 싶은 스레드의 핸들을 인자로 넣습니다.

DWORD ResumeThread(HANDLE hThread);
Ready 상태로 변경하고 싶은 스레드의 핸들을 인자로 넣습니다.


커널이 스레드를 관리하기 위해 저장하는 스레드 커널 오브젝트에는
Suspend Count 라는 멤버가 있습니다.
실행중인 스레드의 Suspend count :: 0
SuspendThread() 의 호출시 Suspend count :: 1  -> block 상태로 변이
SuspendThread() 함수가 한번 더 호출하게되면 :: 2

결론 :: SuspendThread 함수는 Suspend Count의 값을 1만큼 증가시키는 함수입니다.
결론 :: ResumeThread 함수는 Suspend Count의 값을 1만큼 감소시키는 함수입니다.
Suspend Count 멤버가 0이 되어야 실행상태에 놓입니다.
0보다 큰 값이라면, Block 상태에 놓이게 되고, 이 상태에서는
ResumeThread() 함수를 이용해서 Suspend Count 낮춰야만 다시 실행상태가 됩니다.

두 함수의 리턴값은 Suspend count입니다. 리턴값으로 Suspend count 값을 확인할 수 있습니다.
주의할점은 Susend count의 값은, 함수 호출하기 전의 Suspend count를 가리킵니다.



스레드 우선순위 관련 함수

BOOL SetThreadPriority(
        HANDLE hThread,
        int nPriority
);

int
GetThreadPriority(
        HANDLE hThread
)



 THREAD_PRIORITY_LOWEST  -2   (Lowest)
 THREAD_PRIORITY_BELOW_NORMAL  -1
 THREAD_PRIORITY_NORMAL    0   (Default)
 THREAD_PRIORITY_ABOVE_NORMAL  +1
 THREAD_PRIORITY_HIGHEST   +2   (Highest)