semaphore

agnusdei·2024년 10월 9일
0

Hardware & Software

목록 보기
19/136

세마포어(Semaphore)는 운영 체제에서 프로세스나 스레드 간의 동기화를 관리하는 중요한 동시성 제어 메커니즘입니다. 세마포어는 공유 자원에 대한 접근을 조정하고 교착 상태를 방지하는 데 사용됩니다. 세마포어는 주로 두 가지 유형이 있습니다: 이진 세마포어(Binary Semaphore)와 카운팅 세마포어(Counting Semaphore).

1. 세마포어의 정의

세마포어(Semaphore)는 프로세스가 자원에 접근하기 위해 사용할 수 있는 정수 값으로 표현됩니다. 세마포어는 다음과 같은 기능을 제공합니다:

  • 자원 접근 제어: 여러 프로세스가 동시에 자원에 접근할 때, 세마포어를 통해 접근을 조정할 수 있습니다.
  • 프로세스 동기화: 프로세스 간의 협력을 필요로 하는 경우 동기화할 수 있습니다.

2. 세마포어의 유형

2.1 이진 세마포어 (Binary Semaphore)

  • 정의: 이진 세마포어는 두 개의 상태(0 또는 1)만을 가지며, 일반적으로 이진 세마포어는 뮤텍스(Mutex)와 유사한 역할을 합니다.
  • 용도: 자원이 하나만 존재할 때, 즉 한 프로세스만 자원에 접근할 수 있을 때 사용합니다.
  • 작동 방식:
    • P 연산 (Wait): 세마포어의 값이 1이면 0으로 설정하고 자원에 접근합니다. 세마포어의 값이 0이면 대기합니다.
    • V 연산 (Signal): 자원 사용이 끝난 후, 세마포어의 값을 1로 되돌려 다른 프로세스가 자원에 접근할 수 있도록 합니다.

2.2 카운팅 세마포어 (Counting Semaphore)

  • 정의: 카운팅 세마포어는 0 이상의 정수 값을 가지며, 여러 개의 자원에 대한 접근을 조절합니다.
  • 용도: 자원이 여러 개 존재할 때, 동시에 접근할 수 있는 프로세스의 수를 제어하는 데 사용합니다.
  • 작동 방식:
    • P 연산 (Wait): 세마포어의 값이 0보다 크면 값을 1 감소시키고 자원에 접근합니다. 값이 0이면 대기합니다.
    • V 연산 (Signal): 자원 사용이 끝난 후, 세마포어의 값을 1 증가시킵니다.

3. 세마포어의 예제

다음은 세마포어를 사용하는 간단한 예제입니다.

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()

4. 세마포어의 장단점

장점:

  • 프로세스 간의 동기화와 상호 배제를 지원합니다.
  • 여러 자원에 대한 접근을 조절할 수 있습니다.

단점:

  • 잘못 사용하면 교착 상태(Deadlock)가 발생할 수 있습니다.
  • 프로세스의 실행 흐름을 복잡하게 만들 수 있습니다.

5. 결론

세마포어는 프로세스 간의 동기화를 효과적으로 관리하고 자원에 대한 안전한 접근을 보장하는 중요한 도구입니다. 이진 세마포어와 카운팅 세마포어의 적절한 사용은 시스템의 안정성과 효율성을 높이는 데 기여합니다.

0개의 댓글