세마포어(Semaphore)와 모니터(Monitor)는 모두 상호 배제(Mutual Exclusion)와 동기화(Synchronization)를 구현하는 기법이지만, 그 원리와 작동 방식에서 차이가 있습니다. 세마포어는 하드웨어에 가까운 저수준 기법으로 동기화하고, 모니터는 고수준의 동기화 기법으로 상호 배제를 자동으로 관리합니다. 이 두 기법의 관계와 각각의 원리 및 작동 방식을 더 명확하게 설명하겠습니다.
세마포어는 정수형 변수로 구현되는 동기화 기법으로, 프로세스나 스레드가 공유 자원에 접근할 때 상호 배제를 보장합니다. 세마포어의 연산인 P 연산(Wait)과 V 연산(Signal)을 통해 자원 접근을 제어합니다.
작동 원리:
• P 연산 (Wait):
• 세마포어 값이 0보다 크면 세마포어 값을 1 감소시키고 자원을 사용할 수 있게 됩니다.
• 세마포어 값이 0이라면, 자원이 사용 중이므로 해당 프로세스는 대기합니다.
• V 연산 (Signal):
• 자원을 사용한 프로세스가 V 연산을 호출하면 세마포어 값을 1 증가시켜 대기 중인 다른 프로세스가 자원을 사용할 수 있게 합니다.
예시:
• 하나의 공유 자원을 제어하기 위해 세마포어 mutex를 사용한다고 가정했을 때, mutex의 값은 처음에 1로 설정됩니다.
• 프로세스가 P(mutex) 연산을 수행하면 mutex 값은 0으로 바뀌고, 자원을 사용한 후 V(mutex) 연산을 통해 mutex 값은 1로 다시 바뀌어 다른 프로세스가 자원을 사용할 수 있게 됩니다.
모니터는 고수준 동기화 기법으로, 여러 프로세스가 공유 자원에 접근할 때 상호 배제를 자동으로 보장하는 기법입니다. 모니터는 기본적으로 임계구역을 관리하는 객체 또는 모듈로 구현되며, 내부에 조건 변수(Condition Variables)를 사용하여 동기화를 관리합니다.
모니터의 기본 원리:
• 상호 배제: 모니터 내에 정의된 자원이나 데이터에 접근하려면, 한 번에 한 프로세스만 접근할 수 있습니다. 즉, 모니터 내부의 코드 실행은 항상 상호 배제가 보장됩니다.
• 조건 변수: 조건 변수를 사용하여 특정 조건이 충족될 때까지 프로세스를 대기 상태로 만들거나, 조건을 만족한 프로세스를 깨울 수 있습니다.
작동 원리:
1. 모니터는 프로세스가 임계구역에 진입할 때 자동적으로 상호 배제를 보장합니다. 즉, 하나의 프로세스가 모니터 안의 자원에 접근하고 있을 때, 다른 프로세스는 자동으로 차단됩니다.
2. 조건 변수를 사용하여 프로세스가 기다려야 할 경우 대기 상태로 전환되고, 조건이 만족되면 다른 프로세스를 깨워 임계구역에 진입할 수 있게 합니다.
예시:
class Monitor:
def init(self):
self.lock = Lock() # 상호 배제를 위한 락
self.condition = Condition(self.lock) # 조건 변수를 위한 락
def critical_section(self):
with self.lock:
# 임계구역에 접근
pass
def wait_for_condition(self):
with self.condition:
self.condition.wait() # 조건을 만족할 때까지 대기
def signal_condition(self):
with self.condition:
self.condition.notify() # 조건을 만족하는 프로세스 깨우기
• critical_section: 이 메서드 내의 코드는 상호 배제를 보장하며, 한 번에 하나의 프로세스만 접근할 수 있습니다.
• wait_for_condition: 이 메서드는 조건을 만족하지 않으면 대기 상태로 들어가며, 다른 프로세스가 조건을 만족시키면 **notify**를 통해 대기 중인 프로세스를 깨웁니다.
세마포어와 모니터의 상호 관계
• 세마포어와 모니터의 차이:
• 세마포어는 프로그래머가 P와 V 연산을 수동으로 작성해야 하므로 저수준의 동기화 기법입니다. 이는 다양한 환경에서 유연하게 사용될 수 있지만, 교착 상태(Deadlock)나 무한 대기(Starvation) 문제를 일으킬 수 있습니다.
• 모니터는 상호 배제와 조건 변수를 고수준에서 자동으로 관리하는 방식입니다. 이는 프로그래머가 직접적으로 세마포어를 관리할 필요가 없으며, 코드가 더 안전하고 가독성이 높습니다. 그러나 모니터는 일반적으로 하드웨어나 저수준 환경에서는 사용되지 않습니다.
• 세마포어에서 모니터로의 발전:
• 세마포어는 저수준 제어를 통해 세밀한 동기화를 관리하지만, 실수로 인한 동기화 오류가 발생할 가능성이 큽니다.
• 모니터는 이러한 세부 사항을 자동화하여 상호 배제와 조건부 대기를 쉽게 구현할 수 있도록 하여, 고수준의 동기화 방식을 제공합니다. 이는 교착 상태나 무한 대기를 방지하는 데 도움을 주며, 프로그래밍 오류를 줄입니다.
요약
• 세마포어는 정수형 변수로 상호 배제를 제어하며, P(Wait)와 V(Signal) 연산을 사용하여 프로세스 간의 자원 접근을 관리합니다. 프로그래머가 동기화 연산을 수동으로 관리합니다.
• 모니터는 고수준 동기화 기법으로, 상호 배제와 조건 변수를 사용해 자동으로 동기화를 관리합니다. 모니터 내부의 자원에 한 번에 하나의 프로세스만 접근할 수 있도록 보장합니다.
• 세마포어는 더 세밀한 제어를 가능하게 하지만 프로그래머의 실수로 인한 문제가 발생할 수 있으며, 모니터는 자동화된 안전한 동기화 방식을 제공합니다.
세마포어와 모니터는 상호 배제를 보장하는 기법으로, 세마포어는 저수준 환경에서 유용하고 모니터는 고수준 환경에서 안전하고 효율적으로 동기화를 구현하는 데 유리합니다.