3.8 교착상태 처리
(1) 교착상태 방지 Deadlock Prevention
- 교착상태 4가지 필요조건 중 한가지 이상 결여되게 함 → 보유및대기/ 환형대기가 현실적인 대안임
- 상호배타(Mutaul exclusion)
- 자원을 공유 가능하게 사용한 → 원천적으로 불가능
- 보유 및 대기
- 자원을 가지고 있으면서 다른 자원 기다리지 않게함
- ex) 철학자가 두개 젓가락을 잡게하는 것 만약 둘중하나라도 잡지 못하면 아예 잡지 않도록함
- 단점: 자원활용률 저하, 기하 → 진행을 못하는 경우가 있음
- 비선점(No preemption)
- 자원을 선점 가능하게 → 원천적으로 불가능
- ex) 프린터 : 한 프린터가 사용하다가 다른 프린터 요청이 왔다고 넘겨주는것 자체가 이상함
- 환형대기(Circular wait)
- 자원에 번호 부여 ex) 오름차순으로 자원 요청
- 단점: 자원활용률 저하
- 상호배타(Mutaul exclusion)
(2) 교착상태 회피 Deadlock Avoidance
- 자원을 잘못 나눠줘서 발생되는 문제
- 총 12개가 있음
- 12 → (P0,P1,P2: - 9) → 3 → (P1: - 2) → 1 → (P1: +4) → 5 → (P1: -5) → 0 → (P1: +5) → 10 → (P3: -3) → 7
- 모든 작업을 다 실행가능
- 총 12개가 있음
- 12 → (P0,P1,P2: -10) → 2 → (P1: -2) → 0 → (P1: +4) → 4 → ….
- P2, P0 모두 실행 불가능
-
대출전문 은행과 유사 : Banker’s algorithm
은행가 알고리즘은 리소스 할당 및 교착 상태 방지 알고리즘으로, 사전 결정된 최대 리소스 양에 대한 할당을 시뮬레이션하여 안전성을 테스트합니다
(3) 교착상태 검출 및 복구 DeadLoack Dection and Recovery
- 교착상태가 일어나는 것을 허용
- 주기적 검사 → CPU 에 부하가 있음
- 교착상태 발생시 복구
- 검출: 검사에 따라 추가부담이 있음 → CPU 부하, 계산, 메모리
- 복구: 프로세스 일부 강제종료, 자원선점하여 일부 프로세스에게 할당 → 주기적으로 현재 상태를 저장해야함, 복구가 불가능한 경우도 있음
(4) 교착상태 무시
- 교착상태는 실제로 잘 일어나지 않기 때문에 무시함
- 교착상태 발생시 재시동
3.9 모니터
- 세마포 이후 프로세스 동기화 도구
- 세마포 보다 고수준 개념
구조
- 쓰레드 한개만 공유자원 접근 함수에 접근 가능
- 진입 쓰레드가 조건동기로 블록되면 새 쓰레드 진입가능 (wait을 호출)
- 새 쓰레드는 조건 동기로 블록된 쓰레드를 깨울 수 있음 (notify를 호출)
- 깨워진 쓰레드는 현재 쓰레드가 나가면 진입가능
- 배타동기: synchronized 키워드 사용/ 하나의 쓰레드만 공유자원에 접근할수 있게 작용하는 공간
- 조건동기: wait, notify, notifyall(블록된 스레드 해제)/ 진입 쓰레드가 블록되면서 새 쓰레드가 진입가능하게 하는 공간
상호배타적 사용
lass BankAccount {
int balance; // 공통변수
synchronized void deposit(int amt) {
int temp = balance + amt;
System.out.print("+");
balance = temp;
}
synchronized void withdraw(int amt) {
int temp = balance - amt;
System.out.print("-");
balance = temp;
}
int getBalance() {
return balance;
}
}
순서적 사용
P1 기다림/S1;/ notify()/
P2 wiat()/S2;/기다림/
- P2 실행코드 전에 wait() 함수를 기술하면 P2 는 임계구역에서 실행코드 실행전에 조건동기 큐에 블록됨
- P1 에 실행권한이 넘어가게 되고 임계구역에 들어가서 코드 실행
- P1 코드 실행이 끝나고 notify() 함수를 실행시켜 P2 깨어나게 하여서 임계구역에 접근하더록함
https://about-myeong.tistory.com/34