• Mutex vs Semaphore :: 마이구미
    운영체제 2017. 1. 31. 16:51
    반응형
    이번글은 뮤텍스와 세마포어에 대해 다뤄본다.

    원본 글을 번역 참고 후 글을 작성했다.


    뮤텍스와 세마포어 둘 사이의 차이점은 무엇인가? 

    뮤텍스는 언제 사용하고 세마포어는 언제 사용할까?


    뮤텍스와 세마포어의 운영체제의 용어로는 커널 자원에서의 동기화 서비스로 제공된다. (동기화 프리미티브라고도 불린다)

    우리는 왜 이러한 동기화 프리미티브 필요한가?

    오직 한가지로는 충족시켜줄 수 없는가?

    이러한 질문들을 대답하기 위해서는 우리는 몇가지 키워드들을 이해할 필요가 있다.

    원자성과  임계 구역에 대한 글을 읽어오길 바란다.

    (2개의 키워드뿐만 아니라 관련된 많은 키워드가 사용되니 꼭 참고바란다)


    먼저 생산자-소비자 문제를 보자.


    생산자-소비자 문제(producer-consumer problem)는 여러 개의 프로세스를 어떻게 동기화할 것인가에 관한 고전적인 문제이다. 한정 버퍼 문제(bounded-buffer problem)라고도 한다.

    유한한 개수의 물건(데이터)을 임시로 보관하는 보관함(버퍼)에 여러 명의 생산자들과 소비자들이 접근한다. 생산자는 물건이 하나 만들어지면 그 공간에 저장한다. 이때 저장할 공간이 없는 문제가 발생할 수 있다. 소비자는 물건이 필요할 때 보관함에서 물건을 하나 가져온다. 이 때는 소비할 물건이 없는 문제가 발생할 수 있다.


    위 설명은 위키의 정의이다.

    우리는 가정한다. 길이가 4096 Byte인 버퍼를 가지고 있다.

    생산자 스레드는 데이터를 모으고 버퍼에 쓴다.

    구매자 스레드는 버퍼로부터 데이터를 모은다.

    객관적으로, 두 스레드는 동시에 실행될 수 없게 된다.


    이 문제의 해결방안으로 다뤄보자.

    뮤텍스를 사용해보자.


    뮤텍스는 상호 배제를 제공한다.

    생산자 또는 구매자는 키(뮤텍스)를 가지고 그들의 일을 진행한다.

    생산자(키 소유)로 인해 버퍼가 채운다면, 구매자는 기다려야한다. 반대의 경우에도 동일하다.

    그 결과 어느 시점에서든 오직 하나의 스레드만이 전체 버퍼에서 일을 할 수 있다.

    이러한 개념으로 세마포어를 발생시킬 수 있다.


    세마포어를 사용해보자.


    세마포어는 일반화된 뮤텍스이다.

    우리는 4KB 버퍼를 4개의 1KB로 분리할 수 있다.

    분리된 4개의 버퍼에 각각 세마포어를 할당할 수 있다.

    그 결과 생산자와 구매자는 동시에 다른 버퍼에서 일할 수 있게 된다.


    간단히 보자면 뮤텍스는 boolean(상태), 세마포어는 int(카운터)라고 볼 수 있다.

    그리고 바이너리 세마포어는 카운터를 0,1만 사용하기에 boolean으로 볼 수 있다.

    우리는 뮤텍스는 바이너리 세마포어라고 이해할 수 있다.

    하지만 그렇지않다.

    뮤텍스와 세마포어는 목적이 다르다.

    뮤텍스와 바이너리 세마포어가 구현에 있어 비슷하기 때문에 그렇게 말할 수 있다는 것이다.


    엄격하게 말하자면, 뮤텍스는 자원의 접근에 있어 동기화 할 경우 locking mechanism 을 사용한다.

    오직 하나의 일(스레드, 프로세스)이 뮤텍스를 가질 수 있다.

    이것이 의미하는 바로는 할당된 뮤텍스를 소유할 수 있다는 것이므로, 오직 소유자만이 락(뮤텍스)을 해제할 수 있다.


    세마포어는 signaling mechanism ("나는 끝났어, 넌 수행할 수 있어", 신호의 일종) 을 사용한다.

    예를 들어, 만약 당신이 휴대폰을 통해 노래를 듣고 있었는데, 친구에게 전화가 왔다.

    이 시점에서 인터럽트는 interrupt service routine(ISR == 인터럽트 핸들러)이 전화 관련 프로세스가 호출되도록 신호를 주게 됨으로써 발생된다.


    일반적인 질문


    하나의 스레드에서 하나 이상의 뮤텍스를 가질 수 있는지?


    그렇다. 하나의 스레드에서 2개 이상의 자원이 필요할 수 있기 때문이다.


    뮤텍스는 한 번 이상의 잠금을 할 수 있는지?


    뮤텍스는 lock이다. 오직 하나의 상태만을 할당한다. (locked, unlocked)

    반복 뮤텍스는 count와 연관이 있기 때문에 한 번 이상의 잠금이 가능하다.

    그렇더라도, locked,unlocked 상태는 유지하고 있다.

    그리고 해제할 경우 잠금 수만큼 해제를 해줘야한다.


    만약 반복적이지 않은 뮤텍스에 한 번 이상의 잠금을 걸게 된다면?


    데드락을 초래한다. 뮤텍스는 위에서도 언급했듯이 소유자만이 해제할 수 있다.

    그렇기 때문에 잠금이 풀리지 않은 상태라면, 다른 스레드에서는 해제할 수 없으므로 무한정 대기하게 된다.


    뮤텍스와 바이너리 세마포어는 같은가?


    위에서도 언급했듯이 같지 않다.

    명백히 locking mechanism vs signaling mechanism 차이를 이해하자.


    원본 글에서 살을 붙일 건 붙이고 뺄 건 뺏다.

    조금 더 많은 정보는 원본을 참고하길 바란다.

    반응형

    댓글

Designed by Tistory.