안전하지 않은 상태가 항상 교착 상태를 유발하지 않는 이유는 무엇입니까?


10

저는 Galvin의 운영 체제를 읽고 아래 행을 보았습니다.

그러나 모든 안전하지 않은 상태가 교착 상태 인 것은 아닙니다. 안전하지 않은 상태는 교착 상태로 이어질 수 있습니다

누군가 교착 상태! = 안전하지 않은 상태 를 설명 할 수 있습니까 ? 나는 또한 여기에 같은 줄을 잡았다

안전 시퀀스가 ​​존재하지 않으면 시스템이 안전하지 않은 상태에있게되어 교착 상태가 발생할 수 있습니다. (모든 안전 상태는 교착 상태가 없지만 모든 안전하지 않은 상태가 교착 상태로 이어지는 것은 아닙니다.)


1
교착 상태는 간헐적으로 발생 하는 경쟁 조건 과 유사한 개념 일 수 있습니다 . 안전하지 않은 코드는 특정 시퀀스가 ​​정렬 될 때 교착 상태 만 트리거합니다. 그 시퀀스는 "언제든지 일어날 수있는"일명 "사고가 일어나기를 기다리고있다"...
vzn

안전하지 않은 상태는 이론적으로 교착 상태 가능성이 있음을 의미합니다. 특정 상황이 발생하면 교착 상태가 발생할 수 있습니다. 안전한 상태를 위해 무슨 일이 있든 상관없이 교착 상태는 없습니다.
nishantbhardwaj2002

1
실제 상황에서 위험한 상황으로 인해 실제로 나쁜 일이 실제로 발생하는 것은 아닙니다.
David Richerby

답변:


14

교착 상태 는 특정한 것을 의미합니다. 현재 서로를 기다리는 동안 차단 된 두 개 이상의 프로세스가 있습니다 .

에서 안전하지 않은 상태 당신은 또한이 상황에있을 수 있습니다 미래의 교착 언젠가 수 있지만 프로세스 중 하나 또는 둘 모두가 실제로 대기 시작되지 않았기 때문에 아직 일어나지도 않은.

다음 예제를 고려하십시오.

Process A                  Process B
lock X                     lock Y           # state is "unsafe"
                           unlock Y
lock Y                                      # state is back to "safe" (no deadlock this time.  We got lucky.)

당신이 준 링크의 7.5.1 섹션에 더 흥미로운 예가 있습니다 .

다음과 같은 테이프 드라이브가 12 개인 시스템을 고려하십시오.

Process       Max Need       Current
P0:             10              5
P2:              9              3

안전하지 않은 상태입니다. 그러나 우리는 교착 상태가 아닙니다. 빈 드라이브는 4 개뿐이므로 P0 추가 5를 요청 하고 P2 1을 추가로 요청하면 교착 상태가 발생하지만 아직 발생하지 않았습니다. 그리고 P0은 더 이상 드라이브를 요청하지 않을 수도 있지만 대신 이미 가지고있는 드라이브를 비울 수 있습니다. 는 Max need프로그램의 모든 가능한 실행 이상이며,이 힘은 우리가 P0에서 10 개 개의 드라이브를 필요로하는 실행 중 하나가 될 수 없습니다.


너무 감사합니다! 그리고 나는 불분명 한 교과서를 싫어합니다 ...
Ning

그러나 나는 또한 몇 가지 질문을 가지고있다 : (1) 당신은 [ "] 최대 요구는 프로그램의 가능한 모든 실행을 끝냈다 [."] . 그러나 P0가 추가로 5를 요청하고 P2가 요청하면 [ "] 라고 말했다 추가 1, 우리는 것입니다 교착 상태 [. "] 여기서 (1) 수단을 최대 필요가 그것의 달성되지 않은 경우 가능 (2) 수단 동안 교착 상태를 가지고 해야 이 달성되지 때 교착 상태를 가지고?

내 추론이 맞습니까? : P2 추가 1을 요청하고 완료 하면 사용 가능한 테이프가 (4 + 3 = 7)이되고 P1이 추가 5를 요청하므로 달성 할 수 있으므로 교착 상태가 발생하지 않습니다. 그러나 P2 완료 되지 않으면 P1이 완료하기 위해 5, 여전히 4 <5 만 필요하기 때문에 교착 상태가 발생합니다.

마지막 예 : P0은 추가 5를 요청한 다음 5 + 5 + 3 = 13> 12를 요청하므로 P0은 P2를 기다려야합니다. 교착 상태를 생성하려면 P2가 추가 요청을하도록하십시오.
Bit_hcAlgorithm

7

방황 논리가 말한 것을 설명하기 위해.

X와 Y에 대한 액세스가 필요하고 교착 상태를 수정하는 메커니즘과 메커니즘이없는 두 개의 스레드가 있다고 가정 해보십시오. 하나는 X와 다른 Y를 잠그고 진행할 수 없으므로 안전하지 않습니다. 그러나 보장되지는 않습니다.

