Mutex vs Semaphore
뮤텍스와 세마포어
- 뮤텍스와 세마포어의 운영체제의 용어로는 커널 자원에서의 동기화 서비스로 제공 (동기화 프리미티브)
생산자-소비자 문제
생산자-소비자 문제(producer-consumer problem)는 여러 개의 프로세스를 어떻게 동기화할 것인가에 관한 고전적인 문제이다.
한정 버퍼 문제(bounded-buffer problem)라고도 한다.
유한한 개수의 물건(데이터)을 임시로 보관하는 보관함(버퍼)에 여러 명의 생산자들과 소비자들이 접근한다.
생산자는 물건이 하나 만들어지면 그 공간에 저장한다. 이때 저장할 공간이 없는 문제가 발생할 수 있다.
소비자는 물건이 필요할 때 보관함에서 물건을 하나 가져온다. 이 때는 소비할 물건이 없는 문제가 발생할 수 있다.
한 버퍼를 사용한다고 가정할때,
생산자 스레드는 데이터를 모으고 버퍼에 쓴다.
구매자 스레드는 버퍼로부터 데이터를 모은다.
객관적으로, 두 스레드는 동시에 실행될 수 없게 된다.
이에 대한 해결 방안이 뮤텍스와 세마포어 이다.
뮤텍스
뮤텍스는 상호 배제를 제공한다.
생산자 또는 구매자는 키(뮤텍스)를 가지고 그들의 일을 진행한다.
생산자(키 소유)로 인해 버퍼가 채운다면, 구매자는 기다려야한다. 반대의 경우에도 동일하다.
그 결과 어느 시점에서든 오직 하나의 스레드만이 전체 버퍼에서 일을 할 수 있다.
세마포어
세마포어는 일반화된 뮤텍스이다.
우리는 4KB 버퍼를 4개의 1KB로 분리할 수 있다.
분리된 4개의 버퍼에 각각 세마포어를 할당할 수 있다.
그 결과 생산자와 구매자는 동시에 다른 버퍼에서 일할 수 있게 된다.
비슷해 보이지만 다른 뮤텍스, 세마포어
뮤텍스와 세마포어는 목적이 다르다.
뮤텍스와 바이너리 세마포어가 구현에 있어 비슷할뿐.
뮤텍스는
엄격하게 말하자면, 뮤텍스는 자원의 접근에 있어 동기화 할 경우 locking mechanism 을 사용한다.
오직 하나의 일(스레드, 프로세스)이 뮤텍스를 가질 수 있다.
이것이 의미하는 바로는 할당된 뮤텍스를 소유할 수 있다는 것이므로, 오직 소유자만이 락(뮤텍스)을 해제할 수 있다.
세마포어는
세마포어는 signaling mechanism (“나는 끝났어, 넌 수행할 수 있어”, 신호의 일종) 을 사용한다.
예를 들어, 만약 당신이 휴대폰을 통해 노래를 듣고 있었는데, 친구에게 전화가 왔다.
이 시점에서 인터럽트는 interrupt service routine(ISR == 인터럽트 핸들러)이 전화 관련 프로세스가 호출되도록 신호를 주게 됨으로써 발생된다.
출처 : https://www.geeksforgeeks.org/mutex-vs-semaphore/ 출처 : https://mygumi.tistory.com/114