Dandy Now!
  • [운영체제] 동기화 기법 : 세마포, wait/signal 함수, 그리고 대기 큐
    2025년 04월 01일 10시 25분 28초에 업로드 된 글입니다.
    작성자: DandyNow
    728x90
    반응형

    세마포, wait/signal 함수, 그리고 대기 큐

    1. 세마포 (Semaphore) 란?

    세마포는 공유 자원에 대한 접근을 제어하거나, 프로세스/스레드 간의 실행 순서를 동기화하기 위해 사용되는 정수 변수이다. 뮤텍스가 오직 하나의 스레드만 접근을 허용하는 것(상호 배제)에 초점을 맞춘다면, 세마포는 '사용 가능한 자원의 개수'를 관리하는 데 주로 사용된다.

    • 핵심 구성: 정수 값 (사용 가능한 자원의 수를 나타냄)과 두 가지 원자적 연산(wait, signal).
    • 종류:
      • 카운팅 세마포 (Counting Semaphore): 임의의 정수 값을 가질 수 있으며, 여러 개의 동일한 자원에 대한 접근을 제어할 때 유용함 (예: 사용 가능한 프린터 3대).
      • 바이너리 세마포 (Binary Semaphore): 0 또는 1의 값만 가질 수 있으며, 뮤텍스와 유사하게 동작하여 상호 배제를 위해 사용될 수 있음 (하지만 소유권 개념은 없음).
    • 주요 용도:
      • 유한한 개수의 자원에 대한 동시 접근 제어.
      • 프로세스 또는 스레드 간의 특정 이벤트 발생 신호 전달 및 순서 제어.

    2. wait()와 signal() 함수

    세마포의 핵심 동작을 수행하는 두 가지 원자적(atomic) 함수이다. (종종 P()V()로 불리기도 한다.)

    • wait() 함수 (자원 획득 시도 / P 연산):
      • 세마포 값을 1 감소시키려 시도.
      • 만약 세마포 값이 0보다 크면: 값을 1 감소시키고, 해당 스레드는 작업을 계속 진행. (자원 획득 성공)
      • 만약 세마포 값이 0이면: 스레드는 더 이상 진행하지 못하고 '대기 상태'에 들어감 (해당 세마포의 대기 큐로 이동).
    • signal() 함수 (자원 반납 / V 연산):
      • 세마포 값을 1 증가시킴.
      • 만약 세마포의 대기 큐에 기다리는 스레드가 있다면: 그중 하나를 깨워서 실행 가능한 상태로 만듦. (깨어난 스레드는 wait()을 성공적으로 마친 상태가 됨)
      • 만약 대기 중인 스레드가 없다면: 단순히 세마포 값만 증가. (사용 가능한 자원이 하나 늘어남)

    주의: waitsignal 연산은 반드시 원자적으로(하나의 중단 불가능한 단위로) 실행되어야 함.

    3. 대기 큐 (Wait Queue)

    세마포와 연관되어, wait() 연산을 수행했지만 세마포 값이 0이어서 진행하지 못하고 블록(block)된 스레드들이 대기하는 큐이다.

    • 목적: 자원을 사용할 수 있을 때까지 스레드를 안전하게 보관하고, CPU 자원을 낭비하지 않도록 함 (바쁜 대기 개선).
    • 동작:
      • 스레드가 wait() 호출 시 세마포 값이 0이면, 해당 스레드는 이 큐에 추가되고 '대기(Waiting)' 또는 '블록(Blocked)' 상태가 됨.
      • 다른 스레드가 signal()을 호출하여 세마포 값이 증가하고 대기 중인 스레드가 있다면, 운영체제는 대기 큐에서 스레드 하나를 꺼내 '준비(Ready)' 상태로 변경. (일반적으로 FIFO 순서로 꺼냄)
    • 결과: 스레드는 CPU를 낭비하지 않고 자신의 차례(자원이 사용 가능해지는 시점)를 기다릴 수 있음.
    728x90
    반응형
    댓글