세마포어 (Semaphore)

I. Busy waiting, 세마포어의 개요

가. 세마포어(Semaphore)의 정의

  • 운영체제나 프로그램 내에서 공유 자원에 대한 접근을 제어하기 위해 사용되는 신호

나. 세마포어의 개념도

  • 최초의 s값은 1, P(s)를 먼저 수행하는 프로세스가 s=0 변경, Critical Section에 진입, 먼저 들어갔던 프로세스가 V(s)를 수행하면 s=1로 변경, P(s)에서 대기하고 있던 프로세스가 진행
  • s=1 이면, Critical Section 실행 중 프로세스 없음 의미
  • s=0 이면, Critical Section 실행 중 프로세스 있음 의미

 

II. 세마포어의 동작 원리 및 유형

가. 세마포어의 동작 원리

구분P연산 (Wait)V연산 (Signal)
의미– 세마포어 s가
  1 → 0 변경
– 세마포어 s가
  0 → 1 변경
코드if(s > 0) then
  s–;
else
  현재 프로세스는 대기
if(프로세스 대기 중) then
1개 프로세스만 진행;
else
  s++;
  • 세마포어는 s는 정수 값을 가지며, 초기화 및 P와 V연산에 의해서만 접근되는 정수형 공용 변수

나. 세마포어의 유형

유형목적내용
Binary
Semaphore
– 상호배제, 프로세스 동기화세마포어
플래그 : 0 or 1
Count
Semaphore
– 초기에 동시 진행 가능한
프로세스 개수 정의 가능
0, 1, 2, …

 

III. 세마포어와 뮤텍스 비교

가. 세마포어와 뮤텍스 개념

세마포어(Semaphore)뮤텍스(Mutex)
– 사용 자원을 카운트하며 모든 자원이 사용되면 카운트 0– 자원을 한 프로세스만 할당, 종료 시 다음 프로세스 할당

나. 세마포어와 뮤텍스 비교

항목세마포어뮤텍스
원리화장실이 n칸(접근 가능 최대 허용치 만큼 동시 사용자 접근 가능), 세마포어 카운트가 0이면 대기화장실에 들어가기 위한 열쇠를 한 사람이 가지고 있다면, 그 사람만이 들어갈 수 있다. 대기열(큐) 기다리게 됨 → 세마포어의 일종
목적Dead Lock을 피하기 위한 기술 중 하나Critical Section을 가진 Thread 들이 running time이 서로 겹치지 않게, 각 단독 실행 기술
특징공유 리소스에 접근할 수 있는 최대 허용치 만큼 동시 사용자 접근을 할 수 있게 하는 기술
동기화 대상이 여러 개일 경우 사용
뮤텍스는 제어되는 섹션에 하나의 Thread만을 허용하기 때문에 해당 섹션에 접근하려는 다른 Thread들을 강제적으로 막아 첫 번째 Thread가 세션 빠져 나올 때까지 대기

 

IV. 세마포어를 이용한 리소스 공유

가. 리소스 공유 매커니즘

  • N개의 태스크와 M개의 리소스 공유 시, 세마포어(계수형) 초기 값을 N개로 설정

나. 리소스 공유 절차

  • 태스크가 세마포어를 획득해도 뮤텍스를 획득해야 리소스 접근 가능

 

V. 세마포어를 이용한 태스크 간 동기화 방법

① Task A가 동기화 전처리 시작

② Task B는 동기화 세마포어가 POST 시그널 줄 때까지 wait

③ Task A가 동기화 전처리 완료

④ Task A, Task B 동기화 완료

  • 태스크 간 동기화는 여러 태스크가 공유 자원에 접근할 경우 동일한 값을 얻을 수 있도록 조정(Sync)
  • 계수형 세마포어의 경우 태스크A 전처리 결과에 따라 계수 증가, 태스크는 누적된 계수만큼 처리
3 Comments

콘텐츠 사용 시 출처 표기 부탁 드리고, 궁금한 점이나 의견은 댓글 남겨주세요^^