본문 바로가기

공부/tcp/ip 프로그래밍

20장 windows에서의 쓰레드 동기화

반응형

20장.pptx

 

모드 종류 

설명 

 유저모드

 응용 프로그램이 실행되는 기본모드로, 물리적인 영역으로의 접근이 허용
되지 않으며, 접근할 수 있는 메모리의 영역에도 제한이 따른다

 커널모드

 운영체제가 실행될 때의 모드로, 메모리뿐만 아니라, 하드웨어의 접근에도
제한이 따르지 않음(리소스, 커널오브젝트에 관련된 모든 일)

 

유저모드 및 커널모드에서 오브젝트 생성 및 리소스와의 연결

 

동기화와 쓰레드에 관한 함수 사용 순서

 

WaitForSignalObject함수

 

리소스에 따른 상태

 

동기화

 모드 종류

 설명

 유저모드

 속도가 빠름(커널모드로의 전환이 없음), 기능이 제한적, 하나의 프로세스 안의
쓰레드 간의 동기화 가능
기법 : CRITICAL_SECTION

 커널모드

 속도가 느림, 제공되는 기능이 많음, 서로 다른 프로세서간의 동기화 가능
(운영체제에 의해 관리 및 소유되는 커널오브젝트를 기반으로 하기때문에)

기법 : 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등등) 소멸함수

#include <windows.h>

 

BOOL CloseHandle(HANDLE hObject);

성공시 TRUE, 실패시 FALSE 반환

 

hObject : 소멸하고자 하는 커널 오브젝트의 핸들 전달

 

커널 오브젝트(mutex, semaphore, event, 쓰레드 등등) 획득함수

#include <windows.h>

 

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 오브젝트 소멸함수

CloseHandle함수

 

semaphore 오브젝트 획득함수

WaitForSingleObject함수

 

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 반환

반응형