140 likes | 430 Views
Thread 와 Thread 동기화. Thread 와 Thread Scheduling Thread Synchronization( 동기화 ). 목 차. 지난 시간 리뷰. 문제들. 핸들 참조를 할 때 인덱스를 3 개로 나눈 이유는 무엇인가 ? 메모리를 효율적으로 사용하기 위함 . SEH 를 최초로 인지하는 존재는 누구인가 ? 0 으로 나누거나 Access 금지된 메모리 영역을 Access 하려고 하면 소프트웨어 인터럽트 (CPU 가 연산도중 발생시키는 인터럽트 ) 가 발생함 .
E N D
Thread와 Thread동기화 Thread와 Thread Scheduling Thread Synchronization(동기화)
문제들 • 핸들 참조를 할 때 인덱스를 3개로 나눈 이유는 무엇인가? • 메모리를 효율적으로 사용하기 위함. • SEH를 최초로 인지하는 존재는 누구인가? • 0으로 나누거나 Access 금지된 메모리 영역을 Access 하려고 하면 소프트웨어 인터럽트(CPU가 연산도중 발생시키는 인터럽트)가 발생함. • 핸들 카운트가 증가하고 감소하는 것을 확인해 봤는가? • 내 문서/VS2008/Proj/CH5/DuplicateHandle
우선순위 알고리즘 • 각각의 Thread에 특정한 범위의 우선순위 값이 주어지고, 스케줄러 루틴은 실행 대기중인 Thread중에서 우선순위 값이 가장 높은 Thread를 선택하여 실행 • 내문서/VS2008/Proj/CH6/TwoThreadPriority(With WinDbg) KiReadySummary
Process와 Thread의 우선순위 관계 • Thread의 우선순위 값은 그 Thread를 포함하고 있는 프로세스의 우선순위에 기반하여 상대적으로 결정됨. • Thread의 우선순위는 런타임 우선순위값과 베이스 우선순위의 두 가지 우선순위 값으로 구성되어짐. • 베이스 우선순위 값 : 유저레벨의 사용자가 API를 사용하여 결정하는 우선순위. • 런타임 우선순위 값 : 베이스 우선순위 값에 기준하여 더 높은 값으로 시스템에 의해 임시로 바뀌어지는 우선순위. 내문서/VS2008/Proj/CH6/ThreadPriorityTester
Preemptive Scheduling • 어떤 Thread가 CPU를 사용하고 있는 동안 다른 Thread에 의해 CPU사용을 선점 당할 수 있는 스케줄링 방식. • 다른 Thread에 의해 선점 되는 경우 • Quantum 시간이 종료된 경우. • 높은 우선순위에 의해 선점된 경우. 내문서/VS2008/Proj/CH6/ThreadPreemptiveExample
Thread Synchronization 필요성 Thread가 할당받은 시간 • Multi Threading 방식에서는 각 Thread들이 어떤 순서로 실행되는지 예측할 수 없다. 내문서/VS2008/Proj/CH6/CriticalSection Thread 코드 실행 H/W Interrupt DPC큐 루틴
Critical Section • Kernel 객체를 바로 사용하지 않는 유저레벨의 동기화 방법. • 동일한 Process 내에서만 사용할 수 있음. • Kernel 객체를 사용하지 않기 때문에 핸들을 사용하지 않고 CRITICAL_SECTION 타입을 정의하여 사용. • CriticalSection(임계영역)에 중복하여 재 진입하여도 데드락 현상이 발생하지 않음. 내문서/VS2008/Proj/CH6/CriticalSectionSync, ReEnteredCriticalSection
Mutex • Kernel 동기화 객체는 Signaled/ Non signaled 두 가지 상태 중 하나로 존재함. • WaitForSingleObject()를 사용하여 Kernel 객체가 Signaled 될 때까지 대기 • 운영체제는 Mutex가 반환되지 않은 상태에서 Thread가 종료될 경우 그 Mutex를 강제적으로 Signaled 상태로 변환. • 동일 Thread가 Mutex를 중복 호출하여도 Deadlock 발생하지 않음. • Mutex에 이름을 주어(NamedMutex) 서로 다른 프로세스에 속한 Thread간 동기화에 사용. 내문서/VS2008/Proj/CH6/CriticalSectionSyncMutex, Mutex_wait_abandon, NamedMutex
Semaphore • 지정한 수만큼의 Thread가 임계영역에 진입할수 있다. • 사용 가능한 자원 개수가 0이 되기 전까지 Signaled 상태를 유지. • Named Semaphore 가능. 내문서/VS2008/Proj/CH6/MyungDongKyoJaSimulate
Event • Signaled/Nonsignaled상태를 원하는 때에 바꿀 수 있는 동기화 객체. • Named Event 가능. • Auto Reset모드 • WaitForSingleObject() 를 통해 진입 후 자동으로 Nonsignaled상태로 변경 • Manual Reset 모드 • ResetSignal()을 호출하기 전까지 Signaled 상태를 유지. 내문서/VS2008/Proj/CH6/StringEvent2
Thread 대기블록 KTHREAD #2 KTHREAD #1 WaitBlockList WaitBlockList WaitListEntry WaitListEntry Thread Thread Object Object NextWaitBlock NextWaitBlock WaitListEntry Thread Object NextWaitBlock 동기화 객체 #2 동기화 객체 #1 WaitListHead WaitListHead