교착 상태
교착 상태는 프로그램이 계속 실행하는 데 필요한 리소스에 접근할 수 없는 상태입니다. 활성 상태인 애플리케이션에서 교착 상태가 발생하면 프로그램이 "멈추거나" 응답하지 않을 수 있습니다.
저장되었거나 캐시된 데이터와 같은 리소스는 프로그램 내 특정 프로세스가 접근할 때 잠길 수 있습니다. 데이터를 잠그면 다른 프로세스가 데이터를 너무 일찍 덮어쓰는 것을 방지할 수 있습니다. 프로세스 또는 쿼리가 잠긴 데이터에 접근해야 하지만 데이터를 잠근 프로세스가 잠금을 해제하지 않으면 교착 상태가 발생할 수 있습니다.
예를 들어 다음과 같은 상황에서는 두 프로세스 사이에 교착 상태가 발생합니다.
- 프로세스 1이 프로세스 2에 리소스 B를 요청합니다.
- 프로세스 2가 실행되는 동안 리소스 B가 잠깁니다.
- 프로세스 2가 실행을 완료하려면 프로세스 1의 리소스 A가 필요합니다.
- 프로세스 1이 실행되는 동안 리소스 A가 잠깁니다.
그 결과 프로세스 1과 프로세스 2가 서로 완료되기를 기다리게 됩니다. 어느 프로세스도 다른 프로세스가 완료될 때까지 계속 실행할 수 없으므로 교착 상태가 발생합니다.
교착 상태 방지
개발자는 프로그래밍 논리에서 잠금 조건을 피하여 교착 상태를 방지할 수 있습니다. 예를 들어 두 프로세스가 서로에게 의존하도록 하는 대신, 다른 스레드가 리소스를 필요로 하기 전에 각 스레드가 완료되도록 소스 코드를 작성할 수 있습니다. 필요할 때 데이터에 접근할 수 있도록 하면 프로그래머는 애플리케이션이 멈추거나 충돌하는 것을 방지할 수 있습니다.
NOTE: 둘 이상의 쿼리가 데이터베이스에서 실행될 때도 교착 상태가 발생할 수 있습니다. 트랜잭션 데이터베이스는 활성 레코드를 잠가 다른 쿼리가 해당 레코드에 접근하지 못하게 합니다. 프로세스가 잠긴 레코드에 접근할 수 없으면 데이터베이스 교착 상태가 발생할 수 있습니다.
지식 테스트하기