Windows System Programming 동기화 기법

mohadang·2023년 5월 1일
0

Windows System Programming

목록 보기
10/17
post-thumbnail

동기화 관점

실행 순서 동기화

여러 쓰레드가 하나의 작업을 같이 처리하면서 실행 순서를 보장

메모리 접근 동기화

여러 쓰레드간 특정 메모리에 접근할때 반드시 하나의 쓰레드만 접근할 수 있도록 보장한다 즉 임계 영역을 설정한다. 접근 순서는 상관 없다. 임계 영역은 최소화 하여야 한다.

유저 모드 동기화

커널의 관리 없이 동기화 처리. 커널과 유저 영역 사이의 컨텍스트 스위칭 없음. 빠른 성능

커널 모드 동기화

OS에서 동기화 지원. OS 에서 기능을 제공하기에 다양한 기능 지원. 단 커널과 유저 영역 사이의 컨텍스트 스위칭 발생. 커널 모드 동기화는 커널 레벨에서 동기화 처리 하기에 여러 프로세스들 사이의 동기화 처리도 가능 하다.

유저 모드 동기화

크리티컬 섹션 기반 동기화

critical section object를 사용하여 동기화 한다.
획득한 critical section object는 작업이 끝나면 반드시 반환해야 한다.
클래스로 추상화 하여 사용 하는 것이 좋을 것 같다.

인터락 함수 기반 동기화

변수에 원자적으로 접근하여 연산 가능하다
크리티컬 섹션 처럼 생성한 후 소멸 관리를 하지 않아도 된다는 점에서 좋다.

커널 모드 동기화

뮤텍스 기반 동기화

세마포어는 임계영역에 접근하기 위한 키가 하나 존재
그래서 임계영역에 접근할 수 있는 쓰레드는 하나만 가능

이름있는 뮤텍스 기반 동기화

lpName : 이름있는 뮤텍스를 사용하면 프로세스끼리 동기화 가능하다

세마포어 기반 동기화

세마포어는 임계영역에 접근하기 위한 키가 다수가 존재
그래서 임계영역에 접근할 수 있는 쓰레드 갯수를 조절 가능

initialCount : 초기 키 갯수
lMaximumCount : 최대 키 갯수
lMaximumCount는 initialCount 보다 크거나 같아야 한다.

Windows 소유의 관점에서 세마포어와 뮤텍스의 차이점

접근 쓰레드 갯수 이외에 다른 차이점이 있다.

뮤텍스는 WAIT_ABANDONED 결과가 반환 되는 경우가 있는데 이는 뮤텍스를 소유한 스레드가 적절하게 반환 과정을 거치지 않고 종료하여 OS에서 대신 반환 한 것이다.

반면 세마포어는 카운트 갯수로 관리를 하며 키를 반환하지 않고 종료하여도 WAIT_ABANDONED 같은 반환이 이뤄지지 않는다. 심지어 다른 쓰레드가 대신 반환을 할 수 있으며 이때는 키 카운트값이 증가를 할뿐 동작에 문제가 없다. 대신 이런 동작은 지양해야 한다.

순서 동기화

순서 동기화가 필요한 대표적인 케이스 : 생성자/소비타 패턴

이벤트 기반 동기화

자동 리셋 모드 이벤트 : 커널 오브젝트가 Signaled 상태가 되면 WaitForSingleObject의 블록이 해제되면서 자동으로 커널 오브젝트가 Non-Signaled 상태가 된다.

수동 리셋 모드 이벤트 : 커널 오브젝트가 Signaled 상태가 되면 자동으로 Non-Signaled 상태가 되는것이 아니라 ResetEvent를 호출해야 Non-Signaled 상태로 전환됨.

타이머 기반 동기화

타이머는 주기적으로 이벤트를 발생 시킨다.
타이머를 실행하는 시간과 이벤트를 발생 시키는 주기를 설정할 수 있다.

profile
mohadang

0개의 댓글