2019년 3월 8일
세마포어 (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
ㄳ
감사합니다!
유익합니다.