[OS]Deadlock(발생조건, 처리방법)

zzarbttoo·2021년 8월 7일
0

OS(운영체제)

목록 보기
9/12
post-thumbnail

이 글은 KOCW에 공개되어있는 '반효경 교수님'의 운영체제 강의 및 강의 교재 Operation System Concepts(a.k.a 공룡책🦕)의 내용을 기반으로 작성했습니다.

이번 챕터에서는 Deadlock에 관해 정리해보겠습니다
오류가 있다면 댓글로 정정 부탁드립니다


Deadlock

교착상태

  • 일련의 프로세스들이 서로가 가진 자원을 기다리며 block 된 상태
  • 그래서 아무것도 이루어지지 않고, 오버헤드가 발생하게 된다

다음과 같은 상황에서 발생할 수 있다

1) 하드웨어 자원을 기다리며 데드락에 걸린 상황

  • 하나의 tape driver를 읽고 다른 tape drive에 복사하고 싶은 상황
  • 시스템에 두개의 tape drive 가 있다
  • 프로세스 P1, P2가 각각 하나의 tape drive를 보유한 채 다른 하나를 기다리고 있다

2) 소프트웨어 자원을 기다리며 데드락이 걸리는 경우도 있다

  • 세마포어, 공유 데이터와 같은 자원을 기다리며 데드락이 걸릴 수도 있다

Deadlock 발생의 4가지 조건

  1. Mutual Exclusion(상호 배타적)
  • 하나의 프로세스가 자원을 독점적으로 사용한다(여러 개가 동시 사용 불가)
  1. No preemption
  • 프로세스가 자원을 가지고 있을 때, 자원을 스스로 내어놓을 뿐 강제로 빼앗기지 않음
  1. Hold and wait
  • 자원을 가진 프로세스가 다른 자원을 기다릴 때 보유 자원을 놓지 않고 계속 가지고 있음
  1. Circular wait
  • 자원을 기다리는 프로세스간에 사이클이 형성되어야 함
  • 프로세스 P0, P1, ... , Pn이 있을 때 Pn-1은 Pn의 자원을 기다리고 Pn은 P0의 자원을 기다려야 한다

| 자원 할당 그래프 (Resource- Allocation Graph)

  • 원 : 프로세스, 사각형 : 자원
  • 자원 -> 프로세스 : 자원이 프로세스에 속해있다
  • 프로세스 -> 자원 : 프로세스가 자원을 요청했으나 아직 획득하지 못했다
  • 자원 할당 그래프에서 cycle이 발생하지 않으면 deadlock이 아니다
  • cycle이 발생하고 자원이 하나씩 밖에 없다면 deadlock이인 것이다
  • cycle이 발생하고 자원이 여러개 있는 상황이라면 deadlock일 수도 있고 아닐 수도 있다

Deadlock의 처리 방법


| Deadlock Prevention(데드락 예방)

  • 자원 할당 시 Deadlock의 4가지 필요 조건 중 어느 하나가 만족되지 않도록 하는 것
  • Utilization 저하, throughput 감소, starvation 문제 등 자원의 비효율성이 생긴다
    1) Mutual Exclusion
  • 이미 Mutual Exclusion은 막을 수 있는 조건이 아님
    2) Hold and Wait
  • 이미 가진 자원을 보유하며 다른 자원을 기다리기 때문에 생김
  • 방법 1 : 프로세스를 시작할 때 모든 필요한 자원을 할당 받게 하는 방법 -> 하지만 자원에 대한 비효율성이 생긴다
  • 방법 2 : 필요할 때 보유 자원을 모두 놓고 다시 요청

3) No Preemption

  • 자원을 빼앗아올 수 없기 때문에 생김

  • 모든 필요한 자원을 얻을 수 있을 때 그 프로세스는 다시 시작된다

  • State를 쉽게 save하고 restore할 수 있는 자원에서 주로 사용(CPU, memory) -> 그래야 자원을 빼앗을 수 있다

  • CPU는 항상 preemption을 할 수 있다(이런 자원은 데드락이 잘 생기지 않는다)

4) Circular Wait

  • 필요한 자원들이 꼬리에 꼬리를 물면서 cycle이 형성된 경우를 말한다
  • 자원에 순서를 매기고, 낮은 번호를 획득한 경우에만 높은 번호를 획득할 수 있도록 한다

| Deadlock Avoidance(데드락 예방)

  • 자원을 할당 했을 때 데드락이 발생할 가능성이 있다면 자원을 배분해주지 않는 것
  • 가장 단순하고 일반적인 모델은 프로세스들이 필요로 하는 각 자원별 최대 사용량을 미리 선언하도록 하는 방법

1) safe state

  • 시스템 내의 프로세스들에 대한 safe sequence 가 존재하는 상태

