lunchScreen/Interview_Questions

뮤텍스와 세마포어의 차이

Opened this issue · 6 comments

뮤텍스와 세마포어의 차이

뮤텍스와 세마포어는 여러 프로세스나 스레드가 공유 자원에 접근하는 것을 제어하기 위한 방법으로 병행 처리를 위한 프로세스 동기화 기법입니다.
뮤텍스는 화장실이 하나밖에 없는 식당, 세마포어는 화장실이 여러 칸인 식당에 비교할 수 있습니다.

뮤텍스는 화장실에 가기 위해 카운터에서 열쇠를 가지고 가 그 열쇠를 이용해 화장실을 이용합니다. A가 화장실을 이용 중일 때 B는 그 열쇠를 카운터에서 기다리게 됩니다. A가 화장실을 다 이용하고 열쇠를 반납하면 B는 그 열쇠를 받아 화장실에 가게 됩니다. 화장실을 이용하는 사람은 프로세스 또는 스레드이며 화장실은 공유자원입니다.

세마포어는 화장실에 빈칸이 있다면 화장실에 들어가고, 빈칸의 개수가 0이 되면 1이 될 때 까지 기다려야 합니다. 똑같이 화장실이 공유자원, 사람이 프로세스 또는 스레드입니다.

Mutex 와 Semaphore 는 둘다 여러 프로세스나 쓰레드가 공유 자원에 접근하는 것을 제어하기 위한 방법(동기화 기법) 입니다. Mutex 는 Lock을 사용하여 오직 하나의 스레드만 임계영역에 들어갈 수 있도록 하고 오직 lock 을 건 스레드만이 임계 영역에서 나갈 때 뮤텍스를 unlock 할 수 있다는 특징이 있습니다.

Semaphore 는 카운트를 가지고 있어 wait 를 호출하면 세마포어의 카운트가 줄어들도 signal 을 호출하면 카운트가 증가되어 카운트가 0이되거나 더 작아질 경우 lock 이 실행됩니다. 그렇기 때문에 Mutex 와 다르게 lock 을 걸지 않은 스레드도 signal 을 통해 lock 을 해제할 수 있다는 특징이 있습니다.

Semaphore


세마포어는 공유 자원에 여러 프로세스가 접근하는 것을 막는 방법으로 현재 공유 자원의 상태를 나타내는 카운터 변수를 이용. 이 변수는 운영체제 혹은 커널에 값으로 저장.

프로세스들은 이 상태값을 확인하여 자원을 즉시 사용할 수 있는 상태라면 사용하고 누군가 자원을 사용중이라는 것을 인지하면 기다렸다 사용하게 됨 뮤텍스와 다르게 0과 1과 같은 이진수 외에 더 큰 값을 사용할 수도 있어서 꼭 1개 프로세스만이 자원을 점유하지는 않는다.

뮤텍스는 상호배제를 뜻하는 말로, 임계 구역을 가지는 쓰레드들의 running time이 서로 겹치지 않도록 하는 기법

1개의 스레드만이 공유 자원에 접근할수 있도록 함.

lock과 unlcok 개념을 사용하여 자원을 점유하고 있는 대상이 lock을 할 수 있는 권한을 가지고, 다른 스레드들은 자원이 unlock될때까지 기다리게 됨.

Mutex


뮤텍스는 이진 세마포어로 세마포어의 일종

뮤텍스는 오직 1개의 프로세스 혹은 스레드만이 공유자원에 접근할 수 있고 세마포어는 지정된 변수의 값만큼 저근할 수 있다. 세마포어는 운영체제 혹은 커널 단위에서 해당 리소스 변수가 관리되어 현재 공유 자원을 사용 중인 대상 뿐 이니라 다른 프로세스 및 스레드도 잠금 상태를 해제할 수 있지만, 뮤텍스는 프로세스 단에서 관리되고 해당 변수(lock)을 가지고 있기 때문에 lock을 가지고 있는 변수만이 unlock을 할 수 있다.

mutex는 이진 semaphore입니다. 또한 semaphore는 lock을 걸지 않은 process나 thread도 lock을 해제할 수 있습니다.

공유 자원에 여러 process가 접근하여 race condition이 일어나는 것을 막기 위해 사용하는 것이 semaphore입니다.

세마포어는 공유 자원에 접근할 수 있는 대상의 개수를 정할 수 있는 반면, 뮤텍스는 lock과 unlock을 사용하여 하나의 프로세스만 접근할 수 있도록 합니다. 따라서 세마포어로 뮤텍스와 같은 기능을 사용할 수 있지만, 뮤텍스로 세마포어와 같은 기능을 사용할 수는 없습니다.

Mutex는 1개의 Lock만 갖는 Locking 메커니즘으로 락을 걸은 Thread만이 임계 영역을 나갈 때 락을 해제할 수 있습니다. 하지만 Semaphore는 Signaling 메커니즘으로 락을 걸지 않은 Thread도 Signal을 사용해 락을 해제할 수 있습니다. Semaphore의 Count를 1로 설정하면 Mutex처럼 활용 가능합니다.