Thread 1                    Thread 2
Lock X                      
Lock Y
OS Interrupts Thread 1 and passes control to Thread 2
                            Unable to lock needed resources.
OS Interrupts Thread 2 and passes control to Thread 1
Unlock X                    
Unlock Y                    
                            Lock Y
                            Lock X
 ....

이 시나리오는 교착 상태에 빠지지 않았지만 가능했습니다. 스레딩이 작동하는 방식으로 인해 정해진 흐름이 없습니다. OS는 스레딩을 제어하므로 다음과 같이 발생할 수 있습니다.

Thread 1                    Thread 2
Lock X        
OS Interrupts Thread 1 and passes control to Thread 2
                            Lock Y              
DEADLOCK Thread 1 needs Y, Thread 2 needs X. Neither knows to back down and simply waits.

1

안전 상태는 교착 상태가 확실하지 않지만 교착 상태를 방지하기 위해 모든 요구 사항을 충족 할 수없는 경우 발생할 수 있습니다. 예를 들어 스레드 A를 시작하고 스레드 B를 시작할 때 두 스레드가 교착 상태에 빠질 수 있지만 반대 (B, A)를 시작하면 B가 더 좋다고 가정합니다.) 시스템 상태가 안전하지 않습니다. 그러나 운이 좋은 시작 순서로 작동합니다. 교착 상태는 없지만 가능합니다. 또한 수동으로 동기화하면-좋은 순서로 시작하십시오-위험합니다-어떤 이유로 든 원하는대로 발사되지 않을 수 있습니다-시스템은 여전히 ​​안전하지 않습니다 (교착 상태 때문에) 그러나 가능성은 낮습니다. 계속 진행 한 후 스레드 정지 또는 인터럽트와 같은 외부 이벤트의 경우 실패합니다.

안전 상태는 교착 상태를 피하기에 충분한 조건이지만 안전하지 않은 것은 단지 조건 일뿐입니다. 지금 당장 코드를 작성하는 것은 어렵지만 일부를 검색 할 수 있습니다. Ada에서 99/100 배 이상의 코드가 몇 주 동안 완벽하게 작동했으며 (서버 다시 시작으로 인해 교착 상태가 아닌) 중지되었지만 몇 초 후에 교착 상태로 중단되었습니다.

나누기와 비교하여 몇 가지 쉬운 예를 추가하겠습니다 .d가 0인지 여부를 확인하지 않고 함수가 c / d를 나누고 결과를 반환하면 0으로 나누기가 오류가있을 수 있으므로 코드는 안전하지 않습니다 (같은 이름 지정). 이러한 나눗셈을 수행하면 모든 것이 잘되지만 이론적 분석 코드가 안전하지 않으며 정의되지 않은 동작으로 제대로 처리되지 않을 수 있습니다.


0

여기에 대한 나의 이해가 있습니다 (잘못되면 수정하십시오) : (A) 교착 상태 인 경우주기 (필요한 조건 중 하나)가 있음을 의미합니다 (B) 교착 상태는 필수 조건입니다 (단일 및 다중 모두) 인스턴스 리소스)

이제 교착 상태로 이어지지 않는주기가 있음을 증명할 사이클이있는 안전하지 않은 상태 수 있습니다. 여기서 안전하지 않은 상태를 발견 한주기가 있음을 알 수 있지만주기에 참여하는 자원 R2가 프로세스 P3이 완료 및 릴리스 되 자마자 순환합니다 (P3에 종속성이 없거나 다른 리소스를 기다리는 중임을 기억하십시오).


2
사이트에 오신 것을 환영합니다! 작은 점 : "필요하지 않음"( "여기서는 주차 할 수 없음") 또는 "하지 않을 수도 있음"( "이 영화를 즐기지 못할 수도 있음)이 확실하지 않기 때문에 영어로 작성된"하지 않을 수 있음 "이라는 문구를 사용하지 않는 것이 가장 좋습니다. ")
David Richerby

0

사소한 안전하지 않은 상태 : 스레드 1이 A를 잠근 다음 B를 잠근 다음 두 잠금을 모두 해제합니다. 스레드 2는 잠금 B를 취한 다음 A를 잠금 해제 한 다음 두 잠금을 모두 해제합니다.

스레드 2 잠금 B 걸리는 경우에만 교착 상태로 이어질 것입니다 단지 스레드 1 개 복용 잠금 A를 사이 잠금 B을, 또는 1 스레드하려고하는 잠금 A를 취 단지 잠금 A.을 위해 노력 스레드 2 촬영 잠금 B 사이

스레드 1과 스레드 2가 한 시간에 한 번씩 무작위로이 작업을 수행하면 실제로 교착 상태로 이어지는 마이크로 초의 시간 간격이 있습니다. 결국 고객이 교착 상태에 빠질 때까지 고객에게 매우 오랜 시간이 걸릴 수 있습니다.

눈을 감고 길을 가로 질러 걷는다. 안전하지 않습니다. 그러나 항상 살해되는 것은 아닙니다 .

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