Peterson과 Dekker 알고리즘 비교


41

Peterson과 Dekker의 알고리즘을 이해하려고합니다.이 알고리즘은 매우 유사하며 많은 대칭을 나타냅니다.

알고리즘을 다음과 같이 비공식 언어로 공식화하려고했습니다.

Peterson's: "I want to enter."                 flag[0]=true;
            "You can enter next."              turn=1;
            "If you want to enter and          while(flag[1]==true&&turn==1){
            it's your turn I'll wait."         }
            Else: Enter CS!                    // CS
            "I don't want to enter any more."  flag[0]=false;

Dekker's:   "I want to enter."                 flag[0]=true;
            "If you want to enter              while(flag[1]==true){
             and if it's your turn               if(turn!=0){
             I don't want to enter any more."      flag[0]=false;
            "If it's your turn                     while(turn!=0){
             I'll wait."                           }
            "I want to enter."                     flag[0]=true;
                                                 }
                                               }
            Enter CS!                          // CS
            "You can enter next."              turn=1;
            "I don't want to enter any more."  flag[0]=false;

차이점은 Dekker 's 에서 "You can enter next."발생 하는 지점 과 사실입니다 "if it's your turn I don't want to enter any more.".

Peterson의 알고리즘에서 두 프로세스가 우세한 것 같습니다. 프로세스는 다른 쪽이 아닌 한 중요한 부분으로 들어가는 것처럼 보입니다.

반대로, Dekker의 알고리즘에서 두 프로세스는 복종적이고 정중 한 것으로 보입니다. 두 프로세스가 모두 임계 섹션에 들어가기를 원하고 다른 프로세스가되면 더 이상 들어 가지 않기로 결정합니다. (이것은 기아 자유에 필요한가? 왜인가?)

이 알고리즘은 정확히 어떻게 다릅니 까? Peterson의 프로세스에서 두 프로세스가 모두 임계 섹션에 들어 가려고하면 프로세스에 "I enter"가 표시되고 Dekker의 프로세스에 "You may enter"가 표시됩니다. 누군가가 각 알고리즘에서 프로세스가 동작하는 방식을 정리할 수 있습니까? 비공식적 인 용어로 표현하는 방식이 올바른가요?


Peterson의 알고리즘은 플래그 자체에 대한 읽기 및 쓰기가 중요한 섹션 문제이므로 중요한 섹션 문제를 완전히 해결하지는 않습니다. 실제로 문제를 완전히 해결하는 논문은 Henk JM Goeman의 "중재자 : 동기화 프리미티브 구현을위한 활성 시스템 구성 요소"입니다.
user3083171

답변:


24

알고리즘에 대한 비공식적 인 설명은 훌륭합니다.

필자는 두 경우 모두 저자가 상호 배제와 교착 상태의 자유를 보장하는 가장 간단한 해결책을 찾으려고 노력했다고 생각합니다. 알고리즘은 기아가 없거나 공평하지 않습니다.[ed : 의견에서 지적했듯이 Peterson의 알고리즘은 기아가 없으며 공평합니다.] Dekker의 솔루션은로드 및 저장 명령어 만 사용한 최초의 상호 배제 알고리즘이었습니다. 그것은 Edjk W. Dijkstra에서 소개되었습니다 . F. Genuys, ed., Programming Languages ​​: NATO Advanced Study Institute , pp. 43-112, Academic Press, 1968의 "순차 프로세스 협력" . 논문을 읽으면 Dijkstra가 여러 가지 시도를 통해 각 문제를 인식 한 후 다음 버전에 약간 더 추가하는 것을 볼 수 있습니다. 그의 알고리즘의 비 효율성의 일부는 그가 턴 테이킹 알고리즘으로 시작한 다음 프로세스가 임의의 순서로 진행되도록 수정하려고한다는 사실에서 비롯됩니다. (단지 0,1,0,1, ...)

