테스트 앤 세트에 대한 합의 수가 2 인 이유는 무엇입니까?


17

에 따르면 위키 백과 ,

테스트 및 설정 작업은 2 개 이하의 동시 프로세스에 대해 대기없는 합의 문제를 해결할 수 있습니다.

왜 두 개 이상의 프로세스에서 문제를 해결할 수 없습니까?

답변:


17

동일한 페이지에 있는지 확인하기 위해 먼저 다음 세 가지 정의를 고려하십시오.

정의. 테스트 및 설정은 스레드가 이전 값을 가져 와서 1을 쓰는 일부 이진 레지스터에 대한 읽기-수정-쓰기 명령입니다 (0과 1은 가능한 값이라고합시다).

정의. 모든 n 스레드가 동일한 값 (일관성 요구 사항)을 결정하고 모든 스레드가 스레드 중 하나에서 실제로 제안한 값 (유효성 요구 사항)을 결정하는 경우 스레드 간에 합의에 도달 합니다.엔엔

정의. 합의 프로토콜은 모든 메소드 호출이 유한 한 단계로 완료 될 때까지 대기하지 않습니다.

이제 두 가지 증명 스케치를 따르십시오.

주장 1. 합의 된 테스트 및 설정 횟수는 2 이상 입니다. 합의에 도달해야하는 두 개의 스레드 0과 1이 있다고 가정합니다. 우리는 각 스레드가 아래의 합의 프로토콜을 따르도록함으로써이를 수행 할 수 있습니다.

  1. 제안 된 값을 쓰십시오 . 여기서 t 는 스레드 ID이고 A 는 크기가 2 인 배열입니다.ㅏ[티]티ㅏ
  2. 일부 레지스터의 검사와 지정 명령을 수행 와 R이 0으로 초기화.아르 자형아르 자형
  3. 반환 값이 0이면 첫 번째입니다 : return . 그렇지 않으면 두 번째입니다 : return A [ | t − 1 | ] .ㅏ[티]ㅏ[|티−1|]

합의와 대기가 만족되는지 스스로 확인할 수 있습니다. ◻

(다음 증명을 위해, 나는 더 쉽게 따라 할 수 있다고 생각하기 때문에 일부 증명과 정의를 중첩 할 것입니다.)

주장 2. 합의 된 테스트 및 설정 개수는 최대 2 입니다. 모순으로. 값 a , b 및 c 를 각각 결정하려는 세 개의 스레드 , B 및 C 가 있고 테스트 앤 세트 (및 원자 읽기 및 쓰기를 사용하여 구현 된 유효한 대기없는 합의 프로토콜)가 있다고 가정하십시오. ).ㅏ비씨ㅏ비씨

합의 과정을 다음과 같은 방향의 나무로 시각화 할 수 있습니다.

  • 루트는 스레드가 '이동'하지 않은 상태입니다.
  • 노드의 왼쪽 자식은 만큼 이동 한 후의 상태를 나타내고 중간 자식은 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를 갖는다.


답변 Roy에 감사드립니다. 이 주제에 대해 설명만큼 명쾌한 자료를 지적 할 수 있습니까? :). 내가 찾은 모든 자료는 너무 형식적이었습니다.
— sanatana

@ sanatana : 귀하의 질문에 답변하는 것을 잊었습니다. 죄송합니다. 여전히 관련이있는 경우 : Herlihy와 Shavit의 '멀티 프로세서 프로그래밍 기술'(특히 5 장)과 Fokkink의 동시성 및 멀티 스레딩 코스의 코스 자료 : cs.vu.nl/~tcs/cm (기반) Herlihy와 Shavit의 책). 페이지 하단에는 Herlihy의 비디오 강의 링크가 있습니다 (9 월 27 일 강의는 컨센서스에 대한 것임). 자료를 검토 한 후에 이런 종류의 증명을 위해 이진 트리를 고려하는 것으로 충분하다는 것을 알았습니다. 아마도 나는 나중에 대답을 업데이트 할 것입니다.
— Roy O.

@RoyO. 귀하의 답변에 따르면 3 가지 프로세스에 대한 합의에 도달 할 수있는 방법이 없습니다. 어떤 식 으로든 우리가 여전히 합의에 도달 할 수 있지만 그 프로토콜이 기다릴 수 없다는 것을 증명하고 싶습니까?
— 궁극적 인 원인

6

