교착 상태는 무엇입니까?
먼저 그러한 삶의 예를 살펴 보겠습니다. 강에는 다리가 있으며, 한 대의 차만 수용 할 수 있고 두 대의 차가 병렬로 갈 수없는 좁은 다리 데크가 있습니다. 두 대의 자동차 A와 B가 다리의 양쪽 끝에서 다리로 운전하면 자동차 A의 경우 브리지 데크 왼쪽의 도로 부분을 가로 질러 걸어갑니다 (즉, 다리의 자원의 일부를 차지합니다). 다리를 건너려면 오른쪽의 다리 데크를 포기하기 위해 자동차 B가 기다려야합니다. 현재 자동차 A는 앞으로 나아갈 수 없습니다. 자동차 B의 경우 브리지 데크 오른쪽에있는 도로의 한 부분을 가로 질러 걸어갑니다 (즉, 다리의 자원의 일부를 차지합니다). 다리를 건너려면 차가 왼쪽의 다리 데크를 포기하기 위해 차가 기다려야하며, 현재 자동차 B는 앞으로 나아갈 수 없습니다. 양쪽의 자동차는 반전되지 않았기 때문에 서로가 다리 데크를 포기하기를 기다렸지 만 아무도 길을 기다리지 않고 끝없이 기다렸다. 이 현상은 교착 상태입니다. 차량이 프로세스와 비교되고 브리지 데크가 자원으로 사용되는 경우 위의 문제는 다음과 같이 설명됩니다. 프로세스 A 자원 R1, 프로세스 B가 차지하는 자원 RR을 기다립니다. 프로세스 B는 프로세스 A가 차지하는 리소스 R1을 기다리는 리소스 RR을 보유하고 있습니다. 또한 리소스 R1과 RR은 하나의 프로세스 만 차지할 수있게합니다. 즉, 두 프로세스는 동시에 점유 할 수 없습니다. 결과적으로 어느 프로세스도 계속 실행할 수 없습니다. 다른 조치를 취하지 않으면이주기 대기 상황은 무기한으로 계속되고 프로세스 교착 상태가 발생합니다.
컴퓨터 시스템에서는 소프트웨어 및 하드웨어 리소스가 교착 상태에 빠질 수 있습니다. 예를 들어 : 시스템에는 하나의 CD-ROM 드라이버와 프린터가 하나뿐입니다. 하나의 프로세스는 CD-ROM 드라이버를 소유하고 프린터를 신청합니다. 다른 프로세스는 프린터를 소유하고 CD-ROM을 적용합니다. 결과적으로, 두 프로세스 모두 차단되며 자체적으로 분리 할 수 없습니다.
소위 교착 상태는 여러 프로세스가 자신이 차지하는 자원을 통해 순환하고 무기한 교착 상태를 유지하는 상황을 말합니다. 분명히 외부 힘이 없다면 교착 상태와 관련된 모든 프로세스는 항상 차단됩니다. 위의 예에서, 컴퓨터 시스템의 교착 상태에 대한 근본적인 이유는 자원이 제한적이고 부적절한 운영임을 알 수 있습니다. 즉, 한 가지 이유는 시스템이 자원이 너무 적고 동시 프로세스의 리소스 요구 사항을 충족하지 못하고 있기 때문입니다. 경쟁 자원으로 인한이 교착 상태는 우리의 토론의 핵심입니다. 예를 들어 : 메시지는 임시 리소스입니다. 어느 시점에서 프로세스 A는 프로세스 B에서 보낸 메시지를 기다리고 있으며 프로세스 B는 프로세스 C에서 전송 된 메시지를 기다리고 있으며 프로세스 C는 프로세스 A로 전송 된 메시지를 기다리고 있습니다. 메시지가 도착하지 않은 경우 세 가지 프로세스 A, B 및 C 중 어느 것도 전진 할 수 없으며 교착 상태도 프로세스 커뮤니케이션에서 발생하지 않습니다. 또 다른 이유는 부적절한 프로세스 진행 순서로 인한 교착 상태입니다. 소규모 자원이 반드시 교착 상태로 이어질 필요는 없습니다. 단일 판자 다리를 건너는 두 사람과 마찬가지로, 둘 다 먼저지나 가야하고 단일 판자 다리에서 교착 상태라면 필연적으로 경쟁 자원을위한 교착 상태로 이어질 것입니다. 그러나 두 사람이 다리에 가기 전에 다리에 다른 사람들이 있는지 확인하고 다리에 다른 사람이 없을 때만 스스로 다리를 올라가면 문제가 해결 될 것입니다. 따라서 프로그램이 부당하게 설계되고 프로세스가 부적절하게 홍보되면 교착 상태도 발생합니다.
이중 자물쇠
T1 스레드가 O1을 차지하고 O2가 필요하고 T2는 현재 O2를 사용하고 O1이 필요할 때에 만 교착 상태가 필요합니다. (두 명의 젓가락을 먹는 두 사람과 마찬가지로, 그들은 다른 파티에서 먹기 위해 하나의 젓가락이 필요합니다)
다음 코드 : T1 스레드는 O1을 차지하며 O2 객체를 얻은 후 O1 만 출시합니다. T2 스레드는 먼저 O2를 차지한 다음 O1을 획득합니다. 현재 O1은 T1 스레드에 의해 점유되며 O2는 T2 스레드에 의해 점유되며 T1 및 T2는 무한히 대기하고 교착 상태가 발생합니다.
패키지 javasimple;/** * 교착 상태 데모 * @author haokui */public class diesynchronized {public static void main (String [] args) {/** * 두 스레드 T1 및 T2를 생성하고 시작합니다. 두 스레드는 두 객체 O1과 O2*/ Object o1 = new Object ()를 공유해야합니다. Object o2 = new Object (); 스레드 T1 = 새로운 스레드 (New T1 (O1, O2)); 스레드 T2 = 새 스레드 (New T2 (O1, O2)); t1.start (); t2.start (); }} // 두 개의 스레드 클래스 생성 T1은 런 가능 {Object O1; 물체 O2; public t1 (Object O1, Object O2) {this.O1 = O1; this.o2 = o2; } public void run () {// O1 및 O2 동기화 된 (O1) {try {Thread.Sleep (1000); } catch (InterruptedException e) {// todo 자동 생성 캐치 블록 e.printstacktrace (); } synchronized (o2) {System.out.println ( "O2"); }}}}}}}} class t2는 runnable {object o1; 물체 O2; public t2 (Object O1, Object O2) {this.O1 = O1; this.o2 = o2; } public void run () {synchronized (o2) {try {thread.sleep (1000); } catch (InterruptedException e) {// todo 자동 생성 캐치 블록 e.printstacktrace (); } synchronized (o1) {System.out.println ( "O1"); }}}} 참고 : 동시성은 O1과 O2를 공유 할 때만 발생합니다. 생성자를 통해 두 객체를 공유 할 수 있습니다.
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.