반응형

임계영역( = Critical Section)

둘 이상의 스레드가 공유 자원에 접근할 때, 오직 한 스레드만 접근을 허용해야 하는 경우에 사용한다.

일반 동기화 객체와 달리 개별 프로세스의 유저(user) 메모리 영역에 존재하는 단순한 구조체이다.

따라서 다른 프로세스가 접근할 수 없으므로 한 프로세스에 속한 스레드 간 동기화에만 사용한다.

일반 동기화 객체보다 빠르고 효율적이다.

 

임계영역( = Critical Section)은 유저 메모리 영역에 생성한다.( 대게 전역 변수 형태로)

(함수 : InitalizeCriticalSection, EnterCriticalSection, LeaveCriticalSection, DeleteCriticalSection)

 

특징

커널 객체를 사용하지 않는다. -> 그래서 빠르고 효율적

서로 다른 프로세스간에 접근이 불가하다.

 

비교

1. 크리티컬 섹션의 경우에는 사용자 객체를 사용하여 커널 객체를 사용하는 것보다 가볍고 빠르다.

그러나, 한 프로세스 내의 쓰레드사이에서만 동기화가 가능하다.

즉, 가볍고 쉽게 쓸 수 있는 동기화 객체

 

2. 뮤텍스는 커널 객체를 사용한다. 그래서 크리티컬 섹션보다는 무겁다.

크리티컬 섹션이 한 프로세스 내의 쓰레드 사이에서만 동기화가 가능한 반면, 

뮤텍스는 여러 프로세스의 스레드 사이에서 동기화가 가능하다.

뮤텍스를 가장 흔히 사용하는 예가 프로세스 다중 실행을 막을 때, 이런 기능은 크리티컬 섹션으로 불가능하다.

 

3. 세마포어도 커널 객체를 사용한다.

크리티컬 섹션과 뮤텍스는 동기화 함에 있어서 동시에 하나의 쓰레드만 실행되게 하는 것에 반하여,

세마포어는 지정된 수만큼의 쓰레드가 동시에 실행되도록 동기화하는 것이 가능하다.

지정된 수보다 작거나, 같을 때까지 쓰레드의 실행을 허용하고, 지정된 수를 넘어서 쓰레드가 실행되려 하면 실행을 막는다.

 

사용

VOID InitalizeCriticalSection(LPCRITICAL_SECTION IpCriticalSection); -> 초기화

VOID DeleteCriticalSection(LPCRITICAL_SECTION IpCriticalSection); -> 파괴

 

VOID EnterCriticalSection(LPCRITICAL_SECTION IpCriticalSection);

: 처음에 들어온 것은 접근 권한을 주지만, 리소스를 선점 중인 다른 대상이 있다면,

그 이후의 접근은 대기시킨다.(스레드가 대기 상태로 변하므로 CPU의 시간을 낭비하지 않게 된다.)

VOID LeaveCriticalSection(LPCRITICAL_SECTION IpCriticalSection);

: CRITICAL_SECTION을 갱신한다.

 

주의할 점

만일 LeaveCriticalSection을 사용하지 않을 경우, 대기 중인 스레드는 작업이 끝나지 않았다고 보고

계속해서 대기하게 된다.

 

참고 출처

TCP/IP 윈도우 소켓 프로그래밍 『김선우 저』

https://genesis8.tistory.com/154

 

크리티컬 섹션(Critical Section)

크리티컬 섹션 운영체제가 지원하는 동기화 방법의 하나로 크리티컬 섹션(Critical Section)은 번역하자면 '임계 구역' 혹은 '치명적 영역' 이라고 할 수 있다. 치명적 영역은 보호되어야하듯이, 이 �

genesis8.tistory.com

 

반응형

'Etc > 소켓 프로그래밍' 카테고리의 다른 글

스레드 동기화(Thread synchronization)  (0) 2020.08.31

+ Recent posts