cs

OS - 교착상태

joepasss 2022. 5. 16. 16:11

교착상태


둘 이상의 프로세스들이 각각 자원을 점유한 상태에서 또 다른 프로세스가 현재 점유하고 있는 자원을 요구하며 상대 프로세스가 양보하기를 무한정 기다리는 현상

1. 필수조건


1.1. 상호배제 조건

  • 하나의 프로세스가 사용 중이면 다른 프로세스는 반드시 기다려야 하는 경우
  • 한 번에 한 프로세스만이 공유자원을 사용할 수 있어야 한다

1.2. 점유와 대기 조건

  • 임의의 프로세스가 최소한 하나 이상의 자원을 할당받은 상태에서 다른 프로세스의 자원이 해제되기를 기다를 프로세스가 존재하는 경우

1.3. 비선점, 비중단 조건

  • 프로세스에게 할당된 자원을 중간에 강제로 빼앗지 못함을 의미하는 것
  • 자원이 임의의 프로세스에게 할당이 되면 프로세스가 작업을 끝내고 반납하기 전 까지는 돌이킬 수 없는 것

1.4. 환형대기 조건

  • 프로세스 간에 환형 사슬이 존재하여 이를 구성하는 각 프로세스는 사슬 내에서 자신의 다음에 있는 프로세스가 요구하는 하나 이상의 자원을 가지고 있는 상태에서 자신의 이전 프로세스가 점유 중인 자원을 요청하고 있는 상황
  • 공유자원을 사용하기 위해 대기하는 프로세스들이 원형으로 구성되어 있다 가정

2. 자원할당 그래프


  • 방향 그래프
  • 각 프로세스별 할당자원 및 대기자원의 상태를 나타낼 수 있다
  • 자원할당 그래프 G는 정점의 집합 V와 간선의 집합 E를 이용하여 표시한다
    • G = (V, E)

2.1. 요청 연결선과 할당 연결선

  • 프로세스 P는 원으로 자원 Rj는 사각형으로 표시
  • 자원할당 그래프에 cycle이 존재할 때 원형 안의 프로세스와 자원이 교착상태에 있음을 의미한다

자원할당 그래프, 파란 선이 요청 빨간 선이 할당

자원할당 그래프를 구성하는 집합 P, R, E

P = {P1, P2, P3}
R = {R1, R2, R3}
E = {P1 -> R1, P2 -> R3, R1-> P2, R2 -> P1, R2 -> P2, R2 -> P3, R3 -> P3}

3. 교착상태 방지


교착상태가 발생하지 않도록 사전에 시스템을 제어하는 방법
교착상태 발생의 4가지 조건 중 상호배제를 제외한 3가지 중 어느 하나를 제거(부정)함으로써 수행된다

3.1. 상호배제 조건의 방지

  • 여러 프로세스가 공유자원을 이용하는 것
  • 공유할 수 있는 자원은 상호배제적인 엑세스를 요구하지 않기 때문에 교착상태가 일어나지 않는다

3.2. 대기 조건의 방지

  1. 프로세스가 자원을 요청할 때 자신이 점유하고 있는 자원이 없도록 하는 것
  2. 프로세스가 자신의 작업에 필요한 모든 자원을 확보할 수 있을 때에만 시작하는 방법

3.3. 비중단 조건의 방지

  • 비선점 조건을 선점형으로 변경해서 사용하는 것
  • 임의의 자원을 점유하는 프로세스의 자원에 대한 추가요구가 더 이상 받아들여지지 않으면 운영체제가 프로세스의 작업이 종료되기 전에 점유하고 있던 자원을 강제로 시스템에 반환시키는 것
  • 원래 점유 중인 자원을 일단 반납하고 필요한 경우에 다시 요구하도록 하는 기법

3.4. 환형대기 조건의 방지

  • 시스템 내에 순환이 없도록 한쪽 방향으로만 자원을 요구하도록 하는 것
  • 시스템의 자원을 할당하려고 할 때 어떤 순서를 지키며 할당하는 것
  1. 자원을 선형 순서로 분류한 후 고유번호를 부여하여 모든 프로세스에 각 자원의 유형별로 할당순서를 부여
  2. 자신이 점유한 자원보다 높은 순번을 가진 자원을 할당받으려 할 때, 요청하는 자원보다 낮은 순번을 갖는 자원을 모두 반환하고 요청하는 것

4. 교착상태 회피


교착상태의 발생 가능성을 인정하고 교착상태가 발생하려 할 때 사전정보를 가지고 교착상태가 발생하지 않도록 처리하는 방법
은행원 알고리즘이 주로 사용된다

4.1. 단일 유형의 여러 자원이 존재하는 경우

  • 은행원 알고리즘의 데이터 구조로 각 프로세스에 자원을 할당

n은 시스템의 프로세스 수, m을 자원형태의 수라 가정할 때 다음과 같은 자료구조가 필요하다

  • available(가용자원) : 각 형태별로 사용 가능한 자원의 수를 표시하는 길이가 m인 벡터
  • max(최대요구) : n * m 행렬로 각 프로세스의 자원에 대한 최대 요구량
  • allocation(할당자원): n * m 행렬로 각 프로세스에 현재 할당된 자원의 수
  • need(추가요구) : n * m 행렬로 각 프로세스가 앞으로 더 요구할 수 있는 자원의 수

