스물두줄

컴퓨터시스템응용기술사 · 컴퓨터 구조 및 운영체제

세마포어 (Semaphore)

세마포어는 정수형 공유 변수 S와 원자적 연산 P, V로 공유 자원 접근을 제어하는 동기화 기법이다. 다익스트라가 제안했으며, 자원을 얻는 P연산과 반납하는 V연산으로 이루어진다. 열쇠 개수를 세는 계수기라고 생각하면 이해하기 쉽다. P연산은 S가 0보다 크면 S를…

주요 장면

  1. 0:02 세마포어의 정의
  2. 0:22 P·V 연산의 구조
  3. 0:47 세마포어의 종류
  4. 1:10 연결 풀 계산 예
  5. 1:51 생산자-소비자 예
  6. 2:23 P·V 짝 불일치의 한계
  7. 2:44 정리

대본

세마포어의 정의

세마포어는 정수형 공유 변수 S와 원자적 연산 P, V로 공유 자원 접근을 제어하는 동기화 기법이다.

다익스트라가 제안했으며, 자원을 얻는 P연산과 반납하는 V연산으로 이루어진다.

열쇠 개수를 세는 계수기라고 생각하면 이해하기 쉽다.

P·V 연산의 구조

P연산은 S가 0보다 크면 S를 1 줄이고 진입한다. 0 이하이면 대기 큐에 블록한다.

V연산은 S를 1 늘리고, 대기 큐에 프로세스가 있으면 하나를 깨워 자원을 넘긴다.

두 연산은 중간에 끼어들 수 없는 원자적 연산으로 실행되어야 한다.

세마포어의 종류

세마포어는 S의 범위에 따라 계수 세마포어와 이진 세마포어로 나뉜다.

계수 세마포어는 자원이 여러 개일 때, 이진 세마포어는 0과 1만 가져 임계구역을 보호할 때 쓴다.

뮤텍스와의 가장 중요한 차이는 소유 여부다. 뮤텍스는 획득한 스레드만 해제할 수 있다.

연결 풀 계산 예

가상의 예로, 연결이 3개뿐이고 요청 스레드가 5개인 경우를 보자.

초기값을 3으로 두면 스레드 1, 2, 3이 P연산으로 S를 3, 2, 1, 0으로 줄이며 연결을 얻는다.

스레드 4는 S가 0이므로 대기 큐에 들어간다.

스레드 1이 V연산으로 반납하면 S가 1이 되고, 대기 중이던 스레드 4가 깨어나 연결을 얻는다.

직접 풀어 보자.

생산자-소비자 예

생산자-소비자 문제는 세마포어 세 개로 푼다.

빈 칸을 세는 empty는 버퍼 크기로, 찬 칸을 세는 full은 0으로, 버퍼를 보호하는 mutex는 1로 초기화한다.

생산자는 empty에 P, mutex에 P, 넣기, mutex에 V, full에 V 순서로 실행한다.

P연산은 S를 1 줄이고 V연산은 S를 1 늘린다. 이 순서는 교과서 설명과 일치한다.

P·V 짝 불일치의 한계

P와 V의 짝이 어긋나면 교착 상태나 상호 배제 실패로 이어진다.

이는 세마포어 자체의 결함이 아니라 사용자의 호출 순서 오류다.

우선순위 역전은 우선순위 상속으로, 교착은 잠금 순서를 일정하게 맞춰 막는다.

정리

세마포어는 정수 변수와 두 원자적 연산으로 상호 배제와 자원 수 관리를 함께 해결한다.

P와 V의 짝을 맞춰 쓰는 것이 핵심이다. 초기값으로 동시 진입 수를 정한다.

같은 장의 영상