21. Thread의 종료
• 스레드 함수가 반환
• 스레드 내에서 ExitThread 호출
• 동일, 혹은 아예 다른 프로세스에서
TerminateThread 호출
• 스레드가 포함된 프로세스가 종료
22. Thread의 종료
• 스레드 함수가 반환 의 경우 이외에는
• 스레드 내에서 ExitThread 호출
• 동일, 혹은 아예 다른 프로세스에서 TerminateThread 호출
• 스레드가 포함된 프로세스가 종료
•비 추천 (이라기보단 되도록 이렇게 안되도록 해야함)
23. Thread의 종료
• 스레드 함수가 반환 일 땐
1. 스레드 함수 내에서 생성된 모든 C++오브젝
트들 파괴자 호출 후 제거
2. 스레드 스택으로 사용되던 메모리 반환
24. Thread의 종료
• 스레드 함수가 반환 일 땐
3. 시스템은 스레드의 종료 코드를 스레드 함수
의 반환 값으로 설정
4. 스레드 커널 오브젝트의 사용 카운트 감소
25. Thread의 종료
• ExitThread 함수 호출 경우
– 운영체제 리소스는 반환되지만,
– C++리소스는 방치됨
– 이 함수는 반환되지 않으므로, 이 함수 호출 부
분 아래 코드는 실행 안됨
26. Thread의 종료
• TerminateThread 함수 호출 경우
– 종료될 스레드 쪽은 자신이 곧 종료 될 것이라는 사실
을 모르기 때문에 적절한 정리 작업 수행이 불가능
– 종료 자체를 회피 할수도 없음
27. 공통적으로 스레드 종료시 나타나는 일들
1. 스레드가 소유하던 모든 유저 오브젝트 핸들
이 삭제
2. 스레드의 종료코드는 STILL_ACTIVE에서
ExitThread나 TerminateThread에서 지정한
종료 코드로 변경
28. 공통적으로 스레드 종료시 나타나는 일들
3. 스레드 커널 오브젝트의 상태 - 시그널 상태
로 변경
4. 스레드 커널 오브젝트의 사용 카운트가 1 감
소
29. 스레드 내부
1. 커널 오브젝트 생성
2. 커널 오브젝트 초기화
3. 스레드 스택으로 활용
할 메모리 할당
4. 및 Param, StartAddr
추가
5. RtlUserThreadStart()
가 호출됨(OS에 의해)
31. 스레드 스케쥴링
• 컨텍스트 구조체
– 스레드가 마지막으로 수행되었을 때의 CPU레
지스터들의 정보를 가지고 있다.
– Context Switching
32. 스레드 스케쥴링
• 컨텍스트 전환이 일어나면 Cpu시간을 할당
받은 스레드는 프로세스의 주소 공간 내에
위치한 코드를 수행하고 데이터를 사용하
게 된다.
• 다시 20밀리초가 지나면 윈도우는 CPU레
지스터 정보를 스레드의 컨텍스트로 저장
하게 되고 스레드는 수행이 정지된다.
33. 스레드의 정지와 계속 수행
• 스레드 커널 오브젝트 내에는 Suspend Count라는 값이 저장되어 있
다.
• CreateThread가 불리는 순간 1로 초기화가 되고,
• CreateThread속에서 초기화가 모두 끝났을때,
• CREATE_SUSPENDED플래그만 켜져있지 않다면 정지카운트를 0
으로 만들고 스케줄 가능한 상태가 된다.
• CREATE_SUSPENDED플래그가 켜져있었다면, 스케줄 불가능 상태
가 된다.
34. 스레드의 정지와 계속 수행
• ResumeThread()
• SuspendThread()
37. 스레드 우선순위
• 모든 스레드들은 0~31의 우선순위 번호를 가짐
• 시스템은 다음에 수행할 스레드를 선택할 때 31번 우선순위를 가진
스케줄 가능한 스레드들을 선택하고 라운드 로빈 방식으로 이러한 스
레드들을 수행한다.
– 스레드에 할당된 Time Slice가 끝나면 시스템은 31번 우선순위를 가진
스레드 중 스케줄 가능한 스레드가 있는지 확인하고 있을경우 할당.
– 31번이 스케줄 가능일 경우는 0~30은 절대 CPU를 할당 받을 수 없다.
(starvation state가 됨)
– 멀티 스레드일 경우는 31번과 30번이 동시에 돌아갈 수 있기 때문에 발
생 빈도가 적은 편.
– CPU는 스케줄 가능한 스레드가 없는 경우에만 유휴 상태가 된다.
38. 스레드 우선순위
• 시스템 내의 대부분의 스레드들은 스케줄 불가능 상태를 유지한다.
• 예)
– 프로세스의 주 스레드가 GetMessage를 했는데 Message가 없을때 프로세스를 정지시
킴.
– Message가 삽입되는 순간, 시스템은 해당 스레드가 더 이상 정지 상태로 있지 않아야
한다는것을 알게 되고, 현재 스레드보다 높은 우선순위의 실행가능 스레드가 없을 때,
CPU시간을 할당함.
– 낮은 우선 순위의 스레드가 어떤 작업을 하고 있든지, 높은 우선순위가의 스레드가 스케
줄 가능 상태가 되면, 지체없이 높은 우선순위의 스레드에 CPU시간을 할당함.(Time
Slice가 남았더라도 포기)
– 제로페이지 스레드
• 시스템 전체에서 어떠한 스레드도 스케줄 가능 상태가 아닐때 램의 사용되지 않는 페이지를 0
으로 만들어주는 작업을 수행
• 시스템 전체에서 유일하게 0번 우선순위를 가진 스레드.
40. 스레드 우선순위
• 우선순위 개념
– 프로세스의 우선순위
• 운영체제 내의 다른 프로그램들과 순위 척도
– 스레드들의 우선순위
• 애플리케이션 내의 스레드들의 상대적 순위 척도
41. 스레드 우선순위
• 높은 우선순위 레벨의 스레드는 오랫동안 스
케줄 가능 상태로 남아 있지 않도록 하고,
• 낮은 우선순위 레벨 스레드는 가능한 오랫동
안 스케줄 가능한 상태를 유지해서 가능한 오
랫동안 CPU를 잡고 있도록 하는게 좋다.
• 전체적인 운영체제의 응답성이 개선된다.
43. 스레드 우선순위
• 동적인 우선순위 레벨 상승
– 시스템은 I/O이벤트에 응답이나 디스크를 읽을 때 일시적으로 우선순위
레벨을 상승시킨다.
• 프로세스/스레드 우선순위를 토대로 기본 우선순위 값이 정해진다.
• I/O 이벤트가 일어날 경우 일시적으로 우선순위레벨을 증가 시킬 수 있다.
• 1~15에서만 증감이 일어남.
• 기본 우선순위 값 밑으로는 떨어지지 않음
• 동적 변경이 싫다면,
– Set/GetProcessPriorityBoost
– Set/GetThreadPriorityBoost
44. 스레드 우선순위
• Foreground Process
– 사용자는 당연히 현재 사용중인 프로세스가
BackgroundProcess보다 빨리 응답하길 원할 것이
다.
– 그래서 윈도우는 Foreground에게는 일반적인 퀀
텀시간보다 좀 더 긴 시간의 퀀텀을 제공할 수 있
도록 한다.
– ForegroundProcess가 보통 우선순위 클래스일때
만! 적용된다.
45. 스레드 선호도
• 특정 시스템구조를 고려한 기능으로
• 어느 스레드를 어떤 CPU에서 수행할지 제어
하는 방법을 제공하는 것
• 예)
– A스레드는 0번 CPU에서만,
– B스레드는 2번 CPU에서만 작동하도록