Upload
the1900
View
326
Download
5
Embed Size (px)
Citation preview
커널모드에서의 스레드동기화Chapter 9
Thread Synchronization with Kernel Objects
유저모드에서의 스레드 동기화
-1-
유저모드의 스레드 동기화 방식은 빠르다 하지만 한계점이 존재하기때문에 복잡한 관계에선 사용하기 부적절하다
√
인터락함수를 이용한 동기화
크리티컬 섹션의 미흡한 기능
하나의 스레드만 사용 하기때문에 스레드 대기상태 지정불가능 한 개의 전역변수만 동기화
단일프로세스 관계에서만 동기화 수행 대기시간 설정이 불가능 하기때문에 데드락 발생가능성 존재
커널모드에서의 스레드 동기화
-2-
Signaled nonsignaledstate
입출력 스트림
대기타이머
스레드
세마포어
뮤텍스
프로세스
이벤트 잡
WaitForSingleObject
-3-
DWORD WaitForSingleObject( _In_ HANDLE hHandle, // 커널 오브젝트 핸들 _In_ DWORD dwMilliseconds
// 타임 아웃 간격 );
switch (target`s object handle)case WAIT_OBJECT_0:// The process terminated.
case WAIT_TIMEOUT:// The process did not terminate within times(as you set).
case WAIT_FAILED:// Bad call to function (invalid handle?)
WaitForMultipleObjects
-4-
DWORD WaitForMultipleObjects(DWORD dwCount, // 오브젝트 개수CONST HANDLE* phObjects, // 배열의주소BOOL bWaitAll, // 전체 또는 한개이상DWORD dwMilliseconds); // 타임 아웃 간격
case WAIT_OBJECT_0 + 0:// The process identified by h[0] (hProcess1) terminated.
case WAIT_OBJECT_0 + 1:// The process identified by h[1] (hProcess2) terminated.
case WAIT_OBJECT_0 + 2:// The process identified by h[2] (hProcess3) terminated.break;
이벤트 커널 오브젝트
-5-
• 자동리셋 수동리셋 설정CreateEventEx
• 이름을 통해 다른프로세스의 스레드가 접근 가능OpenEvent
• 시그널상태로 변경SetEvent
• 논시그널상태로 변경ResetEvent
• 시그널상태로 변경했다가 논시그널로 변경PulseEvent
이벤트를 이용한 스레드사용
-6-
파일전체 ( 비트 전치 )
파일앞부분 (아이디만큼 xor 연산 )
파일 끝 ( 소유자삽입 )
파일을 메모리에
로드 하는스레드
Thread_1
Thread_2
Thread_3
이벤트 생성
• 자동리셋• 논시그널
SETevent
순차적으로
스레드실행
대기
함수
실행
대기 타이머 오브젝트
-7-
• 수동 , 자동설정 자동으로 논시그널로 생성됨Create
• 생성된 대기타이머 오브젝트에 접근Open
• 대기타이머 활성화 ( 최초시간 , 반복주기 )Set
• 대기타이머 비활성화Cancel
프로그램은 계속
사용하면서 자동저장실행
대기타이머를 이용한 스레드사용
-8-
게임이나 프로그램 사용중
Thread_1타이머 생성
• 자동리셋
SETtimer
대기
함수
실행
5 분 주기로 1
분동안 시그널
상태로지정
세마포어 커널 오브젝트
-9-
• 현재리소스개수 최대리소스갯수저장
Create
SemaphoreEx
• 세마포어 이름으로 핸들반환하는 함수
Open
Semaphore
• 인자값만큼 현재카운트증가
Release
Semaphore
세마포어를 이용한 동기화
-10-
Thread2
Thread4
Thread1
Thread3 Thread
5
Thread6
세마포어생성 현재 , 최대카운트
=2
자원1
자원2
대기현재카운트 0 (논시그널상태 )
뮤텍스 커널 오브젝트
-11-
• 해당스레드의 뮤텍스 소유여부결정
Create
MutexEx
• 뮤텍스 이름으로 핸들얻기OpenMutex
• 상태변경 ( 소유권해제 )Release
Mutex
Release mutex 호출시
뮤텍스를 이용한 동기화
-12-
뮤텍스를 스레드 소유로 생성
뮤텍스를 스레드 소유로 생성 X
대기함수 호출시대기함수 호출시
호출한 스레드가 뮤텍스 소유( 리눅스에서의 lock) 커널이 소유한 스레드가 역할이
끝나면대기하고있던 다른스레드에게 뮤텍스 소유권전달 )
뮤텍스 소유권 해제( 리눅스에서의 unlock)
스레드 동기화 오브젝트 표
-13-