Windows System Programming Synchronization In Kernel Mode Tutor

  • Slides: 14
Download presentation
Windows System Programming - Synchronization In Kernel Mode - Tutor: 20060106 배문희

Windows System Programming - Synchronization In Kernel Mode - Tutor: 20060106 배문희

대기 함수들 Ⅱ 대기 함수(Wait function) DWORD Wait. For. Multiple. Object( DWORD dw. Count,

대기 함수들 Ⅱ 대기 함수(Wait function) DWORD Wait. For. Multiple. Object( DWORD dw. Count, CONST HANDLE* ph. Object, BOOL b. Wait. All, DWORD dw. Milliseconds); HANDLE h[3] = {h. Process 1, h. Process 2, h. Process 3}; 대기 함수(Wait function) 예 DWORD dw = Wait. For. Multiple. Object ( 3, h, FALSE, 5000); Switch (dw) { case WAIT_OBJECT_0 + 0: // h[0]이 가리키는 프로세스(h. Process 1)가 종료되었다. break; case WAIT_OBJECT_0 + 1: // h[1]이 가리키는 프로세스(h. Process 2)가 종료되었다. break; case WAIT_OBJECT_0 + 2: // h[2]이 가리키는 프로세스(h. Process 3)가 종료되었다. break; case WAIT_TIMEOUT: // 프로세스가 5000밀리초 이내에 종료되지 않았다. break; case WAIT_FAILED: // 함수를 잘못 호출하였다(유효하지 않은 핸들 등) break; } 2009 -04 -28 호남대학교 정보통신공학과 6

Mutex Kernel Object #include<stdio. h> #include<tchar. h> #include<windows. h> #include<process. h> #include<math. h> #define

Mutex Kernel Object #include<stdio. h> #include<tchar. h> #include<windows. h> #include<process. h> #include<math. h> #define MAX_THREAD 3 static DWORD g_x = 0; //CRITICAL_SECTION g_cs; HANDLE h. Mutex; //CRITICAL_SECTION STRUCTURE UINT WINAPI Thread. Proc(PVOID pv. Param); void Increase. Count(); // 증가함수 // 스레드함수 int _tmain(int argc, LPTSTR argv[]) { HANDLE h. Thread[MAX_THREAD]; DWORD dw. Thread. ID[MAX_THREAD]; //CRITICAL_SECTION 초기화; //단일프로세서를가진머신일경우두번째인자값무시 //Initialize. Critical. Section. And. Spin. Count(&g_cs, 4000); 2009 -04 -28 호남대학교 정보통신공학과 9

Mutex Kernel Object h. Mutex = Create. Mutex( NULL, // 디폴트보안관리자. 상속무 FALSE, //

Mutex Kernel Object h. Mutex = Create. Mutex( NULL, // 디폴트보안관리자. 상속무 FALSE, // 누구나소유할수있는상태로생성 // TRUE일경우Mutex를생성한스레드가먼저기회를얻게된다 NULL // 이름없음 ); for(DWORD i = 0; i < MAX_THREAD; i++) { h. Thread[i] = (HANDLE)_beginthreadex( NULL, 0, Thread. Proc, NULL, CREATE_SUSPENDED, // 생성시일시정지(이유: 스레드생성시간차감소) (PUINT)&(dw. Thread. ID[i]) ); //create thread if(h. Thread[i] == NULL) { _tprintf( _T("Thread creation fault!n")); return -1; } } 2009 -04 -28 호남대학교 정보통신공학과 10

Mutex Kernel Object for(DWORD i = 0; i < MAX_THREAD; i++) Resume. Thread(h. Thread[i]);

Mutex Kernel Object for(DWORD i = 0; i < MAX_THREAD; i++) Resume. Thread(h. Thread[i]); // 스레드재개 Wait. For. Multiple. Objects(MAX_THREAD, h. Thread, TRUE, INFINITE); //signal 상태대기 //Delete. Critical. Section(&g_cs); //CRITICAL_SECTION 삭제 Close. Handle(h. Mutex); _tprintf( _T("sizeof(g_x): %d. Byte n") _T("MAX COUNT: %. 1 fn") _T("total count: %dn"), sizeof(g_x), pow(2. 0, (int)(sizeof(g_x) * 8)), g_x); for(DWORD i = 0; i < MAX_THREAD; i++) Close. Handle(h. Thread[i]); return (0); } 2009 -04 -28 호남대학교 정보통신공학과 11

Mutex Kernel Object UINT WINAPI Thread. Proc(PVOID pv. Param) { for(DWORD i =0; i

Mutex Kernel Object UINT WINAPI Thread. Proc(PVOID pv. Param) { for(DWORD i =0; i < 1000; i++) Increase. Count(); return (0); } void Increase. Count() { //Enter. Critical. Section(&g_cs); Wait. For. Single. Object(h. Mutex, INFINITE); g_x++; // Critical Section(임계영역) //Leave. Critical. Section(&g_cs); Release. Mutex(h. Mutex); } 2009 -04 -28 호남대학교 정보통신공학과 실행화면 12