🥭 교착 상태 (Deadlock)와 기아
- 교착 상태 (deadlock)
- 두 개 이상의 프로세스들이, 오로지 대기중인 프로세스들 중 하나에 의해서만 야기될 수 있는 사건(signal())을 무한정 기다리는 상황
- 두 개의 프로세스 P0과 P1에서 1로 초기화된 세마포 S와 Q를 접근하는 시스템 예
- 기아 (starvation)
- 교착 상태와 연관된 무한 봉쇄(indefinite blocking)
- 프로세스들이 세마포에서 무한정 대기하는 것으로, 프로세스가 중지된 세마포 큐에서 제거되지 않음
🥞 임계 구역 문제 발생
운영체제에서 임계 구역 문제가 언제 발생?
- 커널에서 인터럽트 루틴 처리
- 프로세스가 커널에서 선점 : 시스템 호출 중에 선점
- 다중 처리기 : 공유 메모리에서 커널 데이터
커널에서 인터럽트 루틴 처리
프로세스가 커널에서 선점
다중 처리기
세마포의 문제점
세마포를 이용하여 임계 구역 문제를 해결할 때 프로그래머가 세마포를 잘못 사용하면 다양한 유형의 오류가 너무나도 쉽게 발생
- 상호 배제 요구 조건을 위반하거나, 교착 상태가 발생
- 프로세스에서 wait()나 signal() 또는 둘 다 생략된 경우
🐬 모니터
모니터는 쉽고 효율적인 프로세스 동기화 수단을 제공하는 고급 언어수준의 동기화 구조물 (high-level language synchronization construct)
- 추상화된 데이터 형을 안전하게 공유 : ex) 자바의 객체
- 데이터와 데이터를 조장하는 함수들을 하나의 단위로 묶어서 보호
모니터 구조
모니터 구조물은 모니터 안에 항상 하나의 프로세스만이 활성화되도록 보장 : 프로그래머가 모니터 내부에 상호 배제가 보장되는 연산자들의 집합을 정의
condition 형의 변수
- 모니터 내의 프로세스(연산자)들의 동기화를 위해 condition 변수 선언 : condition x,y;
- condition 형 변수에 호출될 수 있는 연산은 오직 wait()와 signal()
- x.wait() : 연산을 호출한 프로세스는 다른 프로세스가 x.signal()을 호출할 때까지 일시 중단
- x.signal() : 연산은 정확히 하나의 일시 중단 프로세스를 재개. 만약 일시 중단된 프로세스가 없다면, signal() 연산은 아무런 효과가 없음
조건 변수를 갖는 모니터
자바 모니터 - 스레드 동기화
자바의 기본 스레드 동기화 모델은 모니터와 같은 병행성 기법 제공 : 모든 객체들은 하나의 락(lock)과 연관
- 메서드 또는 객체의 블록에 synchronized 선언
- 공유 데이터에 락을 설정
- synchronized 메서드(블록)가 종료하면 락이 해제되어 다른 스레드가 접근 가능
public synchronized void method() {
...
}
synchronized(참조하는 객체 변수) {
...
}
자바 스레드 동기화 모델
하나의 데이터(객체)마다 하나의 모니터를 결합
- 결합된 데이터(객체)가 동시에 두 개 이상의 스레드에 의해 접근할 수 없도록 락(lock) 기능 제공
- synchronized 메서드를 호출한 스레드는 봉쇄되어 객체의 락에 설정된 진입 집합(Entry Set)에 추가
- 락이 가용한 경우 호출 스레드는 객체 락의 소유자가 되어 메서드로 진입
- 스레드가 메서드를 종료하면 락이 해제
- 락이 해제될 때 진입 집합이 비어있지 않으면 JVM은 집합에서 스레드를 임의로 선택하여 락을 부여
자바 조건 변수
- 언어 수준에서 자바는 기명 조건 변수를 지원하지 않음
- 자바의 모니터는 무명 조건 변수 하나에만 연결
- wait()와 notify() 연산이 하나의 조건 변수에만 적용
- 스레드가 wait() 메서드 호출 시 동작
- 스레드가 객체의 락을 해제
- 스레드 상태가 봉쇄(blocking)로 설정
- 스레드가 대기 집합(wait set)에 삽입되어 대기
- 스레드가 notify() 메서드 호출 시 동작
- 대기 집합에서 임의의 스레드 T 선택
- 스레드 T를 진입 집합으로 이동
- T의 상태를 봉쇄→실행가능 으로 변경🦴참고
Operating System Concepts, 10th Ed.