.

크리티컬 섹션(Critical Section) 기반의 동기화란 무엇일까 ??

멀티쓰레드 기반 프로그래밍을 할 때 공유된 자원에 여러개의 쓰레드가 접근하는 문제점이 생긴다. 특히 여러 쓰레드가 동일한 변수의 값을 참조해 변경하는 상황에서는 A 쓰레드가 해당 변수를 레지스터로 불러와 ALU 에서 값을 변경하고 Wirte 하기 이전에 컨텍스트 스위칭이 일어나 B 쓰레드에서 해당 변수의 값을 변경해 메모리에 Write 할 경우 A 쓰레드는 해당 변수의 값을 실제로 변경하였지만 메모리에 Wirte 하지 못하고 B 쓰레드에서 메모리의 값을 이미 변경해버렸기 때문에 A 쓰레드의 연산 결과는 반영되지 못한다. 여기서 공유된 자원을 여러개의 쓰레드가 접근할 가능성이 있는 코드블록을 가리켜 “임계 영역”(Critical Section)이라 부르고 크리티컬 섹션 기반의 동기화란 공유된 자원을 한번에 하나의 쓰레드만 접근하도록 허용시키므로써 동기화 하는것을 뜻한다.

Window 에서 제공하는 API

Critical Section Object: Initialize and Delete.

1
2
3
CRITICAL_SECTION hCriticalSection;
InitializeCriticalSection (CRITICAL_SECTION*);
DeleteCriticalSection (CRITICAL_SECTION*);

CRITICAL_SECTION

해당 타입은 Windows API 에서 정의한 크리티컬섹션 오브젝트를 뜻한다.

InitializeCriticalSection (CRITICAL_SECTION*)

해당 API 함수는 임계영역 오브젝트를 삭제한다.

DeleteCriticalSection (CRITICAL_SECTION*)

해당 함수는 임계영역 오브젝트를 초기화 하는 작업을 수행한다.

Use of Critical Section Objects : Authorization and return.

1
2
EnterCriticalSection (CRITICAL_SECTION*);
LeaveCriticalSection (CRITICAL_SECTION*);

EnterCriticalSection (CRITICAL_SECTION*)

해당 함수는 크리티컬 섹션 코드 블록에 진입하기전 호출을 필요로 한다. 이미 임계영역에 진입한 쓰레드가 있을 경우 이 함수를 호출한 쓰레드는 임계영역의 반납전까지 Blocked 상태로 놓이게 된다. 공유된 자원을 사용하기 위해 자물쇠(크리티컬섹션)의 열쇠를 획득한다고도 비유하고 싶다. 해당 행위를 임계영역을 “획득”하였다고도 표현한다.

LeaveCriticalSection (CRITICAL_SECTION*);

해당 함수는 공유된 리소스로 작업을 완료하였다면 다른 쓰레드를 위해서 임계영역의 권한을 반납해야한다. 임계영역의 진입을 위해 대기하던 쓰레드 (Blocked) 가 존재한다면 여기서 권한을 반납하는 순간 Blocked 상태에 빠진 쓰레드 하나는 임계영역을 획득하고 해당 코드블록으로 진입한다.

Lin