테스트 앤 세트에 대한 합의 수가 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 , bc 를 각각 결정하려는 세 개의 스레드 , BC 가 있고 테스트 앤 세트 (및 원자 읽기 및 쓰기를 사용하여 구현 된 유효한 대기없는 합의 프로토콜)가 있다고 가정하십시오. ).

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

  • 루트는 스레드가 '이동'하지 않은 상태입니다.
  • 노드의 왼쪽 자식은 만큼 이동 한 후의 상태를 나타내고 중간 자식은 B 만큼 이동 한 후의 상태를 나타내고 오른쪽 자식은 C 만큼의 이동 후의 상태를 나타냅니다 .
  • 리프 노드는 모든 스레드가 완료된 상태를 나타냅니다. 리프 노드와 연관된 값 , b 또는 c입니다 . 여기서 값은 특정 실행에 대해 결정된 값에 따라 다릅니다.

정의. 합의 과정의 결과가 아직 결정되지 않은 경우 상태를 다가로 보자 . 다시 말해, 나머지 움직임의 가능한 모든 인터리빙이 동일한 결과를 초래하는 것은 아닙니다. 합의 과정의 결과 결정될 때 국가를 일 가로 보자 .

뿌리는 다가입니다. 증명. 하나의 스레드 만 활성 상태이고 다른 스레드는 영원히 휴면 상태 인 경우 X 는 유한 한 단계로 완료되며 (대기없는 가정으로 보장) x 를 결정합니다 (이 값에만 액세스 할 수 있기 때문에 결정은 합의 유효성 요구 사항을 충족시킬 것입니다). 따라서 우리의 상황에서 a , bc 는 모두 가능한 결과입니다. 엑스엑스엑스

정의. 위험 상태에 의해 이동하는 추가적인 속성과 함께 다가 한 상태라고하자 결정할 하고 이동하여 B를 결정한다 (B)를 .

위험 상태가 있습니다. 증명. 위에서 우리는 우리가 다가 상태에서 시작한다는 것을 알고 있습니다. 가 전혀 움직이지 않게 하자 . 긴 하나만큼 또는 B는 원자가 상태로 트리를 강제로하지 않습니다, 그것은 이동을 할 수 있습니다. Wait-freeness는 트리가 유한함을 보장하므로 어느 시점에서 위험 상태가 발생해야합니다.

이제 우리가 위험 상태에있는 시나리오를 고려하십시오. 있다 적어도 두 가지 가능성이 :

1) 가 움직 이며 (따라서 a 결정 ) 정지합니다. 그런 다음 B 는 움직이고 멈 춥니 다. 다음 C 는 끝날 때까지 실행되어 결국 a를 결정 합니다 .

2) 는 움직 이며 (따라서 b 결정 ) 정지합니다. 다음 C 는 끝날 때까지 실행되어 결국 b를 결정 합니다. A 는 움직이지 않습니다.

원자 읽기 및 쓰기가 합의 번호 1을 갖기 때문에 B 의 이동은 동일한 레지스터에 대한 테스트 및 설정 명령이어야했습니다 (레지스터가 다른 경우 CAB 의 순서를 알 수 없습니다) 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.