세마포어(Semaphore)는 운영 체제에서 프로세스나 스레드 간의 동기화를 관리하는 중요한 동시성 제어 메커니즘입니다. 세마포어는 공유 자원에 대한 접근을 조정하고 교착 상태를 방지하는 데 사용됩니다. 세마포어는 주로 두 가지 유형이 있습니다: 이진 세마포어(Binary Semaphore)와 카운팅 세마포어(Counting Semaphore).
세마포어(Semaphore)는 프로세스가 자원에 접근하기 위해 사용할 수 있는 정수 값으로 표현됩니다. 세마포어는 다음과 같은 기능을 제공합니다:
다음은 세마포어를 사용하는 간단한 예제입니다.
import threading
import time
# 세마포어 초기화 (자원 수 1)
semaphore = threading.Semaphore(1)
def critical_section():
# P 연산: 세마포어의 값을 1 감소
semaphore.acquire()
# 임계 구역 시작
print(f"{threading.current_thread().name} has entered the critical section.")
time.sleep(2) # 자원 사용
print(f"{threading.current_thread().name} is leaving the critical section.")
# V 연산: 세마포어의 값을 1 증가
semaphore.release()
# 스레드 생성
threads = []
for i in range(5):
t = threading.Thread(target=critical_section)
threads.append(t)
t.start()
# 모든 스레드가 종료될 때까지 기다림
for t in threads:
t.join()
장점:
단점:
세마포어는 프로세스 간의 동기화를 효과적으로 관리하고 자원에 대한 안전한 접근을 보장하는 중요한 도구입니다. 이진 세마포어와 카운팅 세마포어의 적절한 사용은 시스템의 안정성과 효율성을 높이는 데 기여합니다.