- Deadlock
- 몇몇 스레드는 자원 경쟁을 함
- 대기중인 스레드가 다른 대기중인 스레드가 점유한 자원을 요청하여 계속 waiting state에 머무르는 상황을 deadlock이라 함
- Livelock
- Deadlock과의 유사점
- 둘 아시아의 스레드가 진행되지 않음
- Deadlock과의 차이점
- fail되는 action을 지속적으로 시도 -> CS에 진입할 때까지 계속 반복
- block X, progress X
- 예시) 두 사람이 복도를 지나가는 상황 발생 -> 두 사람이 멈춰있지 않고(block X), 좌우로 피해가려 하지만 진행은 안됨(progress X)
- Deadlock과의 유사점
- Livelock 회피방법
- 각 스레드가 random 시간에 retry 하도록 함
- 이더넷 네트워크에서 네트워크 충돌 시 취하는 해결법
- 충돌 후 바로 재전송하지 않고, 재전송 전에 random 기간동안 물러남
- deadlock보다 덜 일반적으로 발생하고 특정 스케줄링 상황에서만 발생 가능
- Deadlock 특징
- Necessary Conditions(교착 상태 발생의 필요 조건)
- 아래 4가지 조건을 동시에 만족하면 deadlock 임 (아래 조건들은 독립적인 조건은 아님)
- Mutual exclusion (공유자원은 deadlock 아님, 해당 자원을 어떤 스레드가 요청했을 때 해당 자원이 release될 때까지 요청 스레드가 delay되어야 함)
- Hold and wait (스레드가 어떤 자원을 hold하면서 또 다른 자원을 요청하면서 wait하는 상황)
- No preemption (선점 X)
- Circular wait (wait이 circle을 이룸)
- Resource-Allocation Graph (교착 상태의 기술 방법)
- deadlock은 방향 그래프로 더 정확히 기술 가능함
- Necessary Conditions(교착 상태 발생의 필요 조건)
- deadlock 처리 방법
- 무시하고 deadlock이 일어나지 않은 척 하기 (성능이 저하되면 재부팅되거나 deadlock이 발생한 스레드들만 중지) -> 대부분의 OS(윈도우, 리눅스 등)에서 사용중인 방법
- 실행되지 않는 스레드를 멈추고 다시 시작
- deadlock 예방/회피 프로토콜 사용 -> deadlock 상태가 되지 않도록 보장
- 예방: 4가지 필요조건 중 최소 하나가 성립하지 않도록 보장 (단점: 장치 이용률 저하, 시스템 처리율 감소)
- Mutual exclusion: 자원이 share할 수 있도록 하면 됨 -> 어떤 자원은 근본적으로 공유 불가 -> 해결 x
- Hold and wait: hold와 wait을 동시에 하지 않도록 함
- 각 스레드가 실행 전에 모든 자원을 요청하고 할당하도록 함 -> 자원 요청의 동적인 특성으로 비현실적
- 자원을 갖고 있지않을 때만 요청하도록 함 -> 스레드는 자원을 추가로 요청하기 전에 현재 할당된 자원을 해제해야 함
- 단점: 자원 이용률 저하, 기아(여러 자원을 요청한 경우 필요 자원 중 최소 하나가 항상 다른 스레드에 할당 -> 무한 대기) 발생 가능
- No preemtion: 자원 선점을 허용
- 즉시 할당 불가능한 추가 자원을 요청시 hold한 모든 자원을 뺏김
- 상태가 쉽게 save되고 나중에 restore되는 자원들에 적용됨
- deadlock이 흔히 일어나느 자원에는 적용이 쉽지 않음
- Circular wait: chain을 끊음
- 모든 자원 유형에 전체 순서를 매기고, 각 스레드가 열거된 오름차순으로 자원을 요청함
- 자원을 비교하여 순서상 빠른 것을 결정하고 순서대로 요청하도록 함
- 회피: 현재 요청에 대해 현재 가용자원, 현재 할당된 자원, 향후 요청/해제 등을 고려하여 요청 처리 결정
- 시스템이 어떤 순서로든 각 스레드에 자원을 할당하고 deadlock을 피할 수 있다면 safe
- safe sequence가 있으면 시스템은 safe state
- 스레드 Ti가 현재 가용자원 외에 Tj (j<i) 점유한 자원에 의해 만족된다면(Tj가 해제되어 Ti가 사용가능하다면) safe
- safe sequence가 없다면 시스템은 unsafe state
- unsafe state에서 deadlock state로 갈 수 있음 =>
- 각 자원 유형의 인스턴스가 하나인 경우
- 기존 자원-할당 그래프의 변형
- 예약 간선(claim edge) 추가 => 점선으로 표현
- 자원 요청은 claim edge가 assignment edge로 변환 시 cycle을 형성하지 않을 때만 허용됨
- cycle이 발견된다면 unsafe state이므로 스레드는 요청이 충족될 때까지 wait해야 함
- 각 자원 유형의 인스턴스가 여러 개인 경우
- Banker's Algorithm (생략,,,, 나중에)
- 예방: 4가지 필요조건 중 최소 하나가 성립하지 않도록 보장 (단점: 장치 이용률 저하, 시스템 처리율 감소)
- 감지 및 처리기법
- deadlock 발생 여부를 결정하기 위해 시스템 상태를 검사하는 알고리즘
- deadlock으로부터 회복하는 알고리즘
- Single instance: 각 자원 유형의 인스턴스가 한 개인 경우
- wait-for graph: 자원-할당 그래프의 변형을 사용
- wait-for 그래프에 cycleㅇ이 있으면, 시스템에 deadlock 존재
- wait-for graph: 자원-할당 그래프의 변형을 사용
- Several instances: 각 자원 유형의 인스턴스가 여러 개인 경우
- Available: m개의 각 data type에 대한 가용 자원의 수
- Allocation: 각 스레드에 현재 할당된 자원의 수
- Request: 각 스레드가 현재 요청한 자원의 수
- 완료되어야하는(=처리해야하는) 스레드들에 대해 모든 가능한 할당 순서를 조사함
- 알고리즘 호출시기
- 할당 요청이 즉시 승인되지 않을 때마다 => deadlock을 야기시킨 특정 스레드 식별 가능 => overhead 문제
- 일정한 시점마다 => overhead는 덜함 => 어느 스레드가 deadlock을 야기시켰는지 판단 불가
- 무시하고 deadlock이 일어나지 않은 척 하기 (성능이 저하되면 재부팅되거나 deadlock이 발생한 스레드들만 중지) -> 대부분의 OS(윈도우, 리눅스 등)에서 사용중인 방법
'cs 공부 > 운영체제' 카테고리의 다른 글
ch06. Process Synchronization (0) | 2023.06.26 |
---|---|
ch05. CPU Scheduling (0) | 2023.06.12 |
ch03. Process, Threads (0) | 2023.06.11 |