OS ch7

3.8 교착상태 처리

(1) 교착상태 방지 Deadlock Prevention

  • 교착상태 4가지 필요조건 중 한가지 이상 결여되게 함 → 보유및대기/ 환형대기가 현실적인 대안임
    • 상호배타(Mutaul exclusion)
      • 자원을 공유 가능하게 사용한 → 원천적으로 불가능
    • 보유 및 대기
      • 자원을 가지고 있으면서 다른 자원 기다리지 않게함
      • ex) 철학자가 두개 젓가락을 잡게하는 것 만약 둘중하나라도 잡지 못하면 아예 잡지 않도록함
      • 단점: 자원활용률 저하, 기하 → 진행을 못하는 경우가 있음
    • 비선점(No preemption)
      • 자원을 선점 가능하게 → 원천적으로 불가능
      • ex) 프린터 : 한 프린터가 사용하다가 다른 프린터 요청이 왔다고 넘겨주는것 자체가 이상함
    • 환형대기(Circular wait)
      • 자원에 번호 부여 ex) 오름차순으로 자원 요청
      • 단점: 자원활용률 저하

(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 모니터

  • 세마포 이후 프로세스 동기화 도구
  • 세마포 보다 고수준 개념

구조

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/e4ac8b3b-1549-4477-828d-6b8e76f3da2b/Untitled.png

  1. 쓰레드 한개만 공유자원 접근 함수에 접근 가능
  2. 진입 쓰레드가 조건동기로 블록되면 새 쓰레드 진입가능 (wait을 호출)
  3. 새 쓰레드는 조건 동기로 블록된 쓰레드를 깨울 수 있음 (notify를 호출)
  4. 깨워진 쓰레드는 현재 쓰레드가 나가면 진입가능
    • 배타동기: 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;/기다림/

  1. P2 실행코드 전에 wait() 함수를 기술하면 P2 는 임계구역에서 실행코드 실행전에 조건동기 큐에 블록됨
  2. P1 에 실행권한이 넘어가게 되고 임계구역에 들어가서 코드 실행
  3. P1 코드 실행이 끝나고 notify() 함수를 실행시켜 P2 깨어나게 하여서 임계구역에 접근하더록함

https://about-myeong.tistory.com/34

세마포어 vs 뮤텍스

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/3edc9921-bd76-4ad1-9698-6cfaebdbabd3/Untitled.png

https://coding-start.tistory.com/201