# 뮤텍스와 세마포어에 대해 설명해 주세요.

* **뮤텍스(Mutex)와 세마포어(Semaphore)는 동시성 프로그래밍에서 공유자원을 안전하게 관리하기 위해서 상호배제를 달성하는 기법이다.**

## 뮤텍스

* 뮤텍스는 임계 구역(Critical Section)을 가진 쓰레드들의 실행 시간(Running Time)이 서로 겹치지 않고 각각 단독으로 실행되도록 하는 기술이다.

> - 뮤텍스는 화장실이 하나 밖에 없는 식당과 비슷하다.
> - 화장실을 가기 위해서는 카운터에서 열쇠를 받아 가야 한다.
> - 만약 카운터에 키가 있으면 화장실에 사람이 없다는 뜻이고, 우리는 이 열쇠를 이용해 화장실에 들어갈 수 있다.
> - 카운터에 키가 없으면 화장실에 이미 사람이 있다는 뜻이고, 화장실을 이용할 수 없다. 사람이 나올 때까지 기다려야 한다.
> - 다른 사람도 화장실에 가기 위해 카운터에 대기하고 있다.
> - 앞사람이 화장실에서 나와 카운터에 키를 돌려 놓고, 이제 기다리던 사람들 중 맨 앞에 있던 사람이 키를 사용해 화장실에 갈 수 있다.
>
> **이것이 뮤텍스가 동작하는 방식이다.**
>
> * 화장실을 이용하는 사람은 **프로세스 혹은 쓰레드**이며, 화장실은 **공유 자원**, 화장실 키는 공유 자원에 접근하기 위해 필요한 어떤 **오브젝트**이다.
> * 즉, 뮤텍스는 `Key`에 해당하는 어떤 오브젝트가 있으며 이 **오브젝트를 소유한 쓰레드 또는 프로세스 만이 공유 자원에 접근**할 수 있다.

## 세마포어

* 세마포어는 공유된 자원의 데이터 혹은 임계 구역(Critical Section) 등에 여러 프로세스 혹은 쓰레드가 접근하는 것을 막아주는 기술이다.

> - 세마포어는 화장실이 여러 개 있는 식당과 비슷하다.
> - 세마포어를 이용하는 식당의 화장실에는 여러 개의 칸이 있고 화장실 입구에는 현재 화장실의 빈 칸 개수를 보여주는 전광판이 있다.
> - 화장실에 가고 싶다면 입구에서 빈 칸의 개수를 확인하고 빈 칸이 1개 이상이라면 빈칸의 개수를 하나 뺀 다음 화장실로 입장해야 하며, 나올 때는 빈 칸의 개수를 하나 더해준다.
> - 모든 칸에 사람이 들어갔을 경우 빈 칸의 개수는 0이 된다.
> - 이때 화장실에 들어가려면 빈 칸의 개수가 1 이상이 될 때까지 기다려야 한다.
>
> **이것이 세마포어가 동작하는 방식이다.**
>
> * 세마포어는 공통으로 관리하는 하나의 값을 이용해 상호배제를 달성한다.
> * 화장실이 **공유 자원**이며, 사람들이 **쓰레드, 프로세스**이다.
> * 화장실 빈 칸의 개수는 현재 공유 자원에 접근할 수 있는 **쓰레드, 프로세스의 개수**를 나타낸다.
> * 뮤텍스와 가장 큰 차이점은 **동기화 대상의 개수**, 즉 예시에서 화장실의 개수다.

\\

### 참고

* [참고 블로그](https://worthpreading.tistory.com/90)
