Windows_/Windows32_API
Windows :: 스레드의 상태 컨트롤과 프로세스및 스레드의 우선순위
sosal
2014. 7. 24. 10:19
반응형
/*
* 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) |