✏️ 5주차 진도: Chapter 12 ~ 13
- 기본 숙제(필수): p. 363의 확인 문제 1번 풀고 인증하기
- 추가 숙제(선택): Ch.12(12-1) 임계 구역, 상호 배제 개념을 정리하기
동시다발적으로 실행되는 프로세스를 아무 기준 없이 마음대로 실행되도록 하면, 프로세스들이 접근하는 자원과 프로그램의 결과에 문제가 발생할 수 있다. 이러한 위험을 막기 위해서 프로세스들 사이의 수행 시기를 맞추는 동기화가 필요하다.
실행 순서 제어를 위한 동기화 : 프로세스를 올바른 순서대로 실행하기
상호 배제를 위한 동기화 : 동시에 접근해서는 안되는 자원에 한 번의 하나의 프로세스만 접근하도록 하기
여러 프로세스가 함께 사용하는 공동의 자원. 전역 변수, 파일, 입출력장치, 보조기억장치 등
동시에 실행하면 문제가 발생하는 자원에 접근하는 코드 영역
두 개 이상의 프로세스가 임계 구역에 진입하려고 하면 한 프로세스를 제외한 나머지 프로세스들은 대기해야 한다.
두 개 이상의 프로세스가 동시에 임계 구역의 코드를 실행하여 발생하는 문제. 해당 문제가 발생하면 데이터의 일관성이 깨진다.
상호 배제를 위한 동기화 도구
임계 구역에 진입하는 프로세스는 Mutex lock을 걸어 놓음으로써 현재 자신이 임계 구역에 있음을 알린다.
프로세스가 임계 구역에 진입하기 전에 호출하는 함수.
임계 구역에서의 작업이 끝나고 호출하는 함수
잠긴 임계 구역을 열어준다.
acquire();
// 임계 구역
release();
공유 자원이 여러 개 있는 상황에서도 적용이 가능한 동기화 도구
프로세스는 임계 구역 앞에서 멈춤 신호를 받으면 잠시 기다리고, 가도 좋다는 신호를 받으면 임계 구역에 들어가게 된다.
// 전역 변수 S : 사용 가능한 공유 자원의 개수(임계 구역에 들어갈 수 있는 프로세스의 개수)
// wait 함수 : 기다려야 하는지 알려주는 함수
// signal 함수 : 기다리는 프로세스에게 이제 임계 구역에 들어가도 좋다고 신호를 주는 함수
wait () {
while ( S <= 0) // 임계 구역에 들어갈 수 있는 프로세스가 없다면
; // 사용할 수 있는 자원이 있는지 계속 확인
S --; // 들어갈 수 있는 프로세스가 있다면 진입시키고 S를 1 감소시킨다
}
signal () {
S++; // 임계 구역에서의 작업을 마친 뒤 S 1 증가
}
wait()
// 임계 구역
signal()
S = 0
p1 p2
// 임계 구역 wait()
signal() // 임계 구역
공유 자원과 공유 자원에 접근하기 위한 인터페이스(통로)를 묶어서 관리한다.
Java에서 메서드에 synchronized 키워드를 붙임으로써 모니터를 구현할 수 있다!
일어나지 않을 사건을 계속 기다리며 진행이 멈춰 버리는 현상
교착 상태가 발생했을 때의 사오항을 정확히 표현할 수 있는 그래프
아래 조건의 모두 만족될 때 교착 상태가 발생할 가능성이 생긴다.
상호 배제, 점유와 대기, 비선점, 원형 대기 중 한 조건만이라도 일치하지 않도록 자원을 할당하면 교착 상태를 예방할 수 있다.
교착 상태가 발생하지 않을 정도로만(안전 상태를 유지하도록) 자원을 할당하는 방식
교착 상태 발생을 인정하고 사후에 조치하는 방식
뮤텍스 락과 세마포에 대한 설명으로 옳지 않은 것을 고르세요.
1. 뮤텍스 락은 임계 구역을 잠근 뒤 임계 구역에 진입함으로써 상호 배제를 위한 동기화를 이룹니다.
2. 세마포는 공유 자원이 여러 개 있는 상황에서도 이용할 수 있습니다.
3. 세마포를 이용해 프로세스 실행 순서 제어를 위한 동기화도 이룰 수 있습니다.
4. 세마포를 이용하면 반드시 바쁜 대기를 해야 합니다.답: 4번 (대기 큐, 준비 큐를 사용하면 바쁜 대기를 하지 않아도 된다.)
위쪽에 정리