운영체제 - deadlock(교착상태)

데드락 : 프로세스들 중 한 프로세스(또는 쓰레드)가 다른 프로세스에 의해 waiting이 끝나기를 기다리는 상태

즉, 본인이 마음대로 상태를 바꾸지 못하는 상태

언제 발생하는가?

가장 쉬운 예시
  • 뮤텍스 두개가 존재한다고 가정(first_mutex, second_mutex)
  • 첫번째 쓰레드가 뮤텍스 획득 시도 (first_mutext -> second_mutex 순)
  • 두번째 쓰레드가 뮤텍스 획득 시도 (second_mutex -> first_mutext 순)
  • 첫번째 쓰레드가 second_mutex를 획득하고자 했는데 두번째 쓰레드에서 second_mutex를 점유하고 있다면 데드락 발생
데드락이 발생하는 조건 (한가지라도 만족하지 않으면 발생하지 않음)
  1. 상호배제(Mutual Exclusion)
    • 적어도 한개의 리소스가 공유불가능 할 때 발생
  2. 점유대기(Hold and Wait)
    • 어떤 쓰레드가 적어도 한가지 리소스를 가지고(hold) 대기(wait)하는 상태
  3. 비선점(No preemption)
    • 자원을 미리 선점 할 수 없는 상태
  4. 원형대기(Circular Wait)
    • 위의 예시처럼 서로 필요한 자원을 가지고 대기하는 상태

데드락 방지(prevention)

위에서 말했듯이 데드락은 위의 4가지 조건이 모두 필요하다

==>즉, 한가지 조건만 만족하지 못해도 발생하지 않음

  1. 상호배제(Mutual Exclusion) 방지
    • 모든 리소스가 sharable한 경우 ==> 그러나 이런 경우는 거의 없다고 봐야함
    • 상호배제 조건은 해결하기 힘듦
  1. 점유대기(Hold and Wait) 방지
    • 내가 가진 리소스를 다 내려놓고 다 획득할 경우에만 쓰레드 작동하게끔
    • 그러나 이 방법은 실용적이지 못하다 -> 이미 리소스 다 잡아놨는데 새로운 걸 오픈할때마다 다시 잡아놓은 걸 내려놓고 오픈시켜야함
  1. 비선점(No preemption) 방지
    • 프로토콜을 이용하여 선점가능하게 만들기
    • 만약 다른 쓰레드가 리소스를 점유하고 있다면 뺏어오는 방법
    • 강제로 뺏어온다면 그 쓰레드에서 문제 발생 할 수 있으니 실용적이지 못한 방법
  1. 원형대기(Circular Wait) 방지
    • 그나마 제일 실용적인 방지법
    • 리소스에 순서를 부여한다.
    • 리소스를 순서대로 획득하다가 막히면 다른 리소스를 다 내려놓는 방법
    • 원형대기를 방지 할 수 있지만 기아상태(Starvation) 발생 할 수 있음

'CS > 운영체제' 카테고리의 다른 글

Process & Thread  (0) 2021.10.19
컴퓨터 시스템의 구조  (0) 2021.10.14
운영체제 개요  (0) 2021.10.13
[운영체제] 뮤텍스, 세마포어  (0) 2021.05.12
[운영체제] Producer - Consumer (생성자 - 소비자) 문제 in jAVA  (0) 2021.04.27

+ Recent posts