상호 배제(Mutual Exclusion)는 운영체제에서 여러 프로세스나 스레드가 동시에 공유 자원이나 임계구역(Critical Section)에 접근하지 못하도록 하는 기법입니다. 즉, 하나의 프로세스가 임계구역을 사용하고 있을 때 다른 프로세스는 접근할 수 없도록 막아, 데이터의 일관성을 유지하고 충돌을 방지합니다. 이를 구현하는 방법은 하드웨어적 해결 방안과 소프트웨어적 해결 방안으로 구분됩니다.
하드웨어적인 해결 방안은 상호 배제를 보장하기 위해 하드웨어에서 제공하는 특수한 명령어를 사용합니다. 이 방식은 빠르고 안전한 접근 제어가 가능하지만, 하드웨어 의존적이며 모든 시스템에서 지원되는 것은 아닙니다.
• 1) Test-and-Set 명령어
• 원리: Test-and-Set은 단일 기계 명령어로, 임계구역에 접근하려는 프로세스가 공유 변수의 값을 확인하고 필요 시 값을 설정하여 다른 프로세스의 접근을 제한합니다.
• 동작 방식: 이 명령어는 한 번에 한 프로세스만 변수의 상태를 확인하고 수정할 수 있도록 하여 상호 배제를 보장합니다.
• 예: 공유 변수 lock이 false일 때 프로세스가 임계구역에 접근해 lock을 true로 바꾸고, 다른 프로세스는 lock이 false가 될 때까지 대기합니다.
• 2) Swap 명령어
• 원리: 두 변수를 동시에 교환하는 명령어입니다. 프로세스가 임계구역에 들어갈 때 자신이 준비되었음을 표시하는 플래그와 현재의 임계구역 사용 상태를 교환합니다.
• 동작 방식: 변수를 동시에 교환하는 동안 다른 프로세스가 동시에 접근할 수 없게 되므로 상호 배제를 보장할 수 있습니다.
• 3) 인터럽트 비활성화
• 원리: 단일 프로세서 환경에서 사용될 수 있는 방법으로, 프로세스가 임계구역에 진입할 때 인터럽트(Interrupt)를 비활성화하여 다른 프로세스가 CPU를 사용할 수 없도록 합니다.
• 단점: 모든 프로세스의 CPU 사용이 일시 중단되므로 다중 프로세서 환경에서는 사용하기 어렵습니다.
소프트웨어적인 해결 방안은 알고리즘을 사용하여 상호 배제를 구현하는 방식으로, 프로세스 간의 협력을 통해 임계구역에 한 번에 하나의 프로세스만 접근할 수 있도록 설계됩니다. 이 방식은 하드웨어에 의존하지 않아 범용적이지만, 구현의 복잡성과 처리 시간이 다소 증가할 수 있습니다.
• 1) 데커(Dekker)의 알고리즘
• 원리: 두 프로세스가 임계구역에 접근할 때 상호 배제를 보장하는 초기 알고리즘 중 하나입니다.
• 동작 방식: 각 프로세스는 자신이 임계구역에 들어갈 준비가 되었음을 나타내는 플래그를 설정하고, 두 프로세스가 모두 임계구역에 들어가려고 할 때 우선순위를 서로 양보하면서 충돌을 방지합니다.
• 2) 피터슨(Peterson)의 알고리즘
• 원리: 데커의 알고리즘을 개선하여 두 프로세스 간 상호 배제를 보장하는 알고리즘으로, 플래그와 순서 값을 사용해 임계구역에 한 번에 하나의 프로세스만 접근하게 합니다.
• 동작 방식: 두 프로세스가 동시에 임계구역에 들어가려 할 때 양보의 순서를 정해 충돌을 피합니다.
• 특징: 두 프로세스에 대해 매우 효율적이며, 현재도 학습용 예시로 널리 사용됩니다.
• 3) 세마포어(Semaphore)
• 원리: 프로세스가 자원을 요청하거나 해제할 때 P와 V 연산을 수행하여 상호 배제를 보장하는 방식입니다.
• 동작 방식: 세마포어 변수 값이 0보다 크면 P 연산을 통해 세마포어 값을 1 감소시키고 자원에 접근할 수 있도록 합니다. 자원 사용을 마친 후에는 V 연산으로 세마포어 값을 1 증가시켜 다른 프로세스가 자원에 접근할 수 있게 합니다.
• 4) 모니터(Monitor)
• 원리: 모니터는 공유 자원의 접근을 관리하는 고수준의 동기화 기법으로, 객체지향 언어에서 지원되는 synchronized 키워드처럼 사용됩니다.
• 동작 방식: 모니터 내부의 코드 블록은 한 번에 하나의 프로세스만 접근할 수 있어, 프로세스가 임계구역에 진입할 때 자동으로 상호 배제를 보장합니다.
• 특징: 주로 고급 프로그래밍 언어에서 구현되어, 동기화에 대한 프로그래머의 수고를 덜어줍니다.
요약
• 하드웨어적 해결 방안: Test-and-Set, Swap 명령어, 인터럽트 비활성화 등을 사용하여 상호 배제를 강력하게 보장합니다.
• 소프트웨어적 해결 방안: 데커, 피터슨 알고리즘, 세마포어, 모니터 등 알고리즘과 구조체를 활용하여 하드웨어에 의존하지 않고 상호 배제를 구현합니다.
각 방법은 시스템의 환경과 요구 사항에 맞춰 선택되며, 다양한 상황에 맞는 상호 배제 구현을 통해 시스템 안정성과 효율성을 높일 수 있습니다.