1 minute read

뮤텍스와 세마포어

  • 뮤텍스와 세마포어의 운영체제의 용어로는 커널 자원에서의 동기화 서비스로 제공 (동기화 프리미티브)

생산자-소비자 문제

생산자-소비자 문제(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

Categories:

Updated: