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

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

Thread 는 일을 하는 녀석입니다.

Thread 역시 Process 와 마찬가지로 쓰래드를 구성하고 있는 EThread 구조체 및 KThread, PEB 통해 그 내용을 확인 할 수 있습니다.  이 쓰래드에는 자신의 생성 및 소멸 시간, 프로세스의 ID 등의 정보 및 유저/커널 시간 CPU의 상태 레지스터 스케줄링 정보 및 다양한 대기열에 대한 정보와 유저 스택 및 커널 스택 정보로 이루어져 있습니다.

image

Windows Internals 에는 TEB 에 대한 설명이 빠져 있으나 위의 그림을 통해 우리는 대충 어떤 내용이 저장되어 있는지 확인 할 수 있습니다. 아래는 ETHRED 와 KTHRED의 각 블록 설명입니다.

image
image
image

위와 같이 Thread를 이루고 있는 블록들은 크게 ETHREAD 와 KTHRED 그리고 TEB로 이루어져 있습니다.

다만 이전의 운영체제와 다른 점은 User Level 쓰래드와 Kernel Level 쓰래드가 구분이 없다는 점입니다. 단순이 User Level에서 쓰래드가 실행 되다가 커널 레벨의 함수가 호출되어야 하는 경우 콜 게이트나 소프트웨어 인터럽트 등을 이용해서 단순하게 처리하게 됩니다.

아래의 예에서 보이는 것과 같이 유저 모드과 커널 모드가 동시에 존재 하는 것을 확인 할 수 있습니다. 이후 설명 드리겠지만 ChildEBP가 F로 시작하는 것은 커널 레벨임을 우리는 이전에 메모리 설명을 통해 알고 있습니다. Windows에서 말하는 커널 레벨 쓰래드는 디바이스 드라이버에 의해 생성된 쓰래드를 의미합니다.

kd> !thread
THREAD 81bddcb0 Cid 094c.0950 Teb: 7ffdf000 Win32Thread: e19a7970 RUNNING on processor 0
Owning Process 81e5db78 Image: notepad.exe
ChildEBP RetAddr Args to Child
f7f8ad4c 808234cb 0007fefc 00000000 00000000 win32k!NtUserGetMessage (FPO: [SEH])
f7f8ad4c 7c8285ec 0007fefc 00000000 00000000 nt!KiFastCallEntry+0xf8 (FPO: [0,0] TrapFrame @ f7f8ad64)
WARNING: Stack unwind information not available. Following frames may be wrong.
0007fed8 01002a3b 0007fefc 00000000 00000000 ntdll!KiFastSystemCallRet
0007ff1c 01007527 01000000 00000000 000a24b2 notepad!WinMain+0xe5 (FPO: [4,8,0])
0007ffc0 77e6f23b 00000000 00000000 7ffda000 notepad!WinMainCRTStartup+0x182 (FPO: [SEH])
0007fff0 00000000 010073a5 00000000 78746341 kernel32!ProcessIdToSessionId+0x209

아래와 같이 해당 notepad는 5개의 Thread가 있고, 이중 1번째인 THREAD 81bddcb0 가 CPU 0 번에서 동작하는 것을 확인할 수 있습니다.

THREAD 81bddcb0 Cid 094c.0950 Teb: 7ffdf000 Win32Thread: e19a7970 RUNNING on processor 0
THREAD 817a2db0 Cid 094c.0954 Teb: 7ffde000 Win32Thread: 00000000 WAIT: (Unknown) UserMode Alertable
81b22d50 SynchronizationEvent
81729f58 SynchronizationEvent
817a2e28 NotificationTimer
THREAD 81b6edb0 Cid 094c.0958 Teb: 7ffdd000 Win32Thread: 00000000 WAIT: (Unknown) UserMode Alertable
81b6ee28 NotificationTimer
THREAD 8174d3c8 Cid 094c.095c Teb: 7ffdc000 Win32Thread: e13bdbf0 WAIT: (Unknown) UserMode Non-Alertable
81b2e970 QueueObject
8174d440 NotificationTimer
THREAD 81b849e8 Cid 094c.0960 Teb: 7ffdb000 Win32Thread: e1628008 WAIT: (Unknown) UserMode Non-Alertable
81b2e970 QueueObject
81b84a60 NotificationTimer

다시 말해 일을 하는 녀석은 쓰래드입니다.
프로그램 내에서 어떠한 일을 한다 함은 바로 프로그래밍 된 함수가 동작한다 와 동일한 의미 입니다.

|