상호배제 예제

뮤텍스는 두 스레드가 동시에 동일한 데이터에서 작동할 때 그림으로 들어옵니다. 잠금 역할을 하며 가장 기본적인 동기화 도구입니다. 스레드가 뮤텍스를 획득하려고 하면 뮤텍스를 사용할 수 있는 경우 뮤텍스가 증가하며, 그렇지 않으면 스레드가 절전 상태로 설정됩니다. 상호 제외는 큐 잉어 및 컨텍스트 스위치를 사용하여 대기 시간 및 대기 시간을 줄입니다. Mutex는 하드웨어 및 소프트웨어 수준에서 적용할 수 있습니다. 대기 중대기는 유니프로세서 와 멀티프로세서 시스템 모두에 효과적입니다. 공유 메모리및 원자성 테스트 및 설정 명령을 사용하면 상호 제외가 됩니다. 프로세스는 공유 메모리의 위치에서 테스트 및 설정할 수 있으며 작업이 원자성이므로 한 번에 하나의 프로세스만 플래그를 설정할 수 있습니다. 플래그를 설정하는 데 실패한 모든 프로세스는 다른 작업을 수행하고 나중에 다시 시도하거나 프로세서를 다른 프로세스로 릴리스하고 나중에 다시 시도하거나 플래그를 획득하는 데 성공할 때까지 플래그를 확인하는 동안 계속 반복할 수 있습니다. 선점은 여전히 가능하므로 이 방법을 사용하면 잠금을 유지하면서 프로세스가 중단되더라도 시스템이 계속 작동할 수 있습니다.

첫 번째 옵션은 pthreads 라이브러리에서 제공하는 뮤텍스 잠금을 사용하여 공유 카운터 변수에 액세스할 때 상호 제외를 적용하는 것입니다. 함수 inc_mutex 및 dec_mutex에 필요한 동기화를 추가하여 원하는 동작에 따라 프로그램을 실행할 수 있습니다. 유니프로세서 시스템에서 상호 배제를 달성하는 가장 간단한 솔루션은 프로세스의 중요한 섹션 동안 인터럽트를 사용하지 않도록 설정하는 것입니다. 이렇게 하면 인터럽트 서비스 루틴이 실행되지 않습니다(프로세스가 선점되는 것을 효과적으로 방지). 이 솔루션은 효과적이지만 많은 문제가 발생합니다. 임계 섹션이 길면 타이머 인터럽트(timer interrupt)가 더 이상 서비스되지 않으므로 임계 섹션이 실행될 때마다 시스템 클럭이 표류하므로 임계 섹션 동안 추적 시간이 불가능합니다. 또한 중요한 섹션 중에 프로세스가 중지되면 제어가 다른 프로세스로 반환되지 않고 전체 시스템이 효과적으로 중단됩니다. 상호 배제를 달성하기위한 보다 우아한 방법은 바쁜 대기입니다. 하나의 이진 테스트 및 집합 레지스터는 상호 제외 문제에 교착 상태가 없는 솔루션을 제공하기에 충분합니다. 그러나 테스트 세트 레지스터로 구축 된 솔루션은 시도 섹션에 잡힐 수있는 일부 프로세스의 기아로 이어질 수 있습니다. [4] 사실, Ω (n) {디스플레이 스타일 오메가 ({sqrt {n}}}} 고유한 메모리 상태는 잠금을 피하기 위해 필요합니다. 무한 대기를 방지하려면 고유한 메모리 상태가 필요합니다.

[9] 상호 배제의 요구 사항은 동시 프로그래밍 제어의 문제의 해결이라는 제목의 1965 년 논문에서 Edsger W. Dijkstra에 의해 처음 확인되고 해결되었으며,[1][2] 동시 알고리즘 연구에서 첫 번째 주제로 인정됩니다. [3] 분산 상호 배제에 대한 솔루션: 공유 변수 또는 로컬 커널을 알고 있으므로 분산 시스템에서 상호 제외를 구현하는 데 사용할 수 없습니다.