Peterson의 2 단계 상호 배제 알고리즘이 죽어가는 프로세스를 설명합니까?


9

나는에 그렇게 생각 피터슨의 알고리즘 에 대한 상호 배제 프로세스가 먼저 임계 영역을 입력 할 경우 사망하거나, 다른 프로세스가 루프 영원히의 중요한 섹션을 시작하기 위해 대기하는 것 취소했다.

그림에서, 프로세스 1이 중지되면 프로세스 1 뒤의 나머지 프로세스는 프로세스 1의 위치까지 실행 한 다음 루프됩니다.

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

중요 섹션에 도달 한 프로세스가 종료되기 전에 먼저 종료되면 어떻게됩니까?


이에 따라 귀하의 질문을 편집했습니다. 알고리즘을 두 개 이상의 프로세스로 확장하는 방법에 대해서는 언급하지 않았으므로 질문 부분을 변경했습니다. 문제가 이미 2 프로세스 버전에 있다고 생각합니다. 그래도 여전히 그림을 이해하지 못합니다.
Raphael

답변:


1

이것은 잠금 구현 방법에 따라 다릅니다. Wikipedia 기사에서와 같이 프로세스, 즉 프로세스 당 하나의 부울로 중요 섹션을 보호하는 경우 ¹ 문제가 발생할 수 있습니다. 한 프로세스가 종료되면 플래그를 재설정하지 않으므로 다른 프로세스가 영원히 반복됩니다.

실제로 여러 가지 방법으로 코드를 보호 할 수 있습니다. 예를 들어 다음 Java 스타일 구현을 사용하십시오.

flag[1] = true;
turn = 1;
while ( flag[0] == true && turn == 1 ) { Thread.yield(); }
try {
  // critical section
}
finally {
  flag[1] = false;
}

이렇게하면 시스템이 오류를 처리하는 한 중요한 섹션에서 발생하는 모든 플래그가 재설정됩니다. Java에서는 스택 및 힙 오버플로에서도 마찬가지입니다. 따라서 프로세스가 문자 그대로 사라지지 않는 한 ( kill², 프로세서 오류, 네트워크 연결 끊기 등) 안전합니다. 이 경우 중요하지 않은 소프트웨어는 대부분 실패합니다. 실행 중이 아닌 오류를 어떻게 처리 할 수 ​​있습니까? 많은 경우에 받아 들여 져야합니다. 필요한 경우 다시 시작할 때 불일치를 처리 할 수 ​​있습니다.

적절한 언어 수준 잠금을 사용하면 런타임 시스템에서 소실 잠금 소유자 (예 : 죽은 소유자의 잠금 해제)를 처리 할 수 ​​있습니다. 각 프로세스에 다른 사람이 읽을 수있는 죽은 사람의 스위치를 제공하거나 잠금 소유 프로세스가 아직 살아 있는지 (시스템이 지원하는 경우) 직접 확인하여이를 직접 시뮬레이션 할 수 있습니다.


  1. 어쨌든 그것은 잘 확장되지 않습니다.
  2. Java에서는 finalizeon조차도 실행해야 한다고 생각 kill하지만 사양에 의해 보장되지는 않습니다. kill -9아마도 죽어가는 과정에서 무언가를해야하는 해결책에 대한 사형 선고 일 것입니다.

1

가정을 살펴보십시오. 특히 중요 섹션에 프로세스가 무한정 남아 있지 않습니다 (확실히 사라지기만 함). 동기화 메커니즘으로 일반적인 문제를 해결할 방법이 없다고 생각합니다.

이 솔루션은 또한 두 가지 프로세스 에만 해당됩니다. 주위 프로세스.

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