15. Semaphore

Semaphore

  • 정의

    Mutex나 조건 동기를 통한 Gerneralized 된 동기화 기법

  • 구성요소

    • Semaphore 변수

      동기화를 위한 상태를 저장

      앞으로 S 라고 약칭

    • Waiting Queue

      접근하지 못하고 기다리는 Process들을 관리할 Queue

      이전에 언급한 방법과 달리 Busy-Wait 하지 않고 바로 Blocked State로 들어감

    • Operation

      • SemWait

        Semaphore 변수를 감소시키는 Operation

      • SemSignal

        Semaphore 변수를 증가시키는 Operation

    • 기준에 따른 종류

      • S 범위

        • Binary Semaphore

          Mutex Lock이라고 불림

          S의 범위가 0 or 1임

          S가 1일 때 아무도 쓰고 있지 않은 상태임을 나타냄

          => 1일 때는 0으로 만들고서 CS 영역에 접근하고,

          => 0일 때는 누가 쓰고 있는 것이므로, Blocked Queue로 이동됨

        • Counting Semaphore

          0 or 1이라는 제약이 없는 일반적인 세마포어

          이때 S의 값은 자원의 갯수라고 보는 것이 좋음

          S가 1 이상이면 감소 시키고, 자원 할당

          S가 0 이하면 없으므로, Waiting Queue로 이동

          S가 0 이하였다면 자원을 Release 하고 나서,

          Waiting Queue에서 다음 Process를 불러옴

      • Next Process 선택 기준

        • Strong Semaphore

          꺼내는 방식이 FIFO

        • Weak Semaphore

          FIFO가 아닌 것

    • 주의할 점

      Lock 등을 위한 Semaphore 변수도 공유자원이므로,

      sem_wait, sem_signal 함수에도 Lock, Unlock이 필요하고 이를 TAS, CAS, Disabling Interrrupts 등의 방법으로 구현

      각 자원마다 별도의 Lock이 존재해야 함

      => 하나의 Semaphore 변수로 여러 공유 자원을 관리해서는 안됨

    Mutex Condition Semaphore 명령어
    P Lock Wait Wait sem_wait
    V UnLock Signal Post sem_signal
  • 리눅스에서 Semaphore

    • sem_init(세마포어 변수, 0, 1)

      마지막 인자는 공유 자원의 갯수

    • sem_wait(세마포어 변수)

      Lock, 자원을 선점

      값을 줄이고 0 미만이면 Wait Queue로 들어가 대기

    • sem_post(세마포어 변수)

      Unlock, 자원을 Release

      값을 늘리고 0 이하면 자고 있는 Thread 깨움


© 2025. Na2te All rights reserved.