방명록
- [운영체제] 동기화 기법 : 세마포, wait/signal 함수, 그리고 대기 큐2025년 04월 01일 10시 25분 28초에 업로드 된 글입니다.작성자: DandyNow728x90반응형
세마포, wait/signal 함수, 그리고 대기 큐
1. 세마포 (Semaphore) 란?
세마포는 공유 자원에 대한 접근을 제어하거나, 프로세스/스레드 간의 실행 순서를 동기화하기 위해 사용되는 정수 변수이다. 뮤텍스가 오직 하나의 스레드만 접근을 허용하는 것(상호 배제)에 초점을 맞춘다면, 세마포는 '사용 가능한 자원의 개수'를 관리하는 데 주로 사용된다.
- 핵심 구성: 정수 값 (사용 가능한 자원의 수를 나타냄)과 두 가지 원자적 연산(
wait
,signal
). - 종류:
- 카운팅 세마포 (Counting Semaphore): 임의의 정수 값을 가질 수 있으며, 여러 개의 동일한 자원에 대한 접근을 제어할 때 유용함 (예: 사용 가능한 프린터 3대).
- 바이너리 세마포 (Binary Semaphore): 0 또는 1의 값만 가질 수 있으며, 뮤텍스와 유사하게 동작하여 상호 배제를 위해 사용될 수 있음 (하지만 소유권 개념은 없음).
- 주요 용도:
- 유한한 개수의 자원에 대한 동시 접근 제어.
- 프로세스 또는 스레드 간의 특정 이벤트 발생 신호 전달 및 순서 제어.
2. wait()와 signal() 함수
세마포의 핵심 동작을 수행하는 두 가지 원자적(atomic) 함수이다. (종종
P()
와V()
로 불리기도 한다.)- wait() 함수 (자원 획득 시도 / P 연산):
- 세마포 값을 1 감소시키려 시도.
- 만약 세마포 값이 0보다 크면: 값을 1 감소시키고, 해당 스레드는 작업을 계속 진행. (자원 획득 성공)
- 만약 세마포 값이 0이면: 스레드는 더 이상 진행하지 못하고 '대기 상태'에 들어감 (해당 세마포의 대기 큐로 이동).
- signal() 함수 (자원 반납 / V 연산):
- 세마포 값을 1 증가시킴.
- 만약 세마포의 대기 큐에 기다리는 스레드가 있다면: 그중 하나를 깨워서 실행 가능한 상태로 만듦. (깨어난 스레드는
wait()
을 성공적으로 마친 상태가 됨) - 만약 대기 중인 스레드가 없다면: 단순히 세마포 값만 증가. (사용 가능한 자원이 하나 늘어남)
주의:
wait
와signal
연산은 반드시 원자적으로(하나의 중단 불가능한 단위로) 실행되어야 함.3. 대기 큐 (Wait Queue)
세마포와 연관되어,
wait()
연산을 수행했지만 세마포 값이 0이어서 진행하지 못하고 블록(block)된 스레드들이 대기하는 큐이다.- 목적: 자원을 사용할 수 있을 때까지 스레드를 안전하게 보관하고, CPU 자원을 낭비하지 않도록 함 (바쁜 대기 개선).
- 동작:
- 스레드가
wait()
호출 시 세마포 값이 0이면, 해당 스레드는 이 큐에 추가되고 '대기(Waiting)' 또는 '블록(Blocked)' 상태가 됨. - 다른 스레드가
signal()
을 호출하여 세마포 값이 증가하고 대기 중인 스레드가 있다면, 운영체제는 대기 큐에서 스레드 하나를 꺼내 '준비(Ready)' 상태로 변경. (일반적으로 FIFO 순서로 꺼냄)
- 스레드가
- 결과: 스레드는 CPU를 낭비하지 않고 자신의 차례(자원이 사용 가능해지는 시점)를 기다릴 수 있음.
728x90반응형'CS > 컴퓨터구조와 운영체제' 카테고리의 다른 글
[운영체제] 동기화 기법 : 모니터, 인터페이스, 그리고 조건 변수 (1) 2025.04.01 [운영체제] 동기화 기법 : 뮤텍스 락, acquire/release 함수, 그리고 바쁜 대기 (0) 2025.04.01 [컴퓨터 구조] 보조기억장치(하드 디스크, 플래시 메모리) (0) 2025.03.26 [컴퓨터구조] 캐시 메모리 및 저장 장치 계층 구조 관련 용어 정리 (0) 2025.03.25 다음글이 없습니다.이전글이 없습니다.댓글 - 핵심 구성: 정수 값 (사용 가능한 자원의 수를 나타냄)과 두 가지 원자적 연산(