상세 컨텐츠

본문 제목

12.4 쓰레드의 우선순위 컨트롤

Programming/Windows System

by RACC8N 2020. 4. 19. 17:22

본문

프로세스는 실행의 주체가 아닌 쓰레드를 담는 그릇에 지나지 않는다.

* Windows에서는 프로세스가 우선순위를 갖는 것이 아니라, 프로세스 안에서 동작하는 쓰레드가 우선순위를 갖는다.

 

이전에 말한 프로세스의 우선순위를 가리켜 기준 우선순위라고 표현한다.

쓰레드는 상대적 우선순위를 갖는다.

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

- 쓰레드의 우선순위는 프로세스의 기준 우선순위와 쓰레드의 상대적 우선순위의 조합으로 결정된다.

 

[EXAMPLE]

 

기준 우선순위가 NORMAL_PRIORITY_CLASS (9)인 프로세스 안에 두 개의 쓰레드가 존재하는데, 각각 상대적 우선순위가 THREAD_PRIORITY_LOWEST (-2), THREAD_PRIORITY_NORMAL (0) 이면, 각 쓰레드의 최종 우선순위는 7(9-2), 9(9-0)이 된다.

 

> 즉 프로세스의 기준 우선순위를 기준으로 해서 상대적 우선순위에 해당하는 값을 더하거나 빼면 쓰레드의 실질적인 우선순위를 알 수 있다.

 

쓰레드 우선순위 설정 함수 : SetThreadPriority()

hThread 우선순위를 변경할 쓰레드의 핸들
nPriority 설정할 우선순위 값

쓰레드 우선순위 참조 함수 : GetThreadPriority()

hThread 우선순위를 얻고자 하는 쓰레드의 핸들

 

이것만은 알고 갑시다

 

1. CreateThread와 _beginthreadex의 차이점

- _beginthreadex함수를 기반으로 쓰레드를 생성할 경우 쓰레드별로 독립적인 메모리 공간을 할당 받는다. 이 메모리 공간은 ANSI표준 함수를 호출하는 과정에서 사용한다. 이는 둘 이상의 쓰레드가 하나의 메모리 공간에 동시접근하는 문제점을 막기 위함이다.

 

2. 둘 이상의 쓰레드가 동시접근하는 메모리 공간의 문제점

- 실제로는 둘 이상의 쓰레드가 동시에 실행되지 않으므로, 메모리에 동시접근이라는 문제점은 발생하지 않는다고 생각할 수 있다. 하지만 CPU연산 과정에서 원하는 결과가 나오지 않을 수 있다. 

 

3. 쓰레드의 상태 변화

- Windows는 실행의 주체가 프로세스가 아닌 쓰레드이다. 따라서 상태를 지니는 실질적인 대상도 프로세스가 아닌 쓰레드이다. 쓰레드가 Ready, Blocked, Running 상태를 지니게 되며, 이들 상태간의 이동이 발생하는 시기는 프로세스의 상태 이동이 발생하는 이유와 동일하다.

 

4. 프로세스로부터의 쓰레드 분리

- 프로세스로부터 쓰레드를 분리한다는 것은 프로세스가 소유하는 쓰레드의 핸들을 반환함으로써 쓰레드의 Usage Count를 1로 두겠다는 뜻이며, 이는 쓰레드가 종료되는 시점에 쓰레드의 리소스를 반환하기 위함이다.

관련글 더보기

댓글 영역