Peterson의 알고리즘은 Dekker의 알고리즘에 대한 10 년 이상의 경험과 뒷받침 후 1981 년에 출판되었습니다. Peterson은 정확성 증명이 훨씬 쉬워 지도록 Dekker보다 훨씬 간단한 알고리즘을 원했습니다. 당신은 그가 그의 논문 제목에서 커뮤니티와 약간의 좌절감을 느끼고 있음을 알 수 있습니다. Peterson, GL; "상호 배제 문제에 관한 신화", Inf. Proc. 레트 사람. , 12 (3) : 115-116, 1981. 매우 빠르게 읽고 잘 작성합니다. Peterson의 논문은 또한 간단한 시도에서 자신의 솔루션을 구축 한 프로세스에 대해 논의합니다. (그의 솔루션이 더 단순하기 때문에 중간 단계가 덜 필요했습니다.) 주된 차이점 ( "복종 성"이 아니라 "지배"라고 함)은 Peterson이 새로 시작했기 때문에 (Dijkstra가 시작한 턴-턴킹 알고리즘이 아니라) ) 그의 대기 루프는 더 간단하고 효율적입니다. 그는 Dijkstra가 매번 백 오프하고 다시 시도 해야하는 동안 간단한 루프 테스트로 도망 칠 수 있음을 알고 있습니다.

Lamport의 베이커리 알고리즘 논문을 언급해야한다고 생각합니다 : Lamport, Leslie; "Dijkstra의 동시 프로그래밍 문제의 새로운 해결책", Comm ACM 17 (8) : 453-455, 1974 . 베이커리 알고리즘은 Dekker 알고리즘보다 간단하고 (두 개 이상의 프로세서 인 경우에는 훨씬 간단 함), 특히 내결함성을 갖도록 설계되었습니다. 두 가지 이유로 구체적으로 언급합니다. 첫 번째는 상호 배제 문제의 정의에 대한 약간의 역사를 제공하고 1974 년까지이를 해결하려고 시도하기 때문입니다. 두 번째는 베이커리 알고리즘이 상호 배제 문제를 해결하기 위해 하드웨어 원 자성이 필요하지 않음을 보여주기 때문입니다.

마지막으로, 내가 가장 좋아하는 것은 Lamport, Leslie입니다. "빠른 상호 배제 알고리즘" ACM Trans. Comp. Sys. , 5 (1) : 1-11, 1987. 이 백서에서 Lamport는 중요한 부분에 대한 경합이 거의없는 (일반적인) 경우의 상호 배제 문제에 대한 솔루션을 최적화하려고했습니다. 다시 말하지만 상호 배제와 교착 상태의 자유는 보장하지만 공정성은 보장하지 않습니다. 그것은 경합이 없을 때 O (1) 시간에 N 프로세서를 동기화 할 수있는 정상적인 읽기 및 쓰기만을 사용하는 최초의 상호 배제 알고리즘이라고 생각합니다. (경쟁이있을 때는 O (N) 테스트로 돌아갑니다.) 경합이없는 경우 최선을 다하는 것은 7 번의 메모리 액세스라는 비공식 데모를 제공합니다. (Dekker와 Peterson은 모두 4로 처리하지만 2 개의 프로세서 만 처리 할 수 ​​있습니다. 알고리즘을 N으로 확장하면 추가 O (N) 액세스를 추가해야합니다.)

결론적으로 Dekker의 알고리즘 자체는 주로 역사적 관점에서 흥미 롭습니다. Dijkstra의 논문은 상호 배제 문제의 중요성을 설명하고 해결할 수 있음을 보여주었습니다. 그러나 수년간의 가늠자로 데커보다 더 간단하고 효율적인 솔루션이 발견되었습니다.


3
>> 두 알고리즘 모두 기아가 없거나 공평하지 않습니다. 사실이 아닙니다. Peterson의 알고리즘은 기아가없고 공평합니다. 스레드가 중요한 섹션에 있고 다른 스레드가 대기 루프에서 대기중인 경우 CS에 있던 스레드가 훨씬 빠르더라도 대기중인 스레드는 다음에 CS로 들어갑니다.

