동시다발적으로 실행되는 많은 프로세스는 서로 데이터를 주고 받으며 협력하며 실행될 수 있습니다. 협력하며 실행되는 프로세스들은 실행 순서와 자원의 일관성을 보장해야 하기에 반드시 동기화(synchronization)되어야 합니다.
동기화(synchronization): 작업들 사이의 수행 시기를 맞추는 것
프로세스 동기화란 특정 자원에 접근할 때 한 개의 프로세스만 접근하게 하거나, 프로세스를 올바른 순서대로 실행하게 하는 것을 의미합니다.
동기화에는 실행 순서 제어를 위한 동기화, 상호 배제를 위한 동기화가 있습니다.
뮤텍스는 임계 구역을 잠금으로써 프로세스 간 상호 배제(한 프로세스가 임계 구역에 진입했을 때 다른 프로세스가 진입하지 못함)를 달성한다.
예를 들어, 하나의 탈의실에 사람들(프로세스)이 줄을 서고 이용하는 상황
밖에서 탈의실에 사람이 있는지 확인하려면?
일단 탈의실을 열어 보고 자물쇠가 걸려 있다면 안에 사람이 있다고 판단하고 기다린다.
자물쇠가 걸려 있지 않다면 탈의실을 이용한다.
이 자물쇠 기능을 코드로 구현한 것이 '뮤텍스 락'이다.
자물쇠 역할: 프로세스들이 공유하는 전역 변수 lock
임계 구역을 잠그는 역할: acquire(), 프로세스가 임계 구역에 진입하기 전에 호출한다. 임계 구역이 잠겨 있다면 임계 구역이 열릴 때 까지 임계 구역을 반복적으로 확인하고, 열려 있다면 임계 구역을 잠그는 함수이다.
임계 구역의 잠금을 해제하는 역할: release(), 임계 구역에서의 작업이 끝나고 호출하는 함수이다. 잠금을 풀어준다.
프로세스는 다음과 같이 임계 구역을 보호한다.
락을 획득할 수 없다면 기다린다. (반복적으로 확인한다.)
락을 획득할 수 있다면 임계 구역을 잠근 뒤 임계 구역에서의 작업을 진행한다.
임계 구역에서 나올 때는 임계 구역의 잠금을 해제한다.
세마포어는 공유 자원이 여러 개 있는 임계 구역 문제도 해결할 수 있는 동기화 도구이다.
탈의실이 여러 개 있는 상황.
공유 자원이 여러 개 있을 경우 여러 개의 프로세스가 각각 공유 자원에 접근이 가능해야 한다.
세마포어는 다음과 같이 구현된다.
임계 구역에 진입할 수 있는 프로세스의 개수(사용 가능한 공유 자원의 수)를 나타내는 전역 변수 S
wait(): 임계 구역에 진입할 수 있는 프로세스 개수가 0개 이하라면, 사용할 수 있는 자원이 있는지 반복적으로 확인하고, 진입 가능한 프로세스 개수가 하나 이상이면 S를 1 감소시키고 임계 구역으로 진입한다.
signal(): 임계 구역에서의 작업을 마친 뒤 S를 1 증가시킨다.
S = 2, 프로세스 A, B, C
프로세스 A가 wait() 호출. S = 2 이므로, 1 감소 시키고 임계 구역 진입
프로세스 B가 wait() 호출. S = 1 이므로, 1 감소 시키고 임계 구역 진입
프로세스 C가 wate() 호출. S = 0 이므로, 무한히 반복하며 S 확인
프로세스 A의 임계 구역 작업 종료. signal() 호출. S를 1 증가
프로세스 C가 S = 1 임을 확인. S를 1 감소 시키고 임계 구역 진입
뮤텍스(Mutex)와 이진 세마포어의 차이에 대해 설명해주세요.
모니터에 대해 설명해주세요.
Reference