
오늘은 비동기 환경에서 Critical Section, Semaphore, SpinLock, Mutex 메커니즘에 대해서 알아보겠다.
동기화 메커니즘 모두 synchronizing objects 라는 목표가 있다.
이걸 알고 넘어가는게 중요하다. 큰 틀에서 보면 모두 한 스레드 이상의 컨텍스트에서 자원을 관리하는 것이기 때문이다.
하지만 세부적으로 봤을 때 다 사용 역할이 다르다.
크리티컬 섹션, 임계 영역이라고도 한다.
이걸 알아야 이후의 동기화 메커니즘들이 이해가 될 것이다.
크리티컬 섹션은 공유되는 자원, 즉 동시접근하려고 하는 자원에서 문제가 발생하지 않게 독점을 보장해줘야 하는 영역이다. 크리티컬 섹션은 지정된 시간이 지난 후 종료된다.
지정된 시간이 종료된다는 의미는, 프로그램 실행 중 특정 조건이 만족되면 임계 구역이 종료된다는 것을 의미한다.
일반적으로 알려진 P(wait)와 V(signal) 연산으로 동작하는 세마포어다. P(wait)가 현재 공유 자원을 점유하는 연산이고, V(signal)가 점유를 해제하는 연산이다.
P 연산 시 0이 아닐 때 까지 대기하는 스레드 큐에 추가되고, V 연산 시 대기 중인 스레드 큐를 깨워 넘겨준다.
이 세마포어는 여러 자원을 관리할 때 사용하며 추상화로 구현된다.
Mutex는 상호 배제를 보장하는 동기화 메커니즘이다. 한 쓰레드에서 자원을 사용하고 있을 때, 다른 쓰레드가 접근을 못하게 한다.
Mutex는 세마포어와 다르게 소유권(Ownership)이 존재한다. 즉, 한 쓰레드가 크리티컬 섹션을 획득(Acquired)하면 그 쓰레드에서 해제(Released)를 해줘야 한다.
세마포어와 다른점이 하나 밖에 없다. 즉, 세마포어는 뮤텍스가 될 수 있다!
SpinLock은 대기 큐에 종속되지 않는 Busy Wait 방식을 사용한다. 이 Busy Wait이란 대기 큐에 Sleep되지 않고 Lock을 얻을 때까지 시도하는 방법이다. 때문에 이 방식은 빠른 Context Switching에 적합하다. 무겁지 않고 CPU 자원을 많이 쓰기 때문이다.
다음 포스팅에선 이 동기화 메커니즘들을 왜 사용하는지 알아보겠다.
참조