연관토픽
- [상위] 동기화 기법
- [상위] 상호배제(Mutual Exclusive)
- [연관] 모니터(Monitor)
- [연관] 스핀락(Read/Write Spin Lock)
- [연관] 뮤텍스(Mutex)
기출문제
회차 | 문제 |
응용132-1 | 4. 세마포어(Semaphore)의 개념과 주요 연산(P 연산, V 연산) |
관리122-1 | 1. 세마포어(Semaphore)와 모니터(Monitor) |
응용108-3 | 4. 세마포어(Semaphore)를 이용한 리소스 공유 방법과 태스크간 동기화 방법에 대하여 설명하시오. |
관리99-1 | 9. 계수형 세마포어(Counting semaphore)에 대하여 설명하시오. |
응용98-1 | 11. 세마포어(Semaphore)와 모니터(Monitor)의 상호관계를 설명하시오. |
개념
- 다중 프로세서의 공유자원 경쟁시, 공유자원 접근제어를 통해 상호배제, 동기화 지원 메커니즘
- 다중프로세스 환경에서 공유 자원에 대한 소유권을 표시, 해제(자원 접근제한)하는 자원 동기화 기법
- 1965년 다익스트라가 제안, 세마포어는 상호배제 + 다양한 연산 순서 제공
세마포어의 유형
구분 | 설명 |
이진(binary) | 변수가 0/1 값을 가짐, 상호배제/프로세스 동기화에 사용, 프로세스 간 순서 제어 가능 |
계수형(counter) | 변수가 0 이상의 정수 값, 자원 Pool 할당, 초기값=자원 수, 생산자/소비자 문제 해결 |
세마포어 연산
P 연산(wait) | V 연산(Signal) |
WHILE S <= 0 Do skip //다른 프로세스가 사용 중(S<=0)이면 기다림 S = S-1; //다른 프로세스가 사용 끝내면 이 코드로 진입, 내가 쓰겠다고 알림 |
S=S+1. // 자원 사용이 끝났음을 알림 |
- 프로세스를 대기하게 하는 wait 동작 - 프로세스 진입 결정(임계영역에 진입하는 연산) |
- 대기 중 프로세스 깨우려고 신호를 보내는 signal 동작 - wake up(임계영역에서 나오는 연산) |
- P와 V 연산을 종료할 때까지는 다른 프로세스가 두 연산을 수행하지 않도록 조정
- 세마포어는 모든 프로세스가 1 로 초기화한 세마포어를 공유하고, 임계 영역 진입하기 전에 Signal 연산을 실행한 후 Wait 연산을 실행해야 하는데, 순서를 따르지 않을 경우 두 프로세스가 동시에 임계 영역에 존재할 수 있어 상호배제를 위반하거나 교착 상태가 발생할 수 있는 취약점이 발생, 모니터는 이런 단점을 극복
세마포어를 이용한 리소스 공유 메커니즘
- N개의 Task와 M개의 Resource를 공유할 때, 세마포어(계수형) 초기값을 N개로 설정
- Task 가 세마포어를 획득하여도 Mutex 를 획득해야 리소스 접근 가능
세마포어를 이용한 태스크 간 동기화 방법
- 태스크 간 동기화는 여러 태스크가 공유 자원에 접근할 경우 동일한 값을 얻을 수 있도록 조정(Sync)
- 계수형 세마포어의 경우 태스크A 전처리 결과에 따라 계수 증가, 태스크는 누적된 계수만큼 처리
- Task A가 동기화 전처리 시작
- Task B는 동기화 세마포어가 POST 시그널 줄 때까지 wait
- Task A가 동기화 전처리 완료
- Task A, Task B 동기화 완료
세마포어와 모니터의 상호관계
- 세마포어는 모니터에 이론적 기반을 제공하고, 모니터는 세마포어의 타이밍 문제를 보완하여 동시성 제어를 위한 상호작용을 지원함
세마포어 vs. 모니터
구분 | 세마포어 | 모니터 |
주체 | 운영체제, 개발자 주체의 동시성 지원 | 프로그래밍 언어 수준의 동시성 지원 |
상호작용 | 모니터의 이론적 기반 제공 | 세마포어의 단점인 타이밍 오류 문제 해결 |
특징 | S의 타입에 따라 Binary/Couinting 세마포어로 구분 | 한 시점에 하나의 프로세스만 모니터 내부에서 수행 |
구현방법 | Semaphores S; P (S) ; // 검사역할, S-- 임계구역 () V (S); // 증가역할, S++ |
Monitor monitor-name { //지역변수선언 Public entry p1(...) { } Public entry p2(...) { } } |
연산방식 | P, V연산 | X.Wait, Y.Signal 연산 |
공유자원 접근 | 직접 키의 해제와 공유자원 접근처리를 구현 | 공유자원 접근할 수 있는 키의 획득과 해제를 모두 처리 |
실행재개 | V연산으로 사용자가 지연 없이 실행을 재개 | - Signal연산으로 모니터의 잠금을 해제할 때만 다시 시작 - 병렬 프로그래밍에서 세마포어보다 더 오류가 적고 쉽게 작성의 장점 존재 |
단점 | - 부정확하게 사용시 탐지 곤란한 타이밍 오류 발생 - 상호배제를 위반하거나 교착 상태가 발생할 수 있는 취약점 존재 (하나의 오류가 전체 시스템에 악영향 가능) |
- 프로그래밍 언어의 일부로 구현하고, 컴파일러가 그 코드를 생성해야 함. 이는 컴파일러가 병행 프로세스에서 임계 영역에 접근을 제어할 수 있는 운영체제를 이해 해야 하는 부담 - 자바,C#,비주얼베이직,에이다등 언어만 지원 |
- 세마포어는 모니터에 이론적 기반을 제공하고, 모니터는 세마포어의 타이밍 문제를 보완하여 동시성 제어를 위한 상호작용 지원
모범답안