뮤텍스 락
,세마포
,모니터
프로세스를 동기화하지 않으면겉보기에 아무런 문제 없어 보이는 코드도 예기치 못하게 작동할 수 있습니다. 이번 절에서는 동기화를 위한 대표적인 도구인 뮤텍스 락, 세마포, 모니터에 대해 알아보겠습니다.
공중 화장실을 '임계 구역', 사용자를 '프로세스'라고 하면 잠금 장치에 해당하는 용어를 뮤텍스 락(Mutex lock; MUTual EXclusion lock)
이라고 한다. 상호 배제를 위한 동기화 도구로 아래와 같은 요소들로 구현할 수 있다.
* 함수 코드는 책 본문 참고
바쁜 대기
방식 포함)세마포(semaphore)
는 공유 자원이 여러 개 있는 상황에서도 적용이 가능한 동기화 도구이다. 뮤텍스 락은 하나의 공유 자원에 접근하는 프로세스를 상정한 방식이라는 점에서 차별성을 둔다. 아래와 같은 요소들로 구현할 수 있다.
뮤텍스 락과 마찬가지로 바쁜 대기를 해야한다는 문제는 CPU 주기를 낭비한다는 점에서 손해다. 그래서 세마포는 wait 함수를 사용해 사용할 수 없는 자원이 없을 경우 해당 프로세스 상태를 대기 상태로 만들고, 그 프로세스의 PCB를 세마포를 위한 대기 큐에 집어넣는다. 그리고 다른 프로세스가 임계 구역에서의 작업이 끝나고 signal 함수를 호출하면 대기 중인 프로세스를 대기 큐에서 제거하고, 프로세스 상태를 준비 상태로 변경한 뒤 준비 큐로 옮겨준다.
세마포는 매번 임계 구역에 앞뒤로 일일이 wait와 signal 함수를 명시하기 번거롭고, 순서를 헷갈린 경우 등 문제가 발생할 수 있다. 이를 위한 동기화 도구가 모니터(monitor)
다. 공유 자원과 공유 자원 접근 인터페이스를 묶어 관리하고 프로세스는 반드시 인터페이스를 통해서만 공유 자원에 접근하도록 한다.
모니터는 특정 조건을 바탕으로 프로세스 실행과 중단을 위해 조건 변수(condition variable)
를 사용해 실행 순서 제어 동기화도 제공한다. 더 자세한 내용은 링크의 자료에서 알아보자.