2) safe sequence

  • 프로세스의 sequence(P1, P2, ....Pn) 가 safe 하려면 Pi의 자원 요청이 "가용자원 + 모든 Pj(j < i)의 보유자원" 에 의해 충족되어야 함
  • Pi의 자원요청이 충족될 수 없으면 Pi 모든 Pj(i 이전의 프로세스)가 종료될 때까지 대기
  • Pi-1이 종료 -> Pi의 자원 요청 수행

일단 safe state에 있다면 dead lock이 되지 않지만, unsafe state에 있이면 deadlock의 가능성이 있다
그리고 deadlock avoidance는 unsafe state에 들어가는 것을 방지한다

| Resource Allocaltion Graph algorithm

instance 가 하나라면 자원 할당 그래프를 이용해 avoidance를 한다

  • 점선(claim edge) : 프로세스 P가 자원(R)에 미래에 요청할 수 있음을 나타낸다
  • 실선(request edge) : 프로세스가 해당 자원을 요청할 시 실선으로 바뀐다
  • resource가 release 되면 다시 점선(claim edge)로 바뀐다
  • cycle이 생기지 않는 경우에만 요청 자원을 할당한다(실선으로 변함)
  • cycle 생성 여부 조사 시 프로세스의 수가 n일 때 O(n^2)의 시간이 걸린다

| Banker's Algorithm

instance가 여러개라면 Banker's Algorithm 을 이용해 avoidance를 한다
자원 요청 시 safe 상태를 유지할 경우에만 할당하도록 한다

가정

  • 모든 프로세스는 자원의 최대 사용량을 미리 명시한다
  • 프로세스가 요청 자원을 모두 할당받은 경우 유한 시간 안에 이들 자원을 다시 반납한다

방법

  • 총 요청 자원의 수가 가용 자원의 수보다 적은 프로세스를 선택(그런 프로세스가 없으면 unsafe) 해서 자원을 할당
  • 할당받은 프로세스가 종료되면 모든 자원을 반납하고, 모든 프로세스가 종료될 때까지 이러한 과정을 반복한다
  • 뱅커스 알고리즘은 보수적이기 때문에 최대 요청을 할 것을 가정하고 자원을 분배하지만, 최대로 사용한다는 것이 언제 저 자원을 사용하는지를 알려주는 것은 아니다

예시

  • Need : 추가로 요청할 수 있는 양
  • Need와 Available(가용 자원)을 비교하여 만족이 가능하면 그냥 준다
  • 위 예시에서는 sequence P1->P3->P4->P2->P0 가 존재하므로 시스템은 safe state

| Deadlock Detection and recovery(데드락 탐지)

  • Deadlock 발생은 허용하되 그에 대한 detection 루틴을 두어 deadlock 발견시 recover

| Detaction

Wait-for graph 알고리즘

Resource type 당 single instance 인 경우 사용

  • 자원 할당 그래프의 변형으로, 프로세스만으로 node를 구성한다
  • Pi가 가지고 있는 자원을 Pk가 기다리는 경우 Pk -> Pi
  • wait-for graph에 사이클이 존재하는지 주기적으로 조사
  • 그래프와 표 방식으로 표현할 수 있으며, 표 형식이 더 정확하다

예시
1) 표

  • Request : 현재 실제로 요청한 자원량
  • sequence P0 -> P2 -> P3 -> P1 ->P4 가 존재한다

2) 그래프(wait-for graph)

  • 자원의 최대 사용량을 미리 알릴 필요가 없기 때문에 그래프에 점선이 없음
  • process가 n개일 때 O(n^2)의 오버헤드가 든다
  • process가 n개 있을 때 화살표를 따라가게 되고, n개당 최대 n-1의 화살표를 가진다
  • n(n-1)

| Recover

1) Process Terminate
데드락과 연관된 프로세스를 죽이는 방법

  • 데드락에 연루된 프로세스를 한번에 죽이는 것
  • 데드락에 연루된 프로세스를 하나씩 죽이는 것(데드락이 없어질 때까지)

2) Resource Preemption
데드락 이후 자원을 들고오는 방법

  • 비용을 최소화 하는 victim을 선정
  • safe state로 rollback해서 process를 재시작하게 된다
  • 데드락을 없앴는데 같은 victim을 계속 선정하면 같은 패턴으로 데드락이 생길 수 있다
  • 비용만 최소화하면 starvation이 발생할 수 있기 때문에 cost factor에 rollback 횟수도 같이 고려하게 된다

| Deadlock Ignorance(데드락 무시)

  • Deadlock 을 시스템이 책임지지 않음
  • 데드락은 빈번히 발생하지 않기 때문에 미연에 방지하기 위해 오버헤드를 많이 발생시키는 것은 매우 불합리
  • UNIX를 포함한 대부분의 OS가 채택
  • 운영체제가 관여를 안하면 사람이 프로세스를 죽이는 방법을 선택

profile
나는야 누워있는 개발머신

0개의 댓글