4.1.1. 안전상태와 불안전상태 교착상태

시스템의 상태

안전상태의 예

프로세스 allocation (할당자원) max(최대요구) need(추가요구) available(가용자원)
P1 3 6 3 2
P2 3 7 4  
P3 2 4 2  
P4 2 8 6  

할당 순서

불안전상태의 예

프로세스 allocation max need available
P1 4 6 2 1
P2 3 7 4  
P3 2 4 2  
P4 2 8 6  
  • Request (need) <= Available 인 상황
    • 할당을 시작할 수 없기 때문에 불안정 상태이다

4.1.2은행원 알고리즘 (Banker's algorithm)

은행원 알고리즘

프로세스 p1, p2, p3, p4 가 자원 ABC 에 대해 각각을 할당받은 후 추가필요량을 요구하는 경우

  allocate     need     available    
  A B C A B C A B C
P1 1 3 1 1 0 1 1 4 2
P2 1 0 0 1 7 5      
P3 1 3 5 2 3 3      
p4 0 6 3 0 6 5      

할당 순서

가용 자원 A 1 2 3 4 4
B 4 7 10 10 16  
C 2 3 8 8 11  
프로세스   P1 P3 P2 P4  
할당 자원 A 1 1 1 0  
B 3 3 0 6    
C 1 5 0 3    

단점

할당할 수 있는 자원이 일정량 존재해야 한다
일정한 수의 사용자 프로세스가 있어야 사용 가능하다
모든 프로세스는 유한한 시간 내에 할당된 자원을 반납해야 한다
사용자가 미리 최대 자원필요량을 알고 있어야 한다

4.2. 각 유형의 자원이 한 개 뿐인 경우

  • 기존의 요구간선과 할당간선에 선언간선을 추가
  • 선언간선은 앞으로 프로세서가 자원을 요구하게 될 것임을 의미
  • 사이클의 탐지는 n^2의 연산으로 가능한 데, 여기서 n은 프로세스의 수 이다

5. 교착상태 탐지


시스템에 교착상태가 발생했는지를 점검하여 교착상태에 있는 프로세스와 자원을 발견하는 것

5.1. 교착상태 탐지 알고리즘

남아 있는 프로세스들에 대한 할당 가능 순서를 모두 찾는 방법

  1. Work 와 Finish는 각각 길이가 m과 n인 벡터
    • Work = Available로 초기화
    • Work가 가용자원의 수를 가지도록 한 후 i = 1, 2, ..., n 일때 Allocationi != 0 이면 Finish[i] = false
  2. Finish[i] = false, Requesti <= Work 조건을 만족하는 색인 i를 찾는다
    • 만족하는 i가 존재하는 경우 다음 단계로
    • i가 없는 경우 4단계로 이동
  3. 다음과 일치하는지 판단 후 일치하면 2단계로 이동
    • Work = Work + Allocationi
    • Finish[i] = true
  4. Finish[i] = false 라면, 1 <= i <= n 인 범위에서 프로세스 Pi는 교착상태이다

 

교착상태 방지 알고리즘

 

6. 교착상태 복구


교착상태를 일으킨 프로세스를 종료하거나 교착상태의 프로세스에 할당된 자원을 선점하여 프로세스나 자원을 회복하는 것

6.1. 프로세스 종료

6.1.1 교착상태 프로세스 모두 중지

  • 교착상태에 있는 모든 프로세스들을 종료하는 방법
  • 교착상태 사이클을 제거할 수는 있지만 많은 비용이 소모된다

6.1.2 한 프로세스씩 중지

  • 교착상태 사이클이 제거될 때 까지 프로세스를 하나씩 종료해가는 것
  • 상당한 오버헤드를 요구한다
  • 한 프로세스가 종료될 때 마다 교착상태 탐지 알고리즘을 호출하여 프로세스가 교착상태인지 여부를 확인한다
  • 종료할 프로세스를 선택하기 위한 고려요소
    1. 프로세스의 우선순위
    2. 프로세스가 수행된 시간과 앞으로 종료하는데 필요한 시간
    3. 프로세스가 사용한 자원의 수와 형태
    4. 프로세스 종료를 위해 필요한 자원의 수 (작업 완료까지 필요한 자원의 수)
    5. 프로세스를 종료하는데 필요한 프로세스의 수
    6. 프로세스의 형태 (대화식인지 일괄처리식인지)

6.2. 자원선점

6.2.1 희생자 선택

  • 선점자원을 선택하는 것
  • 프로세스가 종료될 때 소요되는 비용을 최소화하기 위해 적절한 선점의 순서를 결정해야 한다
  • 비용은 교착상태의 프로세스가 점유한 자원의 수, 실행되는데 걸린 시간 등을 이용해 계산한다

6.2.2 복귀

  • 프로세스로부터 자원을 선점한다면 필요한 자원을 잃은 프로세스는 정상적인 실행이 안 된다
  • 그 프로세스를 어떤 상태로 놓을 것인지를 결정
    • 정상적인 수행을 계속할 수 없을 때 = 프로세스를 안전한 상태로 되돌려 놓은 후 그 상태로부터 재시작