프로세스는 동기화하지 않으면 겉보기엔 아무런 문제 없이 보이는 코드도 예기치 못하게 작동할 수 있습니다. 동기화를 위한 대표적인 도구인 뮤텍스 락, 세마포어, 모니터에 대해 알아봅니다.

옷가게에 마음에 드는 옷이 있으면 탈의실에 가는데, 이때 한 명의 인원만 들어갈 수 있습니다.
탈의실에서는 자물쇠를 걸면, 탈의실 안에 사람이 있다고 판단하고 밖의 사람은 기다립니다. 이 자물쇠 기능을 코드로 구현한 것이 바로 뮤텍스 락입니다.
뮤텍스 락의 매우 단순한 형태는 하나의 전역 변수와 두 개의 함수로 구현 가능합니다.
lock (전역 변수): 자물쇠 역할acquire 함수: 임계 구역을 잠그는 역할release 함수: 임계 구역의 잠금을 해제하는 역할동작 원리
1. acquire: 프로세스가 임계 구역에 진입하기 전에 호출합니다. 임계 구역이 잠겨 있다면 열릴 때까지 반복적으로 확인하고, 열려 있다면 잠급니다.
2. release: 임계 구역에서의 작업이 끝나고 호출합니다. 잠긴 임계 구역을 열어줍니다.
⚠️ 바쁜 대기 (Busy Waiting)
acquire함수는 임계 구역이 잠겨 있는지 반복적으로lock을 확인합니다. 이러한 대기 방식을 '바쁜 대기'라고 하며, CPU 주기를 낭비할 수 있습니다.

세마포어는 뮤텍스 락과 비슷하지만, 일반화된 방식의 동기화 도구입니다.
세마포어는 공유 자원이 여러 개 있는 상황에서도 적용이 가능하며, 멈춤 신호와 가도 좋다는 신호로서 임계 구역을 관리합니다.
S (전역 변수): 사용 가능한 공유 자원의 개수wait 함수: 임계 구역에 들어가도 좋은지, 기다려야 하는지 알려주는 함수signal 함수: 임계 구역 앞에서 기다리는 프로세스에 '가도 좋다'는 신호를 주는 함수뮤텍스와 동일하게 공유 자원이 없는 경우 무한히 S를 확인하는 바쁜 대기는 CPU 주기를 낭비합니다. 이를 해결하기 위해 세마포어는 큐를 활용합니다.
signal을 호출하면, 대기 큐에서 프로세스를 제거하고 준비 상태로 변경하여 준비 큐로 옮깁니다.
모니터는 공유 자원과 그 자원에 접근하기 위한 인터페이스를 묶어 관리하는 고수준 동기화 도구입니다.