: 동기화는 컴파일의 문제가 아니라 런타임에서 발생하는 오류다. 이러한 오류는 눈에 띄지 않고 디버깅하기 힘든 오류이다.

: 쓰레드에 관련된 런타임 오류를 미리 예측하고 막는것이 더 쉽다.


1. 쓰레드 동기화란 무엇인가?

* 두가지 관점에서의 쓰레드 동기화

: 순서에 있어서 질서가 지켜지고 있음을 의미하는 동기화 이다.

- 실행순서의 동기화

: 쓰레드 간의 실행 순서를 정의하고 이 순서에 따르도록 하는 것이 쓰레드의 동기화이다.

- 메모리 접근에 대한 동기화

: 메모리 접근에 있어서 동시 접근을 막는 것 또한 쓰레드의 동기화이다.

* 쓰레드 동기화에 있어서의 두가지 방법

- 유저 모드 동기화

: 동기화 시 커널의 힘을 빌리지 않는다. 커널모드로 전환되지 않기 때문에 성능상 이점이 있지만, 기능상 제한도 있다.

- 커널 모드 동기화

: 커널에서 제공하는 동기화 기능을 활용하는 방법이다.

2. 임계영역(Critical Section) 접근 동기화

* 임계영역(Critical Section)에 대한 이해

: 쓰레드가 동시에 접근하여 문제의 원인이 될 수 있는 코드의 블록을 가리켜 임계 영역이라고 한다.

: 임계 영역이란 배타적 접근(한 순간에 하나의 쓰레드만 접근)이 요구되는 공유 리소스(전역변수와 같은)에 접근하는 코드 블록을 의미한다.

- 유저모드 동기화

1. 크리티컬 섹션 (Critical Section) 기반의 동기화 : 메모리 접근 동기화에 사용할 예정

2. 인터락 함수 (Interlocked Family Of Function) 기반의 동기화 : 메모리 접근 동기화에 사용할 예정

- 커널모드 동기화

3. 뮤텍스(Mutex) 기반의 동기화 : 메모리 접근 동기화에 사용할 예정

4. 세마포어(Semaphore) 기반의 동기화 : 메모리 접근 동기화에 사용할 예정

5. 이름있는 뮤텍스(Named Mutex) 기반의 프로세스 동기화 : 프로세스 간 동기화에 사용할 예정

6. 이벤트(Event) 기반의 동기화 : 실행순서 동기화에 사용할 예정

3. 유저모드의 동기화 (Synchronization In User Mode)

: 유저모드는 커널 모드에 비해 성능상 이점이 있고 활용 방법도 단순하다.

* 크리티컬 섹션(Critical Section) 기반의 동기화

: 크리티컬 섹션 오브젝트를 만든다.

: 초기화 한다. -> 쓰레드가 크리티컬 섹션 오브젝트를 가져간다 -> 그 이외 쓰레드는 Blocked 된다.

: 쓰레드가 크리티컬 섹션 오브젝트를 반환한다. -> blocked된 쓰레드 중 하나가 가져간다. -> 반복 후 -> 오브젝트를 제거한다.

* 인터락 함수 ( Interlocked Family Of Function ) 기반의 동기화

: 변수 하나에 대한 동기화를 할 때 유용하다.

: volatile 을 사용하면, 컴파일러가 최적화를 하지 않고 캐쉬되지 않고 메모리로 바로 저장한다.

4. 커널 모드 동기화 (Synchronization In Kernel Mode)

: 유저모드 보다 느리지만, 다양한 기능이 사용 가능하다.

* 뮤텍스(Mutex) 기반의 동기화

: 크리티컬 섹션과 비슷

: 함수를 통해 생성되는 뮤텍스는 커널 오브젝트이다.

: 뮤텍스는 누군가에 의해 획득이 가능할 때 Signaled 상태에 놓인다.

: 사용 중일 때에는 Non-Signaled 상태이다.

* 세마포어(Semaphore) 기반의 동기화

: 뮤텍스와 비슷하지만, 임계영역에 접근가능한 쓰레드 개수를 조절하는 기능이 있다.

: 키를 반환할 때, 카운트가 하나씩 줄어들어 0이 되었을 경우 더이상 임계영역에 접근이 불가능하다.

* 이름있는 뮤텍스(Named Mutex) 기반의 프로세스 동기화

: 뮤텍스가 커널 오브젝트 기반이라면, 서로 다른 프로세스에 있는 쓰레드 끼리의 동기화도 가능할 것이다.

: 하지만, 핸들 테이블의 유효성 때문에 한계에 부딫힌다.

: 이를 해결하기 위해 뮤텍스에게 이름을 붙여준 것이다.

* 뮤텍스의 소유와 WAIT_ABANDONED

: 뮤텍스의 소유 쓰레드가 예상치 못하게 종료되었을 때 커널은 이를 반환해주고 다른 쓰레드에게 WAIT_ABANDONED를 반환한다.


뇌를 자극하는 윈도우즈 시스템 프로그래밍
국내도서
저자 : 윤성우
출판 : 한빛미디어 2007.03.30
상세보기




+ Recent posts