운영체제의 동기화 기법
동기화란?
작업들 사이의 수행 시기를 맞추는 것. 사건이 동시에 일어나거나, 일정한 간격을 두고 일어나도록 시간의 간격을 조정하는 것을 이른다. -네이버 국어사전-
국어사전에 따르면 ‘동기화’에 대해 위와 같이 설명하고 있다.
컴퓨터 과학에서도 비슷한 의미로 통용되는데, 작업들의 수행 시기를 맞추면서 여러 프로세스가 공유하고 있는 자원이 일관되게 유지될 수 있도록 하는 방법이다.
동기화는 여러 프로세스가 접근하는 공유자원을 사용할 때 중요한 화두로 떠오르는데, 예기치 않은 데이터의 접근과 변경으로 다른 프로세스의 작동에 영향을 끼칠 수 있기 때문이다.
이런 공유자원에 2개 이상의 프로세스가 접근해서 데이터를 조작하는 상황을 경쟁 상태(race condition)이라 하며, 프로세스의 접근 순서나 처리 속도에 따라 결과값에 영향을 줄 수 있다. 이는 다양한 동시성에 관련된 문제들을 야기한다.
그래서 공유 자원 접근 순서에 따라 결과에 영향을 끼칠 수 있는 코드 블럭을 임계 영역(critical section)이라고 하며, 해당 구역에서 발생하는 문제들을 다루기 위해 다양한 동기화 기법들이 고안되었다.
Mutex
뮤텍스는 임계구역에서의 코드 실행을 서로 겹치지 않게, 각 스레드 or 프로세스가 단독으로 실행하게 하는 동기화 기법이다. 공유 자원에 대한 접근을 Locking, Unlocking을 사용해 조율하며, 뮤텍스 객체를 두 스레드가 동시에 사용할 수 없다.
쉬운 예시로 화장실을 많이 드는 것 같다.
음식점에서 공용 화장실을 이용할 때 우리는 가게에 있는 열쇠를 획득 후 간다. 다음 손님은 이전 손님이 공용 화장실에 대한 열쇠를 반납하기 전까지는 접근할 수 없다. 즉, Lock에 대한 소유권이 Lock을 가진 사람에게 있다는 것이다.
종류 | 동시 실행 횟수 | 외부 락 해제 |
---|---|---|
Mutex | 1 | X |
Semaphore
세마포어와 뮤텍스의 결정적인 차이점은 동시에 실행가능한 프로세스 or 스레드의 갯수와 외부에서 lock을 해제할 수 있는지의 여부이다.
세마포어는 다음과 같은 3가지의 값으로 상태를 제어한다.
- initialize : 세마포어 초기화 (카운터 초기화)
- decrement : 잠금 (카운터 감소)
- increment : 해제 (카운터 증가)
세마포어는 공용 화장실의 칸이 여러 개 있고, 노크를 해서 화장실을 이용하고 있는 손님을 밖으로 불러낼 수 있다는 점이 다르다. Lock에 대한 소유권이 Lock을 가진 사람뿐만 아니라 외부에도 있고, 동시에 여러 작업이 수행될 수 있다는 점이 Mutex와의 결정적인 차이점이다.
위의 항목을 기억한다면 이진 세마포어와 뮤텍스는 차이가 있음을 발견할 수 있다. 이진 세마포어는 카운터의 값이 1이라서 동시에 실행가능한 프로세스 or 스레드가 뮤텍스와 같이 1개뿐이지만, 세부적인 작동 사항에서는 약간 다르다는 것을 알 수 있다.
종류 | 동시 실행 횟수 | 외부 락 해제 |
---|---|---|
Mutex | 1 | X |
Semaphore | N | O |
참고
Splin, Operating System : 뮤텍스(Mutex) / 세마포어(Semaphore) / 모니터(Monitor), https://dev-splin.github.io/cs(computer%20science)/operating%20system/OS-Mutex,Semaphore,Monitor/
chappi, OS는 할껀데 핵심만 합니다. 8편 Critical section (임계 구역), https://velog.io/@chappi/OS%EB%8A%94-%ED%95%A0%EA%BB%80%EB%8D%B0-%ED%95%B5%EC%8B%AC%EB%A7%8C-%ED%95%A9%EB%8B%88%EB%8B%A4.-8%ED%8E%B8-Critical-section-%EC%9E%84%EA%B3%84-%EA%B5%AC%EC%97%AD