Maystyle :
Admin : New post
Guestbook
Local
media
Catergories
Recent Articles
Recent Comments
Recent Trackbacks
Calendar
Tag
Archive
Link
Search
 
  Windows Internals 다시보기 15 
작성일시 : 2010. 3. 9. 20:19 | 분류 : Windows Server/Kernel

* 아직은 많이 부족하기 때문에 제가 자신이 생길 때 까지 본 글은 제 블로그에 대한 링크만 허용합니다.

쓰래드의 상태 변화

image

윈도우에서 실행 되는 쓰래드들은 실제로 위의 8가지 상태 중 한 가지의 상태가 됩니다.
먼저 init 단계를 쓰래드의 생성 단계입니다. 이렇게 생성된 쓰래드는 먼저 우선 순위가 설정되지 않은 상태 Deferred Ready에서 대기하다 우선 순위가 결정 되면, Ready 상태에서 대기하게 됩니다. 그리고 이중 우선 순위가 가장 높은 쓰래드를 선택하고 다음 번에 실행 하도록 합니다. 이렇게 스케줄러에 의해 다음 번에 실행하도록 결정된 쓰래드는 Standby 상태가 됩니다. 이 Standby 상태의 쓰래드는 현재 Running 중인 쓰래드와 우선 순위를 비교하여 자신이 우선 순위가 높은 경우 해당 스래드를 디스패치 시킨 후 자신이 실행 (Running 상태) 되게 되고, 우선 순위가 낮은 경우 해당 쓰래드가 실행 하도록 할당 받은 시간 (퀀텀) 을 다 소비할 때 까지 기다리게 됩니다. 이렇게 실행 중인 쓰래드는 대부분 동기화 객체 WaitForSingleObject나 Sleep 에 의해 자발적으로 대기하거나 예를 들어 페이지 아웃된 페이지를 찾아 메모리에 올리는 것과 같이 시스템에 의해 일시 정지하게 되는데, 이 상태를 Wait 라 합니다. 또한 대기 상태 중 쓰래드의 커널 스택이 디스크로 페이지 아웃되어 바로 준비 상태로 가지 못하는 상태를 Transition 이라 하며, 쓰래드의 실행이 종료 된 경우는 Terminate 상태라 합니다.

스레드의 우선 순위

image

Windows 의 스레드 스케줄링은 스레드 우선 순위와 라운드 로빈 방식을 조한한 형태 입니다. 위 그림과 같이 실시간 처리가 필요한 스레드의 경우 우선 순위를 높게 주고, 다소 느린 처리가 가능한 경우에는 우선 순위를 낮게 준 후 동일 우선 순위 사이에서는 큐의 가장 앞에 있는 스레드를 처리하게 됩니다.

스레드가 CPU를 점유하는 시간 간격을 앞서 설명한 것처럼 퀀텀이라고 합니다. Windows 2000 이후의 OS에서는 퀀텀 부스팅이 가능 합니다. 이는 퀀텀 시간을 늘려 주는 것으로 예를 들어 활성 윈도우에서 실행 되는 스레드의 경우 해당 스레드의 퀀텀 부스팅을 통해서 유저 엑션에 대한 응답속도를 높이고 있습니다.

스레드는 퀀텀 기간 동안 CPU를 점유하게 됩니다. 하지만 아래와 같은 경우 스레드의 실행은 잠시 멈추게 됩니다.

1. 자발적으로 세마포 및 뮤텍스 와 같은 객체를 획득하기 위해 대기하는 경우 (WaitForSingleObject 등 ) : 대기 상태로 전환
2. 더 높은 우선 순위의 스레드 처리를 위한 대기 : 큐의 맨 앞에서 대기 (선점)
3. 퀀텀 시간 소모 : 큐의 맨 뒤에서 대기

위의 그림과 같이 스레드의 우선 순위는 0 ~ 31 까지의 32단계의 값을 갖습니다. 이 중 16이상의 값을 갖는 스레드를 실시간 수준으로 15이하 1이상의 스레드를 가변 수준이라 부릅니다.

우선 순위가 1 ~ 15인 경우 스레드는 처음 프로세스의 우선 순위에 준한 기본 우선 순위를 갖으나, 시스템에 의해 우선 순위가 올라갈 수 있습니다. 예를 들어 실행 준비가 끝난 스레드가 일정 시간 동안 실행 기회를 얻지 못한 경우 Window는 일시적으로 해당 스레드의 우선 순위를 높여 줍니다. 하지만 16이상인 경우에는 고정된 일정한 우선 순위값을 갖게 됩니다.

우선 수위 수준
실시간 : 24
높음 : 13
보통 이상 : 10
보통 : 8
보통 이하 6
Idle : 4

우선 순위가 올라가는 경우
I/O 연산의 완료
실행 이벤트 및 세마포를 기다린 경우
포어 그라운드 프로세스의 스레드들이 Wait를 완료한 직후
GUI 스레드가 윈도우 활동에 의해 깨어난 경우
실행 준비가 완료된 스레드가 한동안 실행 되지 못할 때

동기화

Windows에서 제공하는 동기화 방법은 아래와 같습니다.

동기화 객체

용도

사용 방법

Critical_Section

동일 프로세스내 스래드간 배타적 동기화

InitializeCriticalSection

EnterCriticalSection

LeaveCriticalSection

DeleteCriticalSection

뮤텍스

리소스 배타적 제어

CreateMutex

WaitForSingleObject

ReleaseMutex

ClosedHandle

세마포어

뮤텍스와 비슷하며 카운터를 관리 (해당 카운터 만큼 공동 소유함)

CreateSemaphore

OpenSemaphore

WaitForSingleObject

ReleaseSemaphore

이벤트

다른 스레드에 이벤트를 알림

CreateEvent

OpenEvent

SetEvent

ResetEvent

PulseEvent

|