Peterson의 알고리즘은 user24190의 의견을 반복하기 만하면 기아가없고 공정 하다는 점을 강조하고 싶습니다 . 이 해가 지나도이 답변의 저자가 댓글에 답하지 않았거나 자신의 답변을 수정하지 않은 이유를 이해할 수 없습니다. (내 의견을 제거 할 수 있도록 답변을 수정 한 후에는 반드시 Ping을 수행하십시오.)
Apass.Jack

"상호 배제 문제에 대해 신화"피터슨의 구매 링크 doi.org/10.1016/0020-0190(81)90106-X
strager

Peterson의 "상호 제외 문제에 대한 신화"(Archive.org) : web.archive.org/web/20150501155424/https://cs.nyu.edu/~lerner/…
Strager

3

다음 백서에서는 Peterson 및 Dekker 알고리즘 (및 기타 알고리즘)에 대한 공식 모델을 제공하고 모델 검사기를 사용하여 속성을 증명했습니다. 아래 표에서 결과를 찾으십시오 ( "Deadlock"및 "Divergent"열은 모델을 나타냅니다. "ME"= TRUE는 알고리즘이 정확함을 의미하고, "Overtaking"= TRUE는 공정함을 의미 함).

R. Meolic, T. Kapus, Z. Brezočnik. ACTLW-운영자가없는 작업 기반 계산 트리 논리. 정보 과학, 178 (6), pp. 1542-1557, 2008.

https://doi.org/10.1016/j.ins.2007.10.023

여기에 이미지 설명을 입력하십시오


1

피터슨 알고리즘은 더 갖고 엄격한 같은 경우, 임계 영역에 들어가기에 압력을 데커 의 알고리즘은 상대적이다 연질 공격적. 좀 더 명확하게하기 위해이란 문화에 대한 예를 살펴 보겠습니다. 이 예에 들어가기 전에,이란 사람들이 어딘가에 들어가면서 서로에게 부드러운 행동을한다는 ​​것을 아는 것이 좋습니다! 두 명의이란 인이 집에 들어올 것 같아요. 그 집에는 들어갈 문이 하나 밖에 없습니다.

이제 또 다른 문화 (에서 두 사람이 상상 Zombian 문화 어딘가에 입력하는 동안 실제로 서로에 대해 너무 많이 걱정하지 않는다) ( 그가 입력하거나하지 원하는지 사람에게 물어 존중의 문제이다 ).

문제에 대한 정보를 명확히하기 위해 다음과 같이 말할 수 있습니다.

  • 두 명의이란 = 데커 알고리즘을 사용하는 두 개의 프로세스
  • Two Zombians = Peterson 알고리즘을 사용하는 두 개의 프로세스

각 알고리즘 ( culture ) 에서 수행 된 작업을 알아 봅시다 . 다음 은 덱커 알고리즘 을 사용하면서 집에 들어갈 첫 번째 이란 인에 대한 의견입니다 .

p0:
   wants_to_enter[0] ← true // Goes through the house entrance
   while wants_to_enter[1] { // If the other man wants to enter too
      if turn ≠ 0 { // Then see if it is your turn or not
         wants_to_enter[0] ← false // If it is not your turn don't go furthur
         while turn ≠ 0 { // and wait until it is your turn
           // busy wait
         }
         wants_to_enter[0] ← true // when it is your turn go through the door
      }
   }

   // critical section
   ...
   turn ← 1
   wants_to_enter[0] ← false // Set the turn for the other man
   // remainder section

우리는 Peterson 알고리즘을 사용하여 집에 들어갈 두 명의 좀비 도 있습니다 . 이것은 다음과 같습니다.

P0:     
  flag[0] = true; // Goes through the house entrance
  turn = 1; // Set the turn for himself
  while (flag[1] && turn == 1) // Wait until the other one is going in
  {
   // busy wait
  }
   // critical section
      ...
   // end of critical section
  flag[0] = false; // Done going inside

두 사람이 안으로 들어 가지 않고 다른 사람이 그렇게하는 동안 언급하는 것이 중요합니다 ( 상호 배제 ). 이란 사람들은 훨씬 더 부드럽습니다.

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