14
커커커커커커커 커커커커커커 Chapter 9 Thread Synchronization with Kernel Objects

윈도우 커널모드에서의 스레드동기화

  • Upload
    the1900

  • View
    326

  • Download
    5

Embed Size (px)

Citation preview

Page 1: 윈도우 커널모드에서의 스레드동기화

커널모드에서의 스레드동기화Chapter 9

Thread Synchronization with Kernel Objects

Page 2: 윈도우 커널모드에서의 스레드동기화

유저모드에서의 스레드 동기화

-1-

유저모드의 스레드 동기화 방식은 빠르다 하지만 한계점이 존재하기때문에 복잡한 관계에선 사용하기 부적절하다

인터락함수를 이용한 동기화

크리티컬 섹션의 미흡한 기능

하나의 스레드만 사용 하기때문에 스레드 대기상태 지정불가능 한 개의 전역변수만 동기화

단일프로세스 관계에서만 동기화 수행 대기시간 설정이 불가능 하기때문에 데드락 발생가능성 존재

Page 3: 윈도우 커널모드에서의 스레드동기화

커널모드에서의 스레드 동기화

-2-

Signaled nonsignaledstate

입출력 스트림

대기타이머

스레드

세마포어

뮤텍스

프로세스

이벤트 잡

Page 4: 윈도우 커널모드에서의 스레드동기화

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?)

Page 5: 윈도우 커널모드에서의 스레드동기화

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;

Page 6: 윈도우 커널모드에서의 스레드동기화

이벤트 커널 오브젝트

-5-

• 자동리셋 수동리셋 설정CreateEventEx 

• 이름을 통해 다른프로세스의 스레드가 접근 가능OpenEvent 

• 시그널상태로 변경SetEvent

• 논시그널상태로 변경ResetEvent 

• 시그널상태로 변경했다가 논시그널로 변경PulseEvent

Page 7: 윈도우 커널모드에서의 스레드동기화

이벤트를 이용한 스레드사용

-6-

파일전체 ( 비트 전치 )

파일앞부분 (아이디만큼 xor 연산 )

파일 끝 ( 소유자삽입 )

파일을 메모리에

로드 하는스레드

Thread_1

Thread_2

Thread_3

이벤트 생성

• 자동리셋• 논시그널

SETevent

순차적으로

스레드실행

대기

함수

실행

Page 8: 윈도우 커널모드에서의 스레드동기화

대기 타이머 오브젝트

-7-

• 수동 , 자동설정 자동으로 논시그널로 생성됨Create

• 생성된 대기타이머 오브젝트에 접근Open

• 대기타이머 활성화 ( 최초시간 , 반복주기 )Set

• 대기타이머 비활성화Cancel

Page 9: 윈도우 커널모드에서의 스레드동기화

프로그램은 계속

사용하면서 자동저장실행

대기타이머를 이용한 스레드사용

-8-

게임이나 프로그램 사용중

Thread_1타이머 생성

• 자동리셋

SETtimer

대기

함수

실행

5 분 주기로 1

분동안 시그널

상태로지정

Page 10: 윈도우 커널모드에서의 스레드동기화

세마포어 커널 오브젝트

-9-

• 현재리소스개수 최대리소스갯수저장

Create

SemaphoreEx

• 세마포어 이름으로 핸들반환하는 함수

Open

Semaphore

• 인자값만큼 현재카운트증가

Release

Semaphore

Page 11: 윈도우 커널모드에서의 스레드동기화

세마포어를 이용한 동기화

-10-

Thread2

Thread4

Thread1

Thread3 Thread

5

Thread6

세마포어생성 현재 , 최대카운트

=2

자원1

자원2

대기현재카운트 0 (논시그널상태 )

Page 12: 윈도우 커널모드에서의 스레드동기화

뮤텍스 커널 오브젝트

-11-

• 해당스레드의 뮤텍스 소유여부결정

Create

MutexEx

• 뮤텍스 이름으로 핸들얻기OpenMutex

• 상태변경 ( 소유권해제 )Release

Mutex

Page 13: 윈도우 커널모드에서의 스레드동기화

Release mutex 호출시

뮤텍스를 이용한 동기화

-12-

뮤텍스를 스레드 소유로 생성

뮤텍스를 스레드 소유로 생성 X

대기함수 호출시대기함수 호출시

호출한 스레드가 뮤텍스 소유( 리눅스에서의 lock) 커널이 소유한 스레드가 역할이

끝나면대기하고있던 다른스레드에게 뮤텍스 소유권전달 )

뮤텍스 소유권 해제( 리눅스에서의 unlock)

Page 14: 윈도우 커널모드에서의 스레드동기화

스레드 동기화 오브젝트 표

-13-