Programmation Objet en JAVA Cours 8 Thread, Multi-thread, synchronisation,...
Thread 와 Thread 동기화
description
Transcript of Thread 와 Thread 동기화
Thread 와 Thread 동기화
Thread 와 Thread SchedulingThread Synchronization( 동기화 )
목차Process와
Thread 리뷰•Process와 Thread 개념도•남은 문제들
Thread Scheduling•Thread 상태•우선순위 알고리즘•Process와 Thread 우선순위의 관계•Preemptive Scheduling
Thread Synchronization•필요성•Critical Section•Mutex•Semaphore•Event
지난 시간 리뷰
문제들• 핸들 참조를 할 때 인덱스를 3 개로 나눈 이유는
무엇인가 ?– 메모리를 효율적으로 사용하기 위함 .
• SEH 를 최초로 인지하는 존재는 누구인가 ?– 0 으로 나누거나 Access 금지된 메모리 영역을 Ac-
cess 하려고 하면 소프트웨어 인터럽트 (CPU 가 연산도중 발생시키는 인터럽트 ) 가 발생함 .
• 핸들 카운트가 증가하고 감소하는 것을 확인해 봤는가 ?– 내 문서 /VS2008/Proj/CH5/DuplicateHandle
Thread 의 상태
우선순위 알고리즘
• 각각의 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/ThreadPreemp-tiveExample
Thread Synchronization 필요성
• Multi Threading 방식에서는 각 Thread들이 어떤 순서로 실행되는지 예측할 수 없다 .
내문서 /VS2008/Proj/CH6/CriticalSection
Thread 가 할당받은 시간
Thread 코드 실행 H/W InterruptDPC 큐 루틴
Critical Section
• Kernel 객체를 바로 사용하지 않는 유저레벨의 동기화 방법 .
• 동일한 Process 내에서만 사용할 수 있음 .• Kernel 객체를 사용하지 않기 때문에
핸들을 사용하지 않고 CRITICAL_SECTION 타입을 정의하여 사용 .
• CriticalSection( 임계영역 ) 에 중복하여 재 진입하여도 데드락 현상이 발생하지 않음 .
내문서 /VS2008/Proj/CH6/CriticalSec-tionSync, 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 대기블록WaitBlockListWaitListEntry
ThreadObject
NextWaitBlock
WaitListHead
ThreadObject
NextWaitBlock
WaitListEntry
WaitListHead
WaitBlockListWaitListEntry
ThreadObject
NextWaitBlock
KTHREAD #1 KTHREAD #2
동기화 객체 #1 동기화 객체 #2