동기화
dev_hun
2022. 9. 21. 15:59
2022. 9. 21. 15:59
동기화 객체란?
- 여러 쓰레드가 동시에 접근할 수 있는 영역에 쓰레드의 접근 순서를 맞추기 위해 사용하는 객체를 말합니다.
- 동기화 객체는 크게 유저 모드 동기화 객체, 커널 모드 동기화 객체 가 있습니다.
동기화 객체를 사용하는 이유
- 여러 쓰레드에서 접근할 수 있는 영역의 데이터를 특정 쓰레드가 변경하고 있을 때 다른 쓰레드가 접근하여 동일한 데이터를 읽거나 쓰기를 하여 의도하지 않은 결과가 발생될 수 있기 때문입니다.
유저 모드 동기화 객체의 특징 및 종류
유저 모드 동기화 객체의 특징
- 자원에 대한 접근이 가능한지 여부를 유저 모드 상태에서 확인합니다.
- CriticalSection, SRWLock 은 스핀 락의 일부 기능을 응용하여 스핀 카운트 만큼 루프를 돌면서 자원에 대한 접근이 가능한지 여부를 확인합니다.
- 스핀 카운트를 모두 소모하고 자원에 대한 접근이 불가능할 경우 커널 모드로 전환되어 접근이 가능해질 때까지 블락됩니다.
유저 모드 동기화 객체의 종류
- 유저 모드 동기화 객체의 종류로는 CriticalSection, SRWLock 이 있습니다.
CriticalSection
- 배타적인 접근만을 허용합니다.
- 중복락이 가능합니다.
SRWLock
- Read, Write 락을 구분하여 사용할 수 있습니다.
- 중복락이 불가능합니다.
커널 모드 동기화 객체의 특징 및 종류
커널 모드 동기화 객체의 특징
- 자원에 대한 접근이 가능한지 여부 조차도 커널 모드로 전환하여 확인합니다.
- 커널 모드 객체이기 때문에 다른 프로세스에 있는 쓰레드간에 동기화에도 사용될 수 있습니다.
- 커널 모드의 시그널 상태 여부를 확인하여 동기화를 할 수 있습니다.
- WaitForSingleObject, WaitForMultipleObject 등을 통해 커널 오브젝트의 시그널을 확인합니다.
커널 모드 동기화 객체의 종류
- 커널 모드 동기화 객체의 종류로는 Mutex, Semaphore, Event 등이 있습니다.
Mutex
- 배타적인 접근만을 허용합니다.
- 중복락이 가능합니다.
Semaphore
- 한 번에 접근할 수 있는 쓰레드의 개수를 지정할 수 있습니다.
Event
- Event 는 Manual 또는 Auto 여부에 따라서 작동 방식이 달라지는 커널 모드 동기화 객체입니다.
- Manual Event는 넌 시그널 상태에서 시그널 상태로 전환되었을 때 해당 Event의 시그널을 대기하고 있던 모든 쓰레드들을 깨우고 현재의 시그널 상태를 유지합니다.
- Auto Event는 넌 시그널 상태에서 시그널 상태로 전환되었을 때 해당 Event의 시그널을 대기하고 있던 쓰레드들 중 하나를 깨우고 자동으로 넌 시그널 상태로 전환됩니다.