1. 뮤텍스 락
: 상호배제를 위한 동기화 도구(자물쇠 역할), 뮤텍스 락
> 뮤텍스 락의 단순한 형태
- 전역 변수 하나, 함수 두 개
- 자물쇠 역할 : 프로세스들이 공유하는 전역 변수 lock
- 임계 구역을 잠그는 역할 : acquire 함수
- 임계 구역의 잠금을 해제하는 역할 : release 함수

1) acquire 함수
- 프로세스가 임계 구역에 진입하기 전에 호출
- 임계 구역이 잠겨 있다면 열릴 때까지 임계 구역을 반복적으로 확인(lock이 false가 될 때까지)
- 임계 구역이 열려 있다면 임계 구역을 잠그기(lock을 true로 바꾸기)
2) release 함수
- 임계 구역에서의 작업이 끝나고 호출
- 현재 잠긴 임계 구역을 열기(lock을 false로 바꾸기)
3) 바쁜 대기(busy-waiting)
- 임계구역이 잠겨있는지를 반복적으로(무한히) 확인하는 것은 좋은 방법이 아님
2. 세마포
- 좀 더 일반화된 방식의 동기화 도구
- 공유자원이 여러개 있는 경우에도 적용 가능
- 임계 구역 앞에서 멈춤 신호를 받으면 잠시 기다리기
- 임계 구역 앞에서 가도 좋다는 신호를 받으면 임계 구역 진입
(ex. 철도 신호기)
> 세마포의 단순한 형태
- 전역 변수 하나, 함수 두 개
- 임계 구역에 진입할 수 있는 프로세스의 개수(사용 가능한 공유 자원의 개수)를 나타내는 전역변수 S
- 임계 구역에 들어가도 좋은지, 기다려야 할지를 알려주는 wait 함수
- 임계 구역 앞에서 기다리는 프로세스에 '이제 가도 좋다'고 신호를 주는 signal 함수



+ Busy Waiting(바쁜 대기)을 통해 뮤텍스 락과 마찬가지로 CPU의 사이클을 낭비할 수 있음
=> 해결방법
- 사용할 수 있는 자원이 없을 경우 대기상태로 만듦
(해당 프로세스의 PCB를 대기 큐에 삽입)
- 사용할 수 있는 자원이 생겼을 경우 대기 큐의 프로세스를 준비상태로 만듦
(해당 프로세스의 PCB를 대기 큐에서 꺼내 준비 큐에 삽입)


3. 모니터
1) 상호 배제를 위한 동기화
- 인터페이스를 위한 큐
- 공유자원에 접근하고자 하는 프로세스를 (인터페이스를 위한) 큐에 삽입
- 큐에 삽입된 순서대로 (한번에 하나의 프로세스만) 공유 자원 이용
2) 실행 순서 제어를 위한 동기화
- 특정 프로세스가 아직 실행될 조건이 되지 않았을 때는 wait를 통해 실행을 중단
- 특정 프로세스가 실행될 조건이 충족되었을 때는 signal을 통해 실행을 재개 한다.
- 조건 변수 이용
* 조건 변수 : 프로세스나 스레드의 실행 순서를 제어하기 위해 사용하는 특별한 변수
- 조건변수.Wait() : 대기상태로 변경, 조건 변수에 대한 큐에 삽입
- 조건변수.Signal() : Wait()로 대기 상태로 접어든 조건 변수를 실행 상태로 변경
- 모니터 안에는 하나의 프로세스만이 있을 수 있다.(아래는 두가지 방법)
- wait()를 호출했던 프로세스는 signal()을 호출한 프로세스가 모니터를 떠난 뒤에 수행을 재개
- signal()을 호출한 프로세스의 실행을 일시 중단하고 자신이 실행된 뒤 다시 signal()을 호출한 프로세스의 수행을 재개