* 해당 글은 윤성우의 뇌를 자극하는 윈도우즈 시스템 프로그래밍 도서를 읽고 정리한 글입니다
https://product.kyobobook.co.kr/detail/S000001223395
뇌를 자극하는 윈도우즈 시스템 프로그래밍 | 윤성우 - 교보문고
뇌를 자극하는 윈도우즈 시스템 프로그래밍 |
product.kyobobook.co.kr
* 실행 순서의 동기화
쓰레드의 실행순서를 정의하고, 이 순서를 반드시 따르도록 하는 것
* 메모리 접근에 대한 동기화
메모리 접근에 있어서 동시 접근을 막는 것
* 유저 모드 동기화(User Mode Synchronize)
: 동기화가 진행되는 과정에서 커널 코드가 실행되지 않는 동기화 기법
(1) 크리티컬 섹션 기반의 동기화 → 메모리 접근 동기화
- 전역으로 선언된 변수 하나의 접근방식을 동기화하는 것이 목적
- 임계 영역(Critical Section) : 배타적 접근이 요구되는 공유 리소스에 접근하는 코드 블록
- 블로킹 : 이 책에서 막다, 차단하다는 의미
(2) 인터락 함수(Interlocked Family Of Function) 기반의 동기화 → 메모리 접근 동기화
- 크리티컬 섹션 기반의 동기화 용도로 특화된 함수
- 함수 내부적으로 한 순간에 하나의 쓰레드에 의해서만 실행되어 있도록 동기화(Atomic Access 보장)
- InterlockedIncrement, InterlackedDecrement
* 커널 모드 동기화(Kernel Mode Synchronize)
: 커널에서 제공하는 동기화 기능을 활용하는 방법
(1) 뮤텍스(Mutex) 기반의 동기화 → 메모리 접근 동기화
- 세마포어 중에서 단순화된 세마포어(바이너리 세마포어를 의미)를 가리켜 뮤텍스라 함
- CreateMutex 함수
HANDLE CreateMutexA(
[in, optional] LPSECURITY_ATTRIBUTES lpMutexAttributes,
[in] BOOL bInitialOwner,
[in, optional] LPCSTR lpName
);
lpMutexAttributes
: 보안 속성 지정
bInitialOwner
: TRUE를 전달한 경우, 뮤텍스를 생성한 쓰레드가 먼저 기회를 얻는다
FALSE를 전달한 경우, 먼저 차지하는 사람이 임자가 된다
lpName
: 뮤텍스 이름
이 인자에 NULL을 전달하면 이름없는 뮤텍스,
이 인자에 이름을 전달하면 Named Mutex(이름있는 뮤텍스)라 표현한다
https://learn.microsoft.com/ko-kr/windows/win32/api/synchapi/nf-synchapi-createmutexa
CreateMutexA 함수(synchapi.h) - Win32 apps
명명되거나 명명되지 않은 뮤텍스 개체를 만들거나 엽니다. (ANSI)
learn.microsoft.com
(2) 세마포어(Semaphore) 기반의 동기화 → 메모리 접근 동기화
- CreateSemaphore 함수
HANDLE CreateSemaphoreA(
[in, optional] LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,
[in] LONG lInitialCount,
[in] LONG lMaximumCount,
[in, optional] LPCSTR lpName
);
lpSemaphoreAttributes
: 보안 속성 지정
lInitialCount
: 세마포어 초기값
lMaximumCount
: 세마포어 최대값
lpName
: 세마포어 이름
이 인자에 NULL을 전달하면 이름없는 세마포어,
이 인자에 이름을 전달하면 이름있는 세마포어라 표현한다
https://learn.microsoft.com/ko-kr/windows/win32/api/winbase/nf-winbase-createsemaphorea
CreateSemaphoreA 함수(winbase.h) - Win32 apps
명명되거나 명명되지 않은 세마포 개체를 만들거나 엽니다. (CreateSemaphoreA)
learn.microsoft.com
(+) 이름있는 뮤텍스(Named Mutex) 기반의 프로세스간 동기화
- CreateMutex, OpenMutex
(3) 이벤트(Event) 기반의 동기화 → 실행 순서 동기화
- 생상자/소비자 모델
- Signaled → Non-Signaled
- Signaled 상태에서 Non-Signaled 상태로 직접 변경해줘야 한다면 수동 리셋 모드(Manual-Reset 모드)
Non-Signaled 상태로 자동 변환되면, 자동 리셋 모드(Auto-Reset 모드)
- CreateEvent 함수, ResetEvent 함수, SetEvent 함수
https://learn.microsoft.com/ko-kr/windows/win32/api/synchapi/nf-synchapi-createeventa
CreateEventA 함수(synchapi.h) - Win32 apps
명명되거나 명명되지 않은 이벤트 개체를 만들거나 엽니다. (ANSI)
learn.microsoft.com
https://learn.microsoft.com/ko-kr/windows/win32/api/synchapi/nf-synchapi-resetevent
ResetEvent 함수(synchapi.h) - Win32 apps
지정된 이벤트 개체를 부호 없는 상태로 설정합니다.
learn.microsoft.com
https://learn.microsoft.com/ko-kr/windows/win32/api/synchapi/nf-synchapi-setevent
SetEvent 함수(synchapi.h) - Win32 apps
지정된 이벤트 개체를 신호 상태로 설정합니다.
learn.microsoft.com
* volatile
최적화를 수행하지 말라
* 이벤트(Event) + 뮤텍스(Mutex)
* 타이머(Waitable Timer) 기반의 동기화
- 정해진 시간이 지나면 자동으로 Signaled 상태가 됨
- 수동 리셋 타이머(Manual-Reset Timer), 주기적 타이머(Periodic-Timer)
'IT공부 > IT서적' 카테고리의 다른 글
[뇌를 자극하는 윈도우즈 시스템 프로그래밍] 17장. 구조적 예외처리(SEH) 기법 (0) | 2025.02.25 |
---|---|
[뇌를 자극하는 윈도우즈 시스템 프로그래밍] 15장. 쓰레드 풀링(Pooling), 16장. 컴퓨터 구조 - 4 (0) | 2025.02.20 |
[뇌를 자극하는 윈도우즈 시스템 프로그래밍] 12장. 쓰레드의 생성과 소멸 (0) | 2025.02.13 |
[윤성우 열혈 C프로그래밍] 릴리즈 빌드(최적화 컴파일러 OFF), 어셈블리 코드 - Chapter25 (0) | 2025.02.12 |
[윤성우 열혈 C프로그래밍] 릴리즈 빌드(최적화 컴파일러 OFF), 어셈블리 코드 - Chapter24, Chapter26, Chapter27 (0) | 2025.02.11 |