> For the complete documentation index, see [llms.txt](https://real-dev.gitbook.io/real-library/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://real-dev.gitbook.io/real-library/os_with_joonion/13-14-.-mutex-and-semaphore.md).

# 13\~14강. Mutex & Semaphore

<br>

### Mutex

* 임계영역에 진입하기 위해 Lock을 사용하는 방식, 상호배제를 구현한다.
* 가장 간단한 동기화 도구
* `acquire(), release()` 두 개의 동작으로 이뤄진다. 또한 두 개의 동작이 모두 원자적으로 이뤄져야 한다. ~~이런건 그냥 운영체제 만드는 사람들이 만들게 두자.~~
* 계속 뮤텍스의 사용 가능 여부를 확인해야 하므로 `Busy Wating`이 발생함.
  * 다만, 이런 Spinlock이 유용한 경우가 있는데 CPU가 여러개인 경우라면 의미있게 적용되기도 한다. Spinlock을 동작중이라면 Context Switch 시간을 줄일 수 있기 때문에

<br>

### SemaPhore

* N개의 프로세스가 임계 영역에 진입하기 위한 접근방식
* 총 S개의 프로세스가 임계 영역에 진입할 수 있고, `wait(), signal()`를 통해 임계 영역에 진입한 프로세스의 갯수를 증감한다. 당연히 해당 동작도 원자적으로 수행되어야한다.
* S가 1인 세마포어는 뮤텍스와 동일하다.
* 이 역시 `Busy Waiting(spinlock)`이 발생한다. 이를 피하려면 그냥 S가 0일 때, Waiting Queue에 넣어버릴 수도 있다.
* 공유 자원에 대한 동기화 문제가 발생할 수 있다.

<br>

### Monitor

* 고수준 언어에서 동기화하는 방식 중 하나
* 뮤텍스와 세마포어의 문제점을 해결한 방식
* Java로 치면 Class 안에 동기화되어야 하는 동작들을 미리 선언해두는 방식 ~~이게 무슨 소리십니까 교수님~~
* `Conditional Variable`:
* Java에서 `Thread Syncronize`를 위해 `monitor-lock, intrinsic-lock` 이라고 부르는 lock을 사용한다.
* `syncronized` 키워드는 특정 블록을 임계 영역으로 지정하기 위해 사용하는 키워드.
* `wait(), notify()` 가 wait(), signal()로 사용된다. 이 두 메서드는 Object 클래스에 포함되어 있다. 근데 syncronized 키워드가 있어서 굳이…

<br>

### Liveness

* 상호배제 + 데드락을 방지하는 방식
* 비교적 최근에 나왔고, 우선순위를 적용하여 선점하는 방식.
