프로세스 동기화
: 프로세스들 사이의 수행 시기를 맞추는 것을 의미👩동기화
- 실행 순서 제어
- 상호 배제: 동시에 접근해서는 안 되는 자원에 하나의 프로세스만 접근하게 하기
- 스레드도 동기화 대상이다. 실행의 흐름을 갖는 모든 것은 동기화의 대상이다.
공유 자원: 예시에서 동시에 실행되는 프로세스들은 전역변수 잔액
, 총합
이라는 공동의 자원을 두고 작업을 함
임계 구역: 동시에 실행하면 문제가 발생하는 자원에 접근하는 코드 영역
두 개 이상의 프로세스가 임계 구역에 진입하고자 하면 둘 중 하나는 대기!
두 개 이상의 프로세스가 잘못된 실행으로 인해 임계 구역의 코드를 실행하여 문제가 발생-> 레이스 컨디션
이 때, 상호 배제를 위한 동기화는 이와 같은 일이 발생하지 않도록 관리
임계 구역 문제를 3가지 원칙 하에 해결
1. 상호 배제
2. 진행: 임계 구역에 어떤 프로세스도 진입하지 않았을 경우 진입하고자 하는 프로세스는 들어갈 수 있어야 한다.
3. 유한 대기: 한 프로세스가 임계 구역에 진입하고 싶다면 그 프로세스는 언젠가는 임계 구역에 들어올 수 있어야 한다.
p351
1. 실행 순서 제어, 상호 배제
2. 1
- 뮤텍스 락
- 세마포
- 모니터
내가 지금 임계 구역에 있음
을 알리기 위해 뮤텍스 락을 이용해 임계 구역에 자물쇠를 걸어둘 수 있다.
- 자물쇠 역할: 프로세스들이 공유하는 전역변수 lock
- 임계 구역을 잠그는 역할: acquire 함수
- 임계 구역의 잠금을 해제: release 함수
acquire 함수
바쁜 대기
하나의 프로세스에만 임계 구역에 진입할 수 있다.
acquire(){ while(lock == true) // 임계 구역이 만약 잠겨 있다면 ; // 임계 구역이 잠겨있는지 반복적으로 확인 lock = true; // 잠겨있지 않다면 임계 구역 잠금 } release(){ lock = false; }
뮤텍스 락: 하나의 공유 자원에 접근하는 프로세스를 상정
세마포는 여러 개의 탈의실이 있는 경우라고 생각하면 된다.
하나의 변수와 두 개의 함수(전공서마다 변수명 다를 수 있다)
전역변수 S
: 임계 구역에 진입할 수 있는 프로세스의 개수(사용 가능한 공유 자원의 개수)wait
함수: 임계 구역에 들어가도 좋은지, 기다려야 할지를 알려줌signal 함수
: 임계 구역 앞에서 기다리는 프로세스에 '이제 가도 좋다'고 신호를 줌wait(){ // 임계 구역 while(S <= 0) ; S--; } signal(){ S++; }
대기 상태
로 만들고wait(){ S--; if(S<0){ add this process to Queue; // 프로세스 PCB를 대기 큐에 삽입 sleep(); // 대기상태 } } signal(){ S++ if(S<=0){ remove a process p from Queue; wakeup(p); } }
동기화의 개념
- 동시에 접근해서는 안 되는 자원에 동시에 접근하지 않도록 제어하는 것
(상호 배제를 위한 동기화)
- 특정 조건이 만족되어야만 실행할 수 있는 상황에서 올바른 순서대로 실행하게 하는 것
(실행 순서 제어를 위한 동기화)
세마포: 매번 임계구역에 앞뒤로 일일이 wait와 signal 함수를 명시하는 것은 번거로운 일이기 때문이다.
모니터: 공유 자원과 공유 자원에 접근하기 위한 인터페이스(통로)를 묶어 관리
모니터를 통해 공유 자원에 접근하고자 하는 프로세스 큐에 삽입
큐에 삽입된 순서대로 하나씩 공유자원 이용
조건 변수: 특정 조건을 바탕으로 프로세스를 실행하고 일시 중단하기 위해 사용
- 상호 배제를 위한 큐
- 모니터에 한 번에 하나의 프로세스만 진입하도록 하기 위해 만들어진 큐
- 조건변수에 대한 큐
- 모니터에 이미 진입한 프로세스의 실행 조건이 만족될 때까지 잠시 실행이 중단되어 기다리기 위해 만들어진 큐
p365
- 4
- 반드시 바쁜 대기를 할 필요는 없고, 대기 상태로 접어들 게 할 수도 있다.
- B
- 상호배제, 실행 순서 제어