세마포어(semaphore)

제이미명언·2024년 3월 3일

세마포어

  • 임계영역 문제 해결을 위한 조건(상호배제, 한정대기, 진행의 융통성)이 모두 보장된다.
  • busy waiting이 없으며 구현이 간단하고 사용하기 쉬운 일반적인 임계영역 문제 해결 방법.

임계영역

  • 경쟁상태가 발생하는 영역
  • 경쟁상태를 막기 위해 한 번에 한 프로세스 또는 스레드가 임계영역에 접근해야 한다.

임계영역 문제 해결을 위해 아래의 조건이 모두 보장되어야 한다.

1. 상호배제(mutex)

  • 한 번에 한 프로세스 또는 스레드가 임계영역에 접근해야 한다.
  • 한 프로세스가 임계영역에서 실행중일 경우 다른프로세스는 해당 임계영역에서 실행될 수 없다.(비선점)

2. 한정 대기

  • 프로세스 또는 스레드가 임계영역에서 실행되기 위해 기다리는 시간은 정해져있다.
    (무한정 기다리지 않음)

3. 진행의 융통성

  • 한 프로세스 또는 스레드가 임계영역에서 실행중이지 않을 경우 다른 프로세스는 임계영역에서 실행될 수 있다.

세마포어 예시

한 식당에는 사용가능한 화장실이 3개가 있다.
손님은 화장실에 가기전에 카운터에서 화장실 열쇠가 있는 지 확인한 뒤에,
열쇠가 있다면 화장실에 갈 것이고 열쇠가 하나도 없다면 기다릴 것이다.
화장실: 프로세스
화장실 수: 프로세스 수
기다림: 세마포어 큐
열쇠가 있음 : 세마포어 큐에서 나옴

세마포어 의사코드 설명

세마포어 c언어 함수

#include<semaphore.h>    
sem_t S; //구조체변수 선언
sem_init(&S, 0, n); // == Semaphore(n)
sem_wait(&S); // == P()
// 임계영역 //
sem_post(&S); // == V()
profile
c뿌리는 감자

0개의 댓글