답변:
동일한 페이지에 있는지 확인하기 위해 먼저 다음 세 가지 정의를 고려하십시오.
정의. 테스트 및 설정은 스레드가 이전 값을 가져 와서 1을 쓰는 일부 이진 레지스터에 대한 읽기-수정-쓰기 명령입니다 (0과 1은 가능한 값이라고합시다).
정의. 모든 n 스레드가 동일한 값 (일관성 요구 사항)을 결정하고 모든 스레드가 스레드 중 하나에서 실제로 제안한 값 (유효성 요구 사항)을 결정하는 경우 스레드 간에 합의에 도달 합니다.
정의. 합의 프로토콜은 모든 메소드 호출이 유한 한 단계로 완료 될 때까지 대기하지 않습니다.
이제 두 가지 증명 스케치를 따르십시오.
주장 1. 합의 된 테스트 및 설정 횟수는 2 이상 입니다. 합의에 도달해야하는 두 개의 스레드 0과 1이 있다고 가정합니다. 우리는 각 스레드가 아래의 합의 프로토콜을 따르도록함으로써이를 수행 할 수 있습니다.
합의와 대기가 만족되는지 스스로 확인할 수 있습니다.
(다음 증명을 위해, 나는 더 쉽게 따라 할 수 있다고 생각하기 때문에 일부 증명과 정의를 중첩 할 것입니다.)
주장 2. 합의 된 테스트 및 설정 개수는 최대 2 입니다. 모순으로. 값 a , b 및 c 를 각각 결정하려는 세 개의 스레드 , B 및 C 가 있고 테스트 앤 세트 (및 원자 읽기 및 쓰기를 사용하여 구현 된 유효한 대기없는 합의 프로토콜)가 있다고 가정하십시오. ).
합의 과정을 다음과 같은 방향의 나무로 시각화 할 수 있습니다.
정의. 합의 과정의 결과가 아직 결정되지 않은 경우 상태를 다가로 보자 . 다시 말해, 나머지 움직임의 가능한 모든 인터리빙이 동일한 결과를 초래하는 것은 아닙니다. 합의 과정의 결과 가 결정될 때 국가를 일 가로 보자 .
뿌리는 다가입니다. 증명. 하나의 스레드 만 활성 상태이고 다른 스레드는 영원히 휴면 상태 인 경우 X 는 유한 한 단계로 완료되며 (대기없는 가정으로 보장) x 를 결정합니다 (이 값에만 액세스 할 수 있기 때문에 결정은 합의 유효성 요구 사항을 충족시킬 것입니다). 따라서 우리의 상황에서 a , b 및 c 는 모두 가능한 결과입니다. ◻
정의. 위험 상태에 의해 이동하는 추가적인 속성과 함께 다가 한 상태라고하자 결정할 를 하고 이동하여 B를 결정한다 (B)를 .
위험 상태가 있습니다. 증명. 위에서 우리는 우리가 다가 상태에서 시작한다는 것을 알고 있습니다. 가 전혀 움직이지 않게 하자 . 긴 하나만큼 또는 B는 원자가 상태로 트리를 강제로하지 않습니다, 그것은 이동을 할 수 있습니다. Wait-freeness는 트리가 유한함을 보장하므로 어느 시점에서 위험 상태가 발생해야합니다. ◻
이제 우리가 위험 상태에있는 시나리오를 고려하십시오. 있다 적어도 두 가지 가능성이 :
1) 가 움직 이며 (따라서 a 결정 ) 정지합니다. 그런 다음 B 는 움직이고 멈 춥니 다. 다음 C 는 끝날 때까지 실행되어 결국 a를 결정 합니다 .
2) 는 움직 이며 (따라서 b 결정 ) 정지합니다. 다음 C 는 끝날 때까지 실행되어 결국 b를 결정 합니다. A 는 움직이지 않습니다.
원자 읽기 및 쓰기가 합의 번호 1을 갖기 때문에 와 B 의 이동은 동일한 레지스터에 대한 테스트 및 설정 명령이어야했습니다 (레지스터가 다른 경우 C 는 A 와 B 의 순서를 알 수 없습니다) B 의 움직임이 일어났다). 에서 C 우리가 가지고 있어야하므로 '의 관점에서, 다음, 시나리오 1과 2는 구별 C가 모두 결정 와 B를 . 이건 불가능 해. ◻
시험 및 설정 지시는 제 1 항 및 제 2 항 모두에서 합의 번호 2를 갖는다.
Wikipedia 기사에는 질문에 대한 답변이 들어 있지만 26 페이지를 읽고 싶지는 않을 것입니다. 테스트와 설정이 3 개의 프로세스에 대한 이진 합의를 해결할 수 없음을 보여주는 간단한 (간결한 기술) 증명 버전을 제공합니다. 이러한 종류의 논쟁은 합의 수를 증명하는 데 널리 사용됩니다.
3 개의 프로세스에 TAS 레지스터를 사용하는 합의 알고리즘이 있다고 가정 해 봅시다.
어느 시점에서나 각 프로세스에는 실행할 준비가 된 이동 (명령)이 있습니다. 세 가지 명령 중 어떤 명령이 실행 될지는 결정적이지 않습니다.
우리가 2가 상태 (0 또는 1 결정이 여전히 가능한 상태)에 있고 다음 프로세스가 진행될 때 후속 상태는 1 가라고 가정합니다. 이러한 상태는 대기없는 상태로 인해 결국 도달해야합니다.
프로세스 1이 이동하면 상태가 0가되고 프로세스 2가 이동하면 상태가 1가된다고 가정합니다 (wlg). 두 레지스터 모두 동일한 레지스터에서 TAS 작업 (또는 적어도 일종의 쓰기)이어야합니다. 별개의 레지스터에서 TAS 작업 인 경우 프로세스 1이 먼저 이동했는지 아니면 프로세스 2가 먼저 이동했는지 알 수 없기 때문입니다.
이 두 가지 가능한 실행을 고려해 봅시다.
프로세스 3의 관점에서 볼 때 이러한 상태는 프로세스 2에 의해 쓰여진 값을 볼 수 있기 때문에 구별 할 수 없습니다. 그러나 첫 번째 경우에는 0을 출력으로, 두 번째는 1을 출력으로 제공해야합니다. 분명히 이것은 모순입니다.
프로세스 1과 프로세스 2는 쓰기 전에 레지스터에 어떤 값이 있는지 알 수 있기 때문에 먼저 이동 한 프로세스를 결정할 수 있지만 세 번째 관찰자 프로세스는 그렇지 않습니다.
3- 프로세서 컨센서스를 해결하기 위해 테스트 앤 세트를 사용할 수 없음을 증명하는 또 다른 방법은 2- 프로세서 컨센서스를 사용하여 테스트 앤 세트를 구현할 수 있음을 보여주는 것입니다. 그런 다음 테스트 앤 세트가 3- 프로세서 컨센서스를 해결할 수 있다고 가정하면 모순을 초래할 수 있습니다. 테스트 앤 세트가 3- 프로세서 컨센서스를 해결할 수 있다고 가정하십시오. 그런 다음 2- 프로세서 컨센서스를 사용한 구현으로 테스트 앤 세트를 대체함으로써 2- 프로세서 컨센서스를 사용하여 3- 프로세서 컨센서스를 구현할 수 있습니다. 따라서 테스트 및 설정은 3- 프로세서 컨센서스를 해결할 수 없습니다.
2 개의 프로세서 합의를 사용하여 n 프로세서에 대한 테스트 및 설정을 구현하려면 프로세서가 2 개의 프로세서 합의 (일치하는 프로세서에서 그들의 식별자를 제안하고 합의 결과는 누가 이겼는지 알려줍니다).
실제로는 덜 엄격한 합의 정의로 충분할 수 있습니다 (여기서 저는이를 가벼운 합의라고 부릅니다).
정의 . (a) 각 스레드가 동일한 값을 결정하거나 그 값을 알 수없는 경우, (b) 적어도 하나의 스레드가 값을 알고 있으며 (c)이 값이 실제로 다음 중 하나에 의해 제안되었습니다. 스레드.
따라서이 합의는 더 가벼운 의미에서 일부 스레드가 결정된 값인 합의를 알지 못하게합니다.
Corollary :이 가벼운 의미에서 테스트 및 설정은 무한한 빛 합의 수를 갖습니다.
주장 :이 가벼운 감각은 실용적입니다. 예를 들어 임계 섹션에 들어갈 스레드를 선택하기 위해 엄격한 의미에서 합의를 만들 필요는 없습니다. 즉, 각 스레드는 스레드가 선택되었는지 여부를 알아야하지만 선택되지 않은 경우 선택된 스레드를 알 필요가 없습니다. 다시 말해, 상호 배제를 위해 엄격한 합의가 필요하지 않다면 빛이 충분합니다.