나는에 그렇게 생각 피터슨의 알고리즘 에 대한 상호 배제 프로세스가 먼저 임계 영역을 입력 할 경우 사망하거나, 다른 프로세스가 루프 영원히의 중요한 섹션을 시작하기 위해 대기하는 것 취소했다.
그림에서, 프로세스 1이 중지되면 프로세스 1 뒤의 나머지 프로세스는 프로세스 1의 위치까지 실행 한 다음 루프됩니다.
중요 섹션에 도달 한 프로세스가 종료되기 전에 먼저 종료되면 어떻게됩니까?
나는에 그렇게 생각 피터슨의 알고리즘 에 대한 상호 배제 프로세스가 먼저 임계 영역을 입력 할 경우 사망하거나, 다른 프로세스가 루프 영원히의 중요한 섹션을 시작하기 위해 대기하는 것 취소했다.
그림에서, 프로세스 1이 중지되면 프로세스 1 뒤의 나머지 프로세스는 프로세스 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
², 프로세서 오류, 네트워크 연결 끊기 등) 안전합니다. 이 경우 중요하지 않은 소프트웨어는 대부분 실패합니다. 실행 중이 아닌 오류를 어떻게 처리 할 수 있습니까? 많은 경우에 받아 들여 져야합니다. 필요한 경우 다시 시작할 때 불일치를 처리 할 수 있습니다.
적절한 언어 수준 잠금을 사용하면 런타임 시스템에서 소실 잠금 소유자 (예 : 죽은 소유자의 잠금 해제)를 처리 할 수 있습니다. 각 프로세스에 다른 사람이 읽을 수있는 죽은 사람의 스위치를 제공하거나 잠금 소유 프로세스가 아직 살아 있는지 (시스템이 지원하는 경우) 직접 확인하여이를 직접 시뮬레이션 할 수 있습니다.
finalize
on조차도 실행해야 한다고 생각 kill
하지만 사양에 의해 보장되지는 않습니다. kill -9
아마도 죽어가는 과정에서 무언가를해야하는 해결책에 대한 사형 선고 일 것입니다.