Wikipedia 기사에는 질문에 대한 답변이 들어 있지만 26 페이지를 읽고 싶지는 않을 것입니다. 테스트와 설정이 3 개의 프로세스에 대한 이진 합의를 해결할 수 없음을 보여주는 간단한 (간결한 기술) 증명 버전을 제공합니다. 이러한 종류의 논쟁은 합의 수를 증명하는 데 널리 사용됩니다.

3 개의 프로세스에 TAS 레지스터를 사용하는 합의 알고리즘이 있다고 가정 해 봅시다.

어느 시점에서나 각 프로세스에는 실행할 준비가 된 이동 (명령)이 있습니다. 세 가지 명령 중 어떤 명령이 실행 될지는 결정적이지 않습니다.

우리가 2가 상태 (0 또는 1 결정이 여전히 가능한 상태)에 있고 다음 프로세스가 진행될 때 후속 상태는 1 가라고 가정합니다. 이러한 상태는 대기없는 상태로 인해 결국 도달해야합니다.

프로세스 1이 이동하면 상태가 0가되고 프로세스 2가 이동하면 상태가 1가된다고 가정합니다 (wlg). 두 레지스터 모두 동일한 레지스터에서 TAS 작업 (또는 적어도 일종의 쓰기)이어야합니다. 별개의 레지스터에서 TAS 작업 인 경우 프로세스 1이 먼저 이동했는지 아니면 프로세스 2가 먼저 이동했는지 알 수 없기 때문입니다.

이 두 가지 가능한 실행을 고려해 봅시다.

  • 프로세스 1이 먼저 이동 한 다음 프로세스 2가 이동 한 다음 프로세스 3이 단독으로 실행됩니다.
  • 프로세스 2가 먼저 이동 한 다음 프로세스 3이 단독으로 실행

프로세스 3의 관점에서 볼 때 이러한 상태는 프로세스 2에 의해 쓰여진 값을 볼 수 있기 때문에 구별 할 수 없습니다. 그러나 첫 번째 경우에는 0을 출력으로, 두 번째는 1을 출력으로 제공해야합니다. 분명히 이것은 모순입니다.

프로세스 1과 프로세스 2는 쓰기 전에 레지스터에 어떤 값이 있는지 알 수 있기 때문에 먼저 이동 한 프로세스를 결정할 수 있지만 세 번째 관찰자 프로세스는 그렇지 않습니다.


1

3- 프로세서 컨센서스를 해결하기 위해 테스트 앤 세트를 사용할 수 없음을 증명하는 또 다른 방법은 2- 프로세서 컨센서스를 사용하여 테스트 앤 세트를 구현할 수 있음을 보여주는 것입니다. 그런 다음 테스트 앤 세트가 3- 프로세서 컨센서스를 해결할 수 있다고 가정하면 모순을 초래할 수 있습니다. 테스트 앤 세트가 3- 프로세서 컨센서스를 해결할 수 있다고 가정하십시오. 그런 다음 2- 프로세서 컨센서스를 사용한 구현으로 테스트 앤 세트를 대체함으로써 2- 프로세서 컨센서스를 사용하여 3- 프로세서 컨센서스를 구현할 수 있습니다. 따라서 테스트 및 설정은 3- 프로세서 컨센서스를 해결할 수 없습니다.

2 개의 프로세서 합의를 사용하여 n 프로세서에 대한 테스트 및 설정을 구현하려면 프로세서가 2 개의 프로세서 합의 (일치하는 프로세서에서 그들의 식별자를 제안하고 합의 결과는 누가 이겼는지 알려줍니다).


0

실제로는 덜 엄격한 합의 정의로 충분할 수 있습니다 (여기서 저는이를 가벼운 합의라고 부릅니다).

정의 . (a) 각 스레드가 동일한 값을 결정하거나 그 값을 알 수없는 경우, (b) 적어도 하나의 스레드가 값을 알고 있으며 (c)이 값이 실제로 다음 중 하나에 의해 제안되었습니다. 스레드.

따라서이 합의는 더 가벼운 의미에서 일부 스레드가 결정된 값인 합의를 알지 못하게합니다.

Corollary :이 가벼운 의미에서 테스트 및 설정은 무한한 빛 합의 수를 갖습니다.

주장 :이 가벼운 감각은 실용적입니다. 예를 들어 임계 섹션에 들어갈 스레드를 선택하기 위해 엄격한 의미에서 합의를 만들 필요는 없습니다. 즉, 각 스레드는 스레드가 선택되었는지 여부를 알아야하지만 선택되지 않은 경우 선택된 스레드를 알 필요가 없습니다. 다시 말해, 상호 배제를 위해 엄격한 합의가 필요하지 않다면 빛이 충분합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.