모드 종류 |
설명 |
유저모드 |
응용 프로그램이 실행되는 기본모드로, 물리적인 영역으로의 접근이 허용 |
커널모드 |
운영체제가 실행될 때의 모드로, 메모리뿐만 아니라, 하드웨어의 접근에도 |
유저모드 및 커널모드에서 오브젝트 생성 및 리소스와의 연결
동기화와 쓰레드에 관한 함수 사용 순서
WaitForSignalObject함수
리소스에 따른 상태
동기화
모드 종류 |
설명 |
유저모드 |
속도가 빠름(커널모드로의 전환이 없음), 기능이 제한적, 하나의 프로세스 안의 |
커널모드 |
속도가 느림, 제공되는 기능이 많음, 서로 다른 프로세서간의 동기화 가능 기법 : Mutex, semaphore, event |
유저모드 동기화 기법
* CRITICAL_SECTION 기반의 동기화
CRITICAL_SECTION 오브젝트의 초기화함수(CRITICAL_SECTION 오브젝트와 리소스를 연결)
#include <windows.h>
void InitializerCriticalSection(LPCRITICAL_SECTION lpCriticalSection);
lpCriticalSection : 초기화 할 CRITICAL_SECTION 오브젝트의 주소 값 전달
유저모드로 프로그램 상에서 CRITICAL_SECTION 오브젝트를 생성해서 가지고 있고 이 오브젝트에 리소스를 연결만 하면 됨
그러므로 반환값으로 핸들을 받을 필요가 없음
CRITICAL_SECTION 오브젝트가 사용하던 리소스를 소멸시키는 함수
void DelecteCriticalSection(LPCRITICAL_SECTION lpCriticalSection);
lpCriticalSection : 해제할 CRITICAL_SECTION 오브젝트의 주소 값 전달
CRITICAL_SECTION 오브젝트의 소유함수
void EnterCriticalSection(LPCRITICAL_SECTION lpCriticalSection);
lpCriticalSection : 소유할 CRITICAL_SECTION 오브젝트의 주소 값 전달
CRITICAL_SECTION 오브젝트의 반납함수
void LeaveCriticalSection(LPCRITICAL_SECTION lpCriticalSection);
lpCriticalSection : 반납할 CRITICAL_SECTION 오브젝트의 주소 값 전달
커널모드 동기화 기법
1. Mutex(Mutual Exclusion) 오브젝트 기반 동기화
Mutex 오브젝트의 생성함수
#include <windows.h>
HANDLE CreateMutex(LPSECURITY_ATTRIBUTES lpMutexAttributes, BOOL bInitialOwner, LPCTSTR lpName);
성공시 생성된 Mutex 오브젝트의 핸들, 실패시 NULL반환
lpMutexAttributes : 보안 관련 특성 정보의 전달, 디폴트 보안설정을 위해서 NULL전달
bInitialOwner : TRUE 전달 시, 생성되는 Mutex 오브젝트는 이 함수를 호출환 쓰레드의 소유가 되면서
non-signaled 상태가 됨. 반면에 FALSE 전달 시, 생성되는 Mutex 오브젝트는 소유자가
존재하지 않으며, signaled 상태로 생성
lpName : Mutex 오브젝트에 이름을 부여할 때 사용된다. NULL을 전달하면 이름없는 Mutex 오브젝트가 생성
커널모드로 Mutex를 생성하면서 이 Mutex에 커널 오브젝트를 연결하고 이 커널 오브젝트의 주소
(핸들)을 반환함, 이 커널 오브젝트를 이용하여 Mutex를 이용할 수 있음
커널 오브젝트(mutex, semaphore, event등등) 소멸함수
BOOL CloseHandle(HANDLE hObject);
성공시 TRUE, 실패시 FALSE 반환
hObject : 소멸하고자 하는 커널 오브젝트의 핸들 전달
커널 오브젝트(mutex, semaphore, event, 쓰레드 등등) 획득함수
DWORD WaitForSingleObject(HANDLE Handle, DWORD dwMilliseconds);
성공하여 siganled상태로 인한 반환시 WAIT_OBJECT_0 반환하고 해당 커널 오브젝트를
non-signaled 상태로 되돌림, 실패시 WAIT_FAILED 반환, 타임아웃으로 반환시 WAIT_TIMEOUT 반환
Handle : 상태확인의 대상이 되는 커널 오브젝트의 핸들을 전달
dwMilliseconds : 1/1000초 단위로 타임아웃을 인정, 인자로 INFINITE 전달 시, 커널 오브젝트가
signaled 상태가 되기 전에는 반환하지 않음
mutex 반납함수
#include <windows.h>
BOOL ReleaseMutex(HANDLE hMutex);
성공시 TRUE, 실패시 FALSE 반환
hMutex : 반납할, 다시 말해서 소유를 해제할 Mutex 오브젝트의 핸들 전달
2. semaphore 오브젝트 기반 동기화
semaphore 오브젝트의 생성함수
#include <windows.h>
HANDLE CreateSemaphore(
LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, LONG lInitialCount, LONG lMaximumCount, LPCTSTR lpName);
성공시 생성된 Semaphore 오브젝트의 핸들, 실패 시 NULL 반환
lpSemaphoreAttributes : 보안관련 정보의 전달, 디폴트 보안설정을 위해서 NULL 전달
lInitialCount : 세마포어의 초기 값 지정, 매개변수 lMaximumCount에 전달된 값보다 크면 안되고, 0 이상이어야 함
lMaximumCount : 최대 세마포어 값을 지정, 1을 전달하면 세마포어 값이 0, 또는 1이 되는 바이너리 세마포어가 구성
lpName : Semaphore 오브젝트에 이름을 부여할 때 사용. NULL을 전달하면 이름없는 Semaphore 오브젝트가 생성
커널모드로 Semaphore를 생성하면서 이 Semaphore에 커널 오브젝트를 연결하고 이 커널 오브젝트의
주소(핸들)을 반환함, 이 커널 오브젝트를 이용하여 Semaphore를 이용할 수 있음
semaphore 오브젝트 소멸함수
semaphore 오브젝트 획득함수
semaphore 오브젝트 반납함수
#include <windows.h>
BOOL ReleaseSemaphore(HANDLE hSemaphore, LONG lReleaseCount, LPLONG lpPreviousCount);
성공 시 TRUE, 실패 시 FALSE 반환
hSemaphore : 반납할 Semaphore 오브젝트의 핸들 전달
lReleaseCount : 반납은 세마포어 값의 증가를 의미하는데, 이 매개변수를 통해서 증가되는 값의 크기를 지정할 수 있다. 그리고 이로 인해서 세마포어의 최대 값을 넘어서게 되면, 값은 증가하지 않고FALSE가 반환
lpPreviousCount : 변경 이전의 세마포어 값 저장을 위한 변수의 주소 값 전달, 불필요하다면 NULL 전달
3. Event 오브젝트 기반 동기화
event 오브젝트 생성시 2가지 모드
모드종류 |
상태 변화 |
auto-reset모드 |
WaitForSingleObject함수를 사용시 자동으로 signaled상태에서 non-signaled상태로 바꿈 |
manual-reset모드 |
WaitForSingleObject함수를 사용시 signaled상태를 유지 |
event 오브젝트의 생성함수
#include <windows.h>
HANDLE CreateEvent(
LPSECURITY_ATTRIBUTES lpEventAttributes, BOOL bManualReset, BOOL bInitialState, LPCTSTR lpName);
성공시 생성된 Event 오브젝트의 핸들, 실패시 NULL 반환
lpEventAttributes : 보안관련 정보의 전달, 디폴트 보안설정을 위해서 NULL 전달
bManualReset : TRUE 전달 시 manual-reset 모드 Evnet, FALSE 전달 시 auto-reset 모드 Event 오브젝트 생성
bInitialState : TRUE 전달 시 signaled 상태의 Event 오브젝트 생성, FALSE 전달 시 non-signaled 상태의
Event 오브젝트 생성
lpName : Event 오브젝트에 이름을 부여할 때 사용됨. NULL을 전달하면 이름이 없는 Event 오브젝트 생성
커널모드로 event를 생성하면서 이 event에 커널 오브젝트를 연결하고 이 커널 오브젝트의 주소
(핸들)을 반환함, 이 커널 오브젝트를 이용하여 event를 이용할 수 있음
event 오브젝트의 상태 변경 함수
#include <windows.h>
BOOL ResetEvent(HANDLE hEvent); // to the non-signaled
BOOL SetEvent(HANDLE hEvent); // to the signaled
성공 시 TRUE, 실패 시 FALSE 반환