1. 프로세스 동기화
1.1. 동기화
- 프로세스들의 실행 순소와 자원의 일관성을 보장하기 위한 필수요소
- 특정 자원에 접근할 때 한개의 프로세스만 접근하게 하거나, 프로세스를 올바른 순서대로 실행하게 하는 것
- 프로세스 동기화 : 프로세스 등 사이의 수행 시기를 맞추는 것
- 스레드도 동기화를 적용해야한다.
1.1.1. 실행 순서 제어 & 상호 배제
- 실행 순서 제어 : 프로세스를 올바른 순서대로 실행
- 상호 배제 : 공유가 불가능한 자원에 하나의 프로세스만을 접근하도록 동시 접근 차단
- 상호 배제가 필요한 예시
- 프로세스A(10만원이 있는 계좌에 2만원을 추가 입금)
- 프로세스B(동일한 계좌에 5만원을 추가 입금)
프로세스A의 작업이 끝나기 전에 프로세스B가 현재 계좌의 잔액을 읽으면 최종적으로 계좌의 현재 잔액은 15만원으로 기록된다.
1.1.2. 생산자와 소비자 문제
- 생산자와 소비자는 동시에 실행되는 스레드가 될 수도 있다.
- 예시
- 생산자(버퍼에 데이터를 입력하고 '총합'에 1을 추가), 소비자(버퍼의 데이터를 빼내고 '총합'에 1을 감소)
- 생산자와 소비자가 지정된 행위를 반복하다보면 '총합'의 동기화가 되지 않아 '총합'이 초기값을 유지하지 않거나 오류가 발생한다.
1.1.3. 공유 자원과 임계 구역
- 1.1.1.과 1.1.2.에서의 '잔액'과 '총합'은 전역 변수가된다. 즉, 전역 변수는 프로세스(또는 스레드)들의 공유 자원이다. 전역 변수 외에도 파일, 입출력장치, 보조기억장치 등이 프로세스와 스레드들이 동시에 접근해야하는 곳은 공유자원이다.
- 임계 구역 : 공유 자원 중에서 동시에 실행하면 문제가 발생하는 자원에 접근하는 코드 영역
- 레이스 컨디션 : 임계 구역에 동시 다발적으로 접근하여 오류가 발생했을 때
- 상호 배제 동기화 : 임계 구역에 한번에 하나씩 프로세스(또는 스레드)가 접근하도록 관리하는 것
- 진행 : 임계 구역에 어떤 프로세스도 진입하지 않았다면 이에 진입하고자 하는 프로세스는 들어갈 수 있어야 한다.
- 유한 대기 : 한 프로세스가 임계 구역에 진입하려 할 때, 그 프로세는 언젠가 임계 구역에 진입할 수 있어야 한다.
1.2. 동기화 기법
1.2.1. 뮤테스 락
- 옷가게 탈의실로 비유
- 한 프로세스가 임계 구역에 진입했으면 다른 프로세스가 임계 구역에 접근하는 걸 막는 방식(상호 배제)
- 구성
- lock : 프로세스들이 공유하는 전역 변수
- acquire 함수 : 임계 구역을 봉인
- release 함수 : 임계 구역 봉인 해제 역할
- 바쁜 대기 : 임계 구역이 잠겨있는지 지속적으로 확인하는 방식
1.2.2. 세마포
- 여러 공유자원에서 적용하는 뮤테스 락이라고 생각하자
- 탈의실이 여럿 존재하는 것
- 멈춤 신호와 진입 시도, 두 신호를 가지고 프로세스의 진입을 관리
- 전역 변수 S : 임계 구역에 진입 가능한 프로세스의 개수(가용 공유 자원의 개수)
- wait 함수 : 임계 구역에 진입/대기 여부를 나타내는 함수
- signal 함수 : 임계 구역에 진입 신호를 주는 함수
- 임계 구역 진입을 위해 지속적으로 확인해야함 -> CPU 주기의 낭비
- 보완방안 : 가용 공유 자원이 없을 때, wait 함수는 프로세스의 PCB를 세마포를 위한 대기 큐에 집어 넣는다. 그리고 signal 함수를 호출하면 signal 함수는 대기 중인 프로세스를 대기 큐에서 제거하고 프로세스 상태를 준비 상태로 변경한 뒤 준비 큐로 이동시킴
1.2.3. 모니터
- 세마포를 보완한 방식
- 공유 자원과 공유자원에 접근하기 위한 인터페이스(통로)를 묶어서 관리
- 공유 자원에 접근하기 위한 인터페이스를 만들고, 프로세스를 큐에 삽입하고 큐에 삽입된 순서대로 하나씩 공유 자원을 이용하도록 함.
- 실행 순서 제어를 위한 동기화 제공
- 특정 조건을 바탕으로 프로세스를 실행하고 일시 중단하기 위한 조건 변수 사용
- 조건 변수 : 프로세스나 스레드의 실행 순서를 제어하기 위한 변수, wait/signal
- wait : 호출한 프로세스의 상태를 대기로 전환, 일시적으로 조건 변수에 대한 대기 큐에 삽입하는 연산
- wait의 대기 큐와 모니터의 큐의 차이 : wait는 모니터에 진입한 프로세스를 대기 상태로 만듦(조건 변수에 대한 큐), 모니터는 프로세스가 하나씩 진입하기 위한 큐(상호 배제 큐)
- signal : 진입 가능함을 알리는 신호
1.3. 확인문제
1.3.1. 뮤텍스 락과 세마포의 설명
- 뮤텍스 락은 임계 구역을 잠근 뒤 임계 구역에 진입함으로 써 상호 배제를 위한 동기화를 이룬다.
- 세마포는 공유 자원이 여러 개 있는 상황에서도 이용 가능
- 세마포를 이용해 프로세스 실행 순서 제어를 위한 동기화를 이룰 수 있다.
2. 교착 상태
- 두 개 이상의 프로세스가 각자 가지고 있는 자원을 무작정 대기하는 상태
- 일어나지 않을 사건을 기다리며 진행이 멈춰 버리는 현상
- 상대방이 가진 자원을 기다리기만 하다 실행을 못하는 상황
2.1. 예시
- 게임 프로세스는 자원A를 점유한 채 웹 브라우저 프로세스가 점유하고 있는 자원B의 사용이 끝나길 기다리고, 웹 프로세스는 자원B를 점유한 채 게임 프로세스가 점유하고 있는 자원A의 사용이 끝나길 기다린다.
2.2. 해결 방안 탐색
2.2.1. 교착 상태 발생 상황을 정확히 표현
- 자원 할당 그래프 : 프로세스가 사용중인 자원을 간단하게 표현한 그래프
2.2.2. 교착 상태의 근본 원인
- 상호 배제
- 점유와 대기 : 자원을 할당받은 상태에서 다른 자원을 할당받기를 기다림
- 비선점 : 한 프로세스가 다른 프로세스가 점유한 자원을 빼앗지 않음
- 원형 대기 : 프로세스들과 프로세스가 요청 및 할당 받은 자원이 원의 형태를 띔
2.3. 해결 방안
2.3.1. 교착 상태 예방
- 상호 배제, 점유와 대기, 비선점, 원형 대기 중 하나의 조건을 발생되지 않도록 함
- 상호 배제 제거 : 비현실적
- 점유와 대기 제거 : 비효율적 자원 활용, 자원을 많이 요구하는 프로세스의 기아현상
- 비선점 제거 : CPU에 관해선 효과적이나 범용성이 떨어짐
- 원형 대기 제거 : 오름 차순으로 자원을 할당, 비교적 현실적, 컴퓨터 시스템 내의 모든 자원에 번호 부여가 어렵고 특정 자원의 활용률 급감
2.3.2. 교착 상태 회피
- 교착 상태가 발생하지 않을 만큼의 자원을 배분하는 방법
- 안전 상태 : 모든 프로세스가 정상적으로 자원을 할당 받고 종료될 수 있는 상태
- 안전 순서열 : 교착 상태 없이 안전하게 프로세스들에 자원을 할당할 수 있는 순서
- 안전 순서열 대로 프로세스에 자원을 배분하여 교착 상태가 발생하지 않으면 안전 상태
- 불안전 상태 : 교착 상태가 발생할 수도 있는 상태
2.3.3. 교착 상태 검출 후 회복
- 교착 상태 발생을 인전하고 사후 조치하는 방식
- 선점을 통한 회복 : 교착 상태가 회복될 때까지 한 프로세스씩 자원을 몰아주는 방식 -> 교착 상태에 놓은 모든 프로세스의 작업 내역을 잃는다.
- 프로세스강제 종료를 통한 회복 : 교착 상테에 놓인 프로세스를 모두 강제 종료 또는 한 프로세스씩 강제 종료하여 교착 상태를 회복 - 일부의 작업 내역만 잃으나 교착 상태 파악을 과정에서 오퍼헤드 야기
2.3.4. 교착 상태 무시
- 드물게 발생하는 잠재적 문제를 무시로 대처
- 타조 알고리즘