제8 장. 병행 프로세스cfs2.tistory.com/upload_control/download.blog?fhandle...2005-04-06...
TRANSCRIPT
제제 8 8 장장. . 병행병행 프로세스프로세스
동명정보대학교
컴퓨터공학과
20052005--0404--0606 운영체제운영체제 22
제제 1 1 절절. . 프로세스간프로세스간 통신통신
20052005--0404--0606 운영체제운영체제 33
프로세스간프로세스간 통신통신 ((IPC)IPC)
프로세스는 종종 다른 프로세스들과 통신할 필요가 있음
예 : Shell pipeline (who | wc –l)
프로세스간 통신에서의 고려사항
프로세스간 정보 전달 방법
두 개 이상의 프로세스가 중요한 일을 할 때 서로 방해하지 않
음을 보장
두 개의 프로세스가 마지막 1MB의 메모리를 얻고자 할 때
프로세스간에 의존성이 존재할 때의 적절한 실행 순서 결정
프로세스 A는 데이터 생산, 프로세스 B는 데이터 출력 담당
20052005--0404--0606 운영체제운영체제 44
병행병행 프로세스프로세스
다수의 프로세스가 공존하는 동안 공유 자원에 병행 접근
(Concurrent access)하게 되면 자원의 불일치 상태가 야기
될 수 있음
예 : 프린터 스풀러 (spooler)
스풀링 시스템
파일을 출력할 프로세스는 스풀러 디렉토리에 파일명을 입력
프린터 데몬 (Printer daemon)주기적으로 스풀러 디렉토리내의 출력 대상 존재 여부를 점검
출력 대상 존재시 파일을 출력하고 디렉토리에서 파일명 삭제
20052005--0404--0606 운영체제운영체제 55
병행병행 프로세스프로세스 : : 스풀링스풀링 시스템시스템
스풀러 디렉토리 : 파일명을 저장할 다수의 slot이 존재
공유 변수 : in, out스풀러 디렉토리의 특정 순간
slot 0 ~ 3 : empty, slot 4 ~ 6 : full
프로세스 A와 B가 동시에 파일 출력을 시도
20052005--0404--0606 운영체제운영체제 66
병행병행 프로세스프로세스 : : 스풀링스풀링 시스템시스템
상황
1) Process A : 공유 변수 in의 값을 읽어서 지역 변수에 저장
next_free_slot ⇐ 7
2) CPU 스케줄러 : 클럭 인터럽트 발생 후 Process B를 디스패칭
3) Process B : 공유 변수 in의 값을 읽어서 지역 변수에 저장
next_free_slot ⇐ 7
4) Process B : slot 7에 파일명 저장, 공유 변수 in의 값을 증가시킴
5) CPU 스케줄러 : Process A를 디스패칭
slot 7에 출력할 파일명을 저장
공유 변수 in의 값 증가 : in = next_free_slot + 1
20052005--0404--0606 운영체제운영체제 77
병행병행 프로세스프로세스
경쟁 조건 (race condition)다수의 프로세스가 공유 데이터를 읽거나 쓰게 될 때 어떤 프
로세스가, 언제 실행을 하는가에 따라 최종 결과가 결정됨
경쟁 조건의 예방책
다수의 프로세스들이 공유 데이터를 동시에 읽거나 쓰지 않도
록 함
20052005--0404--0606 운영체제운영체제 88
동기화동기화 ((Synchronization)Synchronization)
프로세스간에 공유 데이터에 대한 연산이나 사건 처리 등의
선수 관계 실현을 의미
1) [프로세스] 디스크로부터 데이터를 읽어오도록 요청
2) [프로세스] 세마포어를 기다림
3) [입출력 모듈] 입출력 완료
4) [ISR] 세마포어에 신호를 보냄
5) [프로세스] 실행을 계속함
Process A is synchronized with Process B
20052005--0404--0606 운영체제운영체제 99
한계한계 버퍼버퍼 ((Bounded Buffer)Bounded Buffer)공유 변수 type item = … ;
var buffer : array [0..n-1] of item; // 환형 버퍼로 구현
in, out : 0..n-1; // in : 입력 위치, out : 출력 위치
counter : 0..n; // 데이터 개수
in, out, counter := 0;
생산자 프로세스 (Producer process)
repeat…
nextp = produce_item (); …
while counter = n do no-op;
buffer [in] := nextp;
in := in + 1 mod n;
counter := counter +1;
until false;
20052005--0404--0606 운영체제운영체제 1010
한계한계 버퍼버퍼 ((Bounded Buffer)Bounded Buffer)
소비자 프로세스(Consumer process)
repeat
while counter = 0 do no-op;
nextc := buffer [out];
out := out + 1 mod n;
counter := counter – 1;
…consume_item (nextc);
…
until false;
20052005--0404--0606 운영체제운영체제 1111
한계한계 버퍼버퍼 ((Bounded Buffer)Bounded Buffer)
세부적인 수행 형태
counter := counter + 1 counter := counter – 1
register_A := counter register_B := counter
register_A := register_A + 1 register_B := register_B - 1
counter := register_A counter := register_B
생산자 프로세스 소비자 프로세스
20052005--0404--0606 운영체제운영체제 1212
한계한계 버퍼버퍼 ((Bounded Buffer)Bounded Buffer)
문제 상황
생산자 : register_A := counter
생산자 : register_A := register_A + 1
소비자 : register_B := counter
소비자 : register_B := register_B – 1
생산자 : counter := register_A
소비자 : counter := register_B
counter 변수의 초기값 : 5, 최종값은 ?
실행 순서에 따라 값이 달라짐
아래 문장들은 원자적(atomically)으로 수행되어야 함
counter := counter + 1;
counter := counter - 1;
20052005--0404--0606 운영체제운영체제 1313
임계임계 구역구역 ((Critical Section)Critical Section)
경쟁 조건의 예방책
상호배제 (Mutual Exclusion) 기법
임계 구역 (Critical Section / Critical region)
프로그램에서 공유 데이터가 사용되는 부분
두 개의 프로세스들 중 어느 누구도 동시에 임계 구역에 존
재하지 않는다면 경쟁 조건은 막을 수 있음
20052005--0404--0606 운영체제운영체제 1414
임계임계 구역구역 ((Critical Section)Critical Section)
20052005--0404--0606 운영체제운영체제 1515
임계임계 구역구역 문제문제
각 프로세스는 공유 데이터에 접근하는 임계 구역을 보유
문제 (Problem)
하나의 프로세스가 자신의 임계 구역에서 수행중일 때 다른
프로세스들은 자신의 임계 구역에서 수행될 수 없음
프로세스 Pi의 구조
repeat
entry section
critical section
exit section
remainder section
until false;
20052005--0404--0606 운영체제운영체제 1616
임계임계 구역구역 문제의문제의 해법해법
네 가지 조건을 충족해야 함
1. 상호 배제 (Mutual Exclusion)
프로세스 Pi 가 임계 구역에서 실행 중일 때 다른 프로세스들은
임계 구역 밖에서 기다려야 함
2. 각 프로세스간 실행 속도의 차이는 없음
3. 진행 조건 (Progress)
임계 구역 밖에서 기다리는 프로세스가 다른 프로세스들의
임계 구역 진입을 방해하지 않음
4. 한계 대기 (Bounded Waiting)
어떤 프로세스라도 임계 구역 진입이 무한정 연기되어서는 안됨
20052005--0404--0606 운영체제운영체제 1717
상호상호 배제배제 : : 인터럽트인터럽트 불가능불가능
손쉬운 해결책 : Disabling Interrupts
각 프로세스가 임계 구역에 진입한 후 모든 인터럽트가 불가능
임계 구역을 빠져 나오기 전에 다시 인터럽트를 가능하게 함
문제점
인터럽트가 발생하지 않기 때문에 프로세스간 CPU 전이가 발
생하지 않음
사용자 프로세스에게 인터럽트를 불가능하게 하는 능력을 제
공하는 것은 현명하지 못함
임의의 사용자 프로세스가 인터럽트 불가능으로 만든 후 다시 인
터럽트 가능으로 만들지 않을 때에는 어떤 상황이 될까 ?
시스템의 종말
20052005--0404--0606 운영체제운영체제 1818
상호상호 배제배제 : : 인터럽트인터럽트 불가능불가능
다중처리기 시스템에서 인터럽트 불가능은 disable 명령어를
실행한 처리기에만 영향을 미침
다른 처리기들은 실행을 계속하고, 공유 메모리 접근도 가능
커널이 변수나 리스트를 갱신하는 동안 인터럽트를 불가능
하게 하는 것은 유용
결론 : 인터럽트 불가능 정책
운영체제 : 유용한 기법
사용자 프로세스 : 상호 배제 메커니즘으로 부적합
20052005--0404--0606 운영체제운영체제 1919
상호상호 배제배제 : : 잠금잠금 변수변수((Lock variable)Lock variable)
잠금 변수 : 공유 변수
초기 값 = 0
동작 형태
1) 임계 구역에 진입하려는 프로세스는 우선 잠금 변수 값을 검사
2) 변수 값이 0이면 1로 설정한 후 임계 구역에 진입
변수 값이 1일 때는 0이 될 때까지 기다림
3) 임계 구역을 벗어나면서 잠금 변수 값을 0으로 설정
문제점
스풀러 디렉토리와 같은 문제의 발생 가능성
두 프로세스가 동시에 임계 구역에 진입 가능
20052005--0404--0606 운영체제운영체제 2020
상호상호 배제배제 : : 엄격한엄격한 교체교체
2개의 프로세스만 고려 : P0 와 P1
프로세스 Pi (or process Pj )의 일반적 구조
repeat
entry section
critical section
exit section
remainder section
until false;
프로세스들은 동기화를 위해 공유 변수 사용
스핀 잠금 (spin lock) : 바쁜 대기(busy waiting)를 사용하는 잠금
20052005--0404--0606 운영체제운영체제 2121
상호상호 배제배제 : : 알고리즘알고리즘 11
공유 변수
var turn : (0..1); (초기값 turn = 0)
turn = i ⇒ Pi 가 임계 구역에 진입가능
Process Pi
repeat
while (turn ≠ i ) do no-op ;
critical section
turn := j ;
remainder section
until false;
진행조건을 만족하지 않음
P0 실행 후 P1이 실행되지 않으면 P0의 임계 구역 진입이 불가능
20052005--0404--0606 운영체제운영체제 2222
상호상호 배제배제 : : 알고리즘알고리즘 22
공유 변수
var flag : array [0..1] of boolean ; // 초기값 flag[0] = flag[1] = false
flag [i] = true ⇒ Pi 가 임계 구역 진입준비 완료
Process Pi
repeat
flag[i] := true ;while (flag[j]) do no-op ;
critical section
flag [i] := false ;
remainder section
until false ;
상호배제 조건은 만족하지만 진행조건은 만족하지 않음
flag[i] = flag[j] = true
20052005--0404--0606 운영체제운영체제 2323
상호상호 배제배제 : : 알고리즘알고리즘 3 3
알고리즘 1/2의 공유 변수 통합 (Peterson 알고리즘)
Process Pi
repeat
flag [i] := true ;turn := j ;while (flag [j] and turn = j ) do no-op ;
critical section
flag [i] := false ;
remainder section
until false ;
3가지 요구조건 만족
2개의 프로세스에 대한 임계 구역 문제를 해결
20052005--0404--0606 운영체제운영체제 2424
NN개개 프로세스들의프로세스들의 상호상호 배제배제
Dijkstra가 처음 개발
Knuth가 개선안 제시
Eisenberg와 Mcquire
최대 n-1번 시도 이내에 임계 구역 진입 보장 알고리즘 제시
Lamport : 빵집 알고리즘 제시
Brinch Hansen : 분산처리 프로세스간 병행성 제어 기법 제시
Burns, et al : 하나의 공유 변수를 이용한 해결책 제시
Carvalho와 Rouairol : 컴퓨터 네트워크상에서 상호배제 시행책
20052005--0404--0606 운영체제운영체제 2525
빵집빵집 알고리즘알고리즘 ((Bakery Algorithm)Bakery Algorithm)
N 개 프로세스에 대한 임계 구역 문제 해법
FCFS (First-come First-served) 기법 적용
임계 구역에 진입하기 전에 프로세스는 번호를 부여받음
가장 낮은 번호를 받은 프로세스가 임계 구역에 진입
프로세스 Pi 과 Pj 가 동일한 번호를 부여받게 되면 프로세스
ID를 비교
i < j 이면 Pi 가 우선적으로 서비스됨
번호 부여 체계
비감소 : 1,2,3,3,3,3,4,5...
20052005--0404--0606 운영체제운영체제 2626
빵집빵집 알고리즘알고리즘 ((계속계속))
표기법 : (ticket #, pid #) – 사전적 순서 적용
(a,b) < (c,d) if (a < c) or if (a = c && b < d)
max (a0,…, an-1) = k, such that k ≥ ai for i = 0, …, n–1
공유 변수
var choosing : array [0..n – 1] of boolean ;
number : array [0..n – 1] of integer ;
변수 : 초기값으로 false 과 0 이 부여됨
20052005--0404--0606 운영체제운영체제 2727
빵집빵집 알고리즘알고리즘 ((계속계속))
repeat
choosing[i] := true ; // 번호표를 뽑기 전
number[i] := max(number[0], number[1], …, number [n –1])+1;
choosing[i] := false ; // 번호표를 뽑은 후
for j := 0 to n – 1 do // 모든 프로세스에 대해 번호표 비교
begin
while choosing[j] do no-op ; // Pj 가 번호표를 받을 때까지 대기
while number[j] ≠ 0 and (number[j],j) < (number[i], i) do
no-op ;
end;
critical section
number[i] := 0 ; // 다음 프로세스의 진입을 허용
remainder section
until false ;
20052005--0404--0606 운영체제운영체제 2828
동기화동기화 하드웨어하드웨어
원자적 함수 (Atomic Function)함수 전체가 분할되지 않고 하나의 단위로 수행됨
Test-and-set(TSL), Swap
변수의 내용을 원자적으로 검사하고 변경시킴
function Test-and-Set (var target: boolean) : boolean ;
begin
Test-and-Set := target ;target := true ;
end;
20052005--0404--0606 운영체제운영체제 2929
동기화동기화 하드웨어하드웨어
Test-and-Set을 이용한 상호 배제
20052005--0404--0606 운영체제운영체제 3030
TestTest--andand--setset을을 이용한이용한 상호상호 배제배제
공유 데이터 : var lock: boolean (= false)
Process Pi
repeat
while Test-and-Set (lock) do no-op;
critical section
lock := false;
remainder section
until false;
20052005--0404--0606 운영체제운영체제 3131
TestTest--andand--setset을을 이용한이용한 상호상호 배제배제
var waiting : array [0..n-1] of boolean (= false) ;
lock : boolean (= false) ;
Process Pi
var j : 0..n-1 ;
key : boolean ;
repeat
waiting[i] := true ;
key := true ;
while waiting[i] and key do key := Test-and-Set (lock) ;
waiting[i] := false ;
critical section
j := i + 1 mod n ;
while (j ≠ i) and (not waiting[j]) do j := j + 1 mod n ;
if j = i then lock := false ;
else waiting[j] := false ;
remainder section
until false ;
20052005--0404--0606 운영체제운영체제 3232
SwapSwap을을 이용한이용한 상호상호 배제배제
Swap 명령어procedure Swap (var a, b : boolean);
var temp : boolean;
begin
temp := a;
a := b;b := temp;
end;
Swap 명령어에 의한 상호 배제 구현repeat
key := true;repeat
Swap (lock, key);until key = false;
critical sectionlock := false;
remainder sectionuntil false;
20052005--0404--0606 운영체제운영체제 3333
SleepSleep과과 WakeupWakeup
Peterson 알고리즘과 Test-and-set 기법의 단점
바쁜 대기가 필요 : CPU 시간의 낭비 초래
문제 상황
높은 우선순위 프로세스(H)와 낮은 우선순위 프로세스(L)가 존재
스케줄링 규칙 : H가 준비 상태에 있다면 언제나 실행됨
1) 임의의 순간에, L : 임계 구역에 위치, H : 준비 상태
2) L : 임계 구역을 떠날 수 없음
H : 스케줄링 후 바쁜 대기 상태에 놓임
3) H : 무한 루프 상태에 놓임
⇒ 우선순위역전 문제 (priority inversion problem)
20052005--0404--0606 운영체제운영체제 3434
SleepSleep과과 WakeupWakeup
대안
프로세스가 임계 구역에 진입하지 못할 때에는 바쁜 대기(busy
waiting) 대신에 블록됨
블록킹되는 IPC 프리미티브 (primitive)
Sleep () 시스템 호출
다른 프로세스가 깨울 때까지 호출자를 대기(block)시킴
Wakeup () 시스템 호출
매개변수로 지정한 프로세스를 깨움
20052005--0404--0606 운영체제운영체제 3535
생산자생산자--소비자소비자 문제문제 : : sleep & wakeupsleep & wakeup
20052005--0404--0606 운영체제운영체제 3636
생산자생산자--소비자소비자 문제문제
count 변수에 대한 접근 제한이 없어서 경쟁조건 발생가능
문제 상황
1) 버퍼가 비어 있을 때 소비자 프로세스가 count 값을 읽어옴
count = 0
2) 스케줄러가 생산자 프로세스를 디스패칭시킴
3) 생산자 프로세스가 버퍼에 데이터 삽입 후 count 값 증가
count = 1
4) 생산자 프로세스가 소비자 프로세스를 깨우기 위해 wakeup 호출
5) 소비자 프로세스가 sleep 상태가 아니므로 wakeup 시그널 분실
6) 소비자 프로세스가 다시 실행되면 count 값 검사 후 sleep 상태
읽어온 count 값 = 0, 실제 count 값 = 1
20052005--0404--0606 운영체제운영체제 3737
생산자생산자--소비자소비자 문제문제
⇒ 생산자 프로세스가 버퍼를 모두 채운 후 sleep 상태가 되면
두 프로세스는 영원이 sleep 상태를 유지
문제의 본질
잠들지 않은 프로세스에게 보내진 wakeup 시그널이 분실됨
해결책 : 깨우기 대기 비트(wakeup waiting bit)의 추가
깨우기 대기 비트의 활용 형태
1) 깨어있는 프로세스에게 wakeup 시그널이 보내지면 해당 비트가
설정됨
2) 프로세스가 sleep 상태로 갈 때 깨우기 대기 비트가 설정되어 있으
면 해당 비트를 해제하고 프로세스는 여전히 깨어 있음
깨우기 대기 비트 : wakeup 시그널에 대한 돼지 저금통과 같음
20052005--0404--0606 운영체제운영체제 3838
세마포어세마포어 ((Semaphore)Semaphore)
1965, Dijkstra가 제안한 동기화 도구
세마포어 : 저장된 Wakeup 수를 카운트하는 정수형 변수
Semaphore S : 정수형 변수 (0 또는 1)
2가지 원자적 연산을 통해서만 세마포어에 접근가능
wait (S) or P(S) : while S ≤ 0 do no-op;
S := S – 1;
signal (S) or V(S) : S := S + 1;
N 개 프로세스간의 상호배제 문제 해결에 사용가능
20052005--0404--0606 운영체제운영체제 3939
철도용철도용 세마포어세마포어 신호기신호기
old
newmediumspeed
clearstop
20052005--0404--0606 운영체제운영체제 4040
22가지가지 유형의유형의 세마포어세마포어
이진 세마포어(Binary semaphore)
정수형 변수의 값은 0 또는 1만 가능
구현이 용이
계수형 세마포어(Counting semaphore)
정수형 변수의 값에는 제한이 없음
계수형 세마포어는 이진 세마포어를 이용하여 구현가능
20052005--0404--0606 운영체제운영체제 4141
임계구역임계구역 문제문제 : : 세마포어세마포어 이용이용
공유 변수
var mutex : semaphore ;
초기값 : mutex := 1;
Process Pi
repeat
wait (mutex);
critical section
signal (mutex);
remainder section
until false;
20052005--0404--0606 운영체제운영체제 4242
세마포어를세마포어를 이용한이용한 생산자생산자--소비자소비자 문제문제
세마포어의 용도
mutex : 상호 배제
full, empty : 동기화
세마포어의 용도
mutex : 상호 배제
full, empty : 동기화
20052005--0404--0606 운영체제운영체제 4343
세마포어세마포어 : : mutexmutex
세마포어의 카운트 기능이 필요없을 때 세마포어의 단순화
된 버전인 mutex를 사용
공유 자원이나 특정 부분의 코드에 대한 상호 배제에 유용
mutex의 2가지 상태
잠금 또는 풀림 (내부적으로 0은 풀림을 표시)
기본적인 mutex 호출
mutex_lock : 프로세스가 임계 구역에 진입할 때 호출
임계 구역 진입을 시도하는 다른 프로세스들은 블록됨
mutex_unlock : 프로세스가 임계 구역에서 나올 때 호출
20052005--0404--0606 운영체제운영체제 4444
세마포어세마포어 : : mutexmutex
mutex_lock과 mutex_unlock의 구현
mutex_lock :
TSL REGISTER, MUTEX : copy mutex to register and set mutex to 1
CMP REGISTER, #0 : was mutex zero ?
JZE ok : if it was zero, mutex was unlocked, so return
CALL thread_yield : mutex is busy; schedule another thread
ok : RET : return to caller; critical section entered
mutex_unlock :
MOVE MUTEX, #0 : store a 0 in mutex
RET : return to caller
20052005--0404--0606 운영체제운영체제 4545
세마포어세마포어 : : mutexmutex
mutex_lock과 enter_region 코드와의 차이점
mutex_lock : 임계구역 진입에 실패하면 블록됨
enter_region : 임계구역 진입에 실패하면 잠금을 반복해서 검사
바쁜 대기 (busy_waiting) 상태
추가된 mutex 호출 : mutex_trylock
스레드가 임계구역 진입에 실패하면 코드는 반환하지만 블록되
지 않음
⇒ 잠금 획득에 실패하면 블록되지 않고 다른 일을 할 수 있는 유
연성(flexibility)을 제공
20052005--0404--0606 운영체제운영체제 4646
세마포어의세마포어의 구현구현
계수형 세마포어
세마포어 : 큐 (or 리스트)를 갖는 구조체로 재정의
type semaphore = record
value : integer ;
L : list of process ;
end;
2가지 표준 연산(atomic operation)을 통해 세마포어에
접근 가능
wait & signal 연산은 atomic해야 하므로 임계 구역에서 실행
20052005--0404--0606 운영체제운영체제 4747
세마포어세마포어 구현구현 ((계속계속))
세마포어 연산의 정의
S.value := S.value – 1;
wait (S) if S.value < 0 then
begin
add this process to S.L ;block this process ;
end;
S.value := S.value + 1;
signal (S) if S.value ≤ 0 then
begin
remove a process P from S.L ;place process P on ready list ;
end;
20052005--0404--0606 운영체제운영체제 4848
세마포어세마포어 구현구현 ((계속계속))
세마포어 값의 의미
if S.value = 0
어떤 프로세스도 기다리지 있지 않음
if S.value < 0
프로세스가 블록되어 큐 (or 리스트)에서 기다리고 있음
|S.value| : 기다리고 있는 프로세스의 수
20052005--0404--0606 운영체제운영체제 4949
범용범용 동기화동기화 도구로서의도구로서의 세마포어세마포어
세마포어의 초기값 flag := 0
프로세스 Pi 의 A가 수행된 후 프로세스 Pj 의 B 가 수행됨
Code:
Pi Pj
… …A wait (flag)
signal (flag) B
20052005--0404--0606 운영체제운영체제 5050
병행병행 프로세스들의프로세스들의 실행실행 순서순서 결정결정
P0 P1
S2
S4
S5
S1
S3
S6
S7
세마포어 a, b, c의 초기값 : 0
S1
signal (a)
S3
wait (b)
S6
wait (c)
S7
wait (a)
S2
S4
signal (b)
S5
signal (c)
P1P0
20052005--0404--0606 운영체제운영체제 5151
교착상태교착상태((Deadlock)Deadlock)와와 기아상태기아상태((Starvation)Starvation)
교착상태
대기중인 2개 이상의 프로세스들 중 오직 한 프로세스에 의해서만발생될 수 있는 사건을 다른 프로세스들이 무한정 기다리는 상태
세마포어 S , Q : 1로 초기화
P0 P1
wait (S); wait (Q);
wait (Q); wait (S);
… …signal (S); signal (Q);
signal (Q); signal (S);
기아상태 : 무한 블록킹
특정 프로세스가 중단된 세마포어 큐에서 절대로 제거될 수 없는 상태
20052005--0404--0606 운영체제운영체제 5252
모니터모니터 ((Monitor)Monitor)
병행 프로세스간에 추상 데이터 유형(abstract data type)의 안
전한 공유를 허용하는 고수준의 동기화 구문
개념 제시 : Hoare, Brinch Hansen
다수의 병행 프로그래밍 언어에서 사용
Concurrent Pascal, Pascal-plus, Modula-2/3, uC++, Java 등
모니터는 세마포어를 이용하여 구현가능
모니터의 구성 요소
지역 변수, 하나 이상의 procedure, 초기화 문장
20052005--0404--0606 운영체제운영체제 5353
모니터모니터 ((계속계속))특성
지역 변수는 모니터의 procedure를 통해서만 접근 가능
프로세스는 procedure를 호출하여 모니터에 진입
모니터에서 실행중인 프로세스는 하나만 존재
type monitor-name = monitor
지역 변수 선언부
procedure P1 (…);
begin … end;
…procedure Pn (…);
begin…end;
begin
초기화 문장
end
type monitor-name = monitor
지역 변수 선언부
procedure P1 (…);
begin … end;
…procedure Pn (…);
begin…end;
begin
초기화 문장
end
20052005--0404--0606 운영체제운영체제 5454
모니터모니터 ((계속계속))
상호 배제 보장
한번에 하나의 프로세스만 모니터내에 존재하도록 함
공유 데이터 보호를 위해 공유 데이터를 모니터내에 위치시킴
☞ 프로세스가 모니터에 진입할 때 공유 데이터에게 lock을 설정
조건 변수(condition variable)를 이용한 동기화
모니터를 호출한 프로세스는 조건이 만족될 때까지 중단됨
조건이 충족되고 모니터가 가용하면 프로세스가 수행을 재개하
고 모니터에 진입함
조건 변수 : 모니터에 대해 지역 변수
변수 선언 var x, y : condition ;
20052005--0404--0606 운영체제운영체제 5555
모니터모니터 ((계속계속))
wait 과 signal 연산을 통해 조건 변수에 접근 가능
x.wait 연산
x.wait을 호출하는 프로세스는 중단됨(suspend)
다른 프로세스가 모니터를 사용할 수 있음
x.signal 연산
wait을 호출한 후 중단된 프로세스들 중 하나의 수행을 재개
중단된 프로세스가 없으면 signal 연산은 아무 효과도 없음
20052005--0404--0606 운영체제운영체제 5656
조건조건 변수를변수를 갖는갖는 모니터모니터
20052005--0404--0606 운영체제운영체제 5757
모니터의모니터의 구조구조
모니터에는 한번에 하나의 실행 프로세스만 존재
대기 프로세스들은 진입 큐나 조건 변수 큐에 위치함
실행중인 프로세스는 x.wait 연산을 통해 일시적으로 중단된
후 조건 변수 x의 큐에 들어감
조건 변화시 재진입하기 위해 대기
x.signal 연산
실행중인 프로세스가 조건 변수의 변화를 탐지하면 signal 연산
수행
조건 변수 x의 큐에 위치한 하나의 프로세스를 모니터로 가져옴
호출 프로세스는 블록된 후 긴급 큐(urgent queue)에 위치함
20052005--0404--0606 운영체제운영체제 5858
모니터의모니터의 구조구조
condition x
x.wait
condition y
y.wait
signal
20052005--0404--0606 운영체제운영체제 5959
모니터를모니터를 이용한이용한 한계한계 버퍼버퍼 문제의문제의 해법해법
type boundedbuffer = monitorvar buffer : array [0..n-1] of char ; // space for n itemsvar nextin, nextout, count : integer ; // buffer pointersvar notfull, notempty : condition ; // condition variablesprocedure append (x: char);begin
if count = n then notfull.wait ; // buffer is full, avoid overflowbuffer[nextin] := x ;nextin := nextin + 1 mod n ;count := count + 1 ; // one more item in buffernotempty.signal ; // resume any waiting consumer
end;procedure take (x: char);begin
if count = 0 then notempty.wait ; // buffer is empty, avoid underflowx := buffer[nextout] ;nextout := nextout + 1 mod n ;count := count – 1 ; // one fewer item in buffernotfull.signal ; // resume any waiting producer
end;begin // monitor body
nextin := 0; nextout := 0; count := 0; // buffer initially emptyend;
20052005--0404--0606 운영체제운영체제 6060
모니터를모니터를 이용한이용한 한계한계 버퍼버퍼 문제의문제의 해법해법
procedure producer ; // Producer Processvar x : char;begin
repeatx := produce ();append (x);
until false;end;
procedure consumer ; // Consumer Processvar x : char;begin
repeattake (x);consume (x);
until false;end;
begin // Main Prorgramcobegin
producer; consumer;coend
end.
procedure producer ; // Producer Processvar x : char;begin
repeatx := produce ();append (x);
until false;end;
procedure consumer ; // Consumer Processvar x : char;begin
repeattake (x);consume (x);
until false;end;
begin // Main Prorgramcobegin
producer; consumer;coend
end.
20052005--0404--0606 운영체제운영체제 6161
모니터모니터 메커니즘의메커니즘의 구현구현
세마포어를 이용한 모니터 메커니즘의 구현
모니터마다 세마포어 mutex (init = 1)를 제공
프로세스
모니터 진입 전에 wait (mutex) 연산 실행
모니터를 떠날 때 signal (mutex) 연산 실행
signal을 보내는 프로세스
수행이 재개된 프로세스가 떠나거나 대기할 때까지 기다림
signal을 보낸 프로세스는 수행이 중단됨
세마포어 next (init = 0)를 도입
변수 next-count
세마포어 next에서 중단된 프로세스 수
20052005--0404--0606 운영체제운영체제 6262
모니터모니터 메커니즘의메커니즘의 구현구현
공유 변수
var mutex : semaphore (init = 1);
next : semaphore (init = 0);
next-count : integer (init = 0); // next에서 중단된 프로세스 수
외부 procedure F 의 수정wait (mutex) ;
…body of F ;
…if next-count > 0
then signal (next) ;else signal (mutex) ;
모니터에서는 상호 배제가 보장됨
20052005--0404--0606 운영체제운영체제 6363
모니터모니터 메커니즘의메커니즘의 구현구현 : : 조건조건 변수변수
각 조건 변수(x)마다 세마포어와 정수형 변수를 도입
var x-sem : semaphore (init = 0)
x-count : integer (init = 0)
x.wait 연산의 구현
x-count := x-count + 1 ;
if next-count > 0
then signal (next) ;
else signal (mutex) ;
wait (x-sem) ;
x-count := x-count – 1 ;
20052005--0404--0606 운영체제운영체제 6464
모니터모니터 메커니즘의메커니즘의 구현구현 : : 조건조건 변수변수
x.signal 연산의 구현
if x-count > 0 then
begin
next-count := next-count + 1 ;
signal (x-sem) ;
wait (next) ;next-count := next-count – 1 ;
end;
20052005--0404--0606 운영체제운영체제 6565
모니터모니터 메커니즘메커니즘 구현구현 : : 조건부조건부 대기구문대기구문
다수의 프로세스가 조건 변수 x에서 중단되어 있고 임의의 프
로세스가 x.signal 연산을 실행할 때 중단된 프로세스들의 실
행 재개 순서 결정
단순 해결책 : 선입선출(FIFO) 기법 사용
개선책 : 조건부 대기 구문 사용
조건부 대기 구문 (conditional wait construct)형식 : x.wait (c)
c : 정수형 수식으로 우선순위 값
중단된 프로세스에게 우선순위 값으로 c 를 부여함
x.signal 연산 실행시 c 값이 최소인 프로세스가 실행 재개
20052005--0404--0606 운영체제운영체제 6666
모니터모니터 메커니즘메커니즘 구현구현 : : 조건부조건부 대기구문대기구문
조건부 대기 구문 사용 예 : 단일 자원 할당 모니터
다수의 프로세스들에 대해 단일 자원의 할당을 제어
프로세스가 자원 할당을 요구할 때 최대 자원사용 예상시간을
명시
모니터의 자원 할당 정책
가장 짧은 시간동안 자원을 사용할 프로세스에게 할당
프로세스의 자원 요청 및 반환
R.acquire (t)…..
access the resource;…..
R.release
20052005--0404--0606 운영체제운영체제 6767
모니터모니터 메커니즘메커니즘 구현구현 : : 조건부조건부 대기구문대기구문
단일 자원 할당 모니터
type resource_allocation = monitorvar busy : boolean ;var x : condition ;procedure acquire (time: integer);begin
if busy then x.wait(time) ;busy := true ;
end;procedure release;begin
busy := false ;x.signal ;
end;begin
busy := false ;end.
20052005--0404--0606 운영체제운영체제 6868
메시지메시지 전달전달 ((Message Passing)Message Passing)
프로세스간 통신(IPC)의 종류
단일 시스템에서의 프로세스간 통신
분산 시스템에서의 프로세스간 통신
프로세스 동기화와 상호 배제 기능을 제공하는 새로운
방법으로 메시지 전달 기법을 사용
최소 2가지 primitive가 필요
send (destination, &message)
receive (source, &message)
20052005--0404--0606 운영체제운영체제 6969
메시지메시지 전달시전달시 동기화동기화
프로세스의 Blocking 여부에 따른 IPC 기법의 분류
Blocking / Non-Blocking IPC
send() primitive의 분류
Blocking / Non-Blocking
receive() primitive의 분류
Blocking / Non-Blocking
3가지 형태의 조합이 가능
Blocking send, Blocking receive : 엄격한 동기화
Non-Blocking send, Blocking receive : 가장 유용한 조합
Non-Blocking send, Non-Blocking receive
20052005--0404--0606 운영체제운영체제 7070
메시지메시지 전달시전달시 동기화동기화
송신측이 send() 명령을 내린 후 Block되지 않는 경우
메시지를 다중 목적지로 전송할 수 있음
송신측이 메시지 수신 여부의 확인을 요구
수신측에 문제 발생 상황을 고려
수신측이 receive() 명령을 내린 후 Block되는 경우
수신측은 진행에 앞서 데이터를 필요로 함
데이터 수신 후 진행
문제점
송신측에서 send() 명령을 실행하기 전에 문제가 생기면 수신측
이 영원히 Block될 수 있음
20052005--0404--0606 운영체제운영체제 7171
메시지메시지 전달시전달시 동기화동기화
해결책 : blocking send, blocking receive 메시지를 수신할 때까지 양쪽이 모두 Block됨
통신 링크가 unbuffered일 때 가능한 방식
메시지 큐를 사용하지 않음
엄격한 동기화 기능 (예 : rendezvous) 제공
20052005--0404--0606 운영체제운영체제 7272
메시지메시지 전달시전달시 주소지정주소지정 방식방식
직접 주소지정 (direct addressing)
출발지와 목적지를 나타내기 위해 프로세스 ID를 사용
단점 : 출발지를 미리 명시할 수 없는 경우에는 부적합
예) 프린터/서버 프로세스 : 임의의 프로세스로부터 메시지 수신
간접 주소 지정 (indirect addressing) : 보다 편리함
메시지를 공유 메일박스로 전송
공유 메일박스 : 메시지 큐로 구성
송신측 : 메일박스로 메시지를 전송
수신측 : 메일박스에서 메시지를 가져감
20052005--0404--0606 운영체제운영체제 7373
메일박스메일박스((mailbox)mailbox)와와 포트포트((port)port)
메일박스
한 쌍의 송•수신자가 존재
다수의 송•수신자간에 공유 가능
포트
하나의 수신자와 다수의 송신자가
연계된 메일박스
클라이언트-서버 응용에 사용
수신자 : 서버
20052005--0404--0606 운영체제운영체제 7474
메일박스와메일박스와 포트의포트의 소유권소유권
메일박스
운영체제가 생성하고 프로세스가 소유권을 가짐
소유자가 요청하거나 소유자가 종료되면 메일박스도 소멸됨
포트
수신자 프로세스가 생성하고 소유함
수신자가 종료되면 port가 소멸됨
20052005--0404--0606 운영체제운영체제 7575
메시지메시지 형식형식 ((Message Format)Message Format)
메시지 : 메시지 헤더와 몸체로 구성
유닉스
ID는 없고 메시지 유형만 존재
제어 정보
버퍼 공간이 없을 때 조치 방법 기술
메시지 번호 (sequence number)
우선순위 등
큐잉 정책
일반적으로 FIFO 기법 사용
우선순위 정책의 적용도 가능
20052005--0404--0606 운영체제운영체제 7676
메시지메시지 전달전달 기법을기법을 이용한이용한 상호상호 배제배제
메시지 전달 기법을 이용한 상호 배제
n 개의 프로세스가 메일박스 mutex를 공유
send() : Non-Blocking 방식
receive() : mutex가 empty일 때 block됨
메일 박스의 초기화 : null 메시지 1개를 보유함
동작 방식
1) 임계 구역에 진입하려는 프로세스는 메시지 수신을 시도
2) 메일박스가 비어 있을 때 프로세스는 block됨
3) 메시지 수신 후 임계 구역에 진입한 프로세스는 임계 구역을
나올 때 메시지를 메일박스에 다시 놓아둠
메시지는 프로세스간에 전달되는 토큰(token)처럼 사용됨
20052005--0404--0606 운영체제운영체제 7777
메시지메시지 전달전달 기법을기법을 이용한이용한 상호상호 배제배제
program mutualexclution;const n = …; /* number of processes */procedure P(i: integer);var msg : message ;begin
repeatreceive (mutex, msg);
critical section;send (mutex, msg);
remainder section;until false;
end;begin
create_mailbox (mutex);send (mutex, null);cobegin
P(1); P(2); ….. ; P(n);coend
end;
20052005--0404--0606 운영체제운영체제 7878
메시지메시지 전달을전달을 이용한이용한 한계버퍼한계버퍼 문제문제 해법해법
2개의 메일박스 사용
생산자 : 데이터 생성 후 메일박스 mayconsume에 전송
소비자 : 메일박스 mayconsume에서 데이터를 수신
메일박스 mayconsume버퍼처럼 동작
버퍼내의 데이터는 메시지 큐로 관리됨
버퍼의 크기 : 변수 capacity로 정의
메일박스 mayproduce초기화 : 버퍼 크기만큼 null message로 채움
데이터 생산시 크기 감소, 데이터 소비시 크기 증가
다수의 생산자-소비자 프로세스 지원가능
20052005--0404--0606 운영체제운영체제 7979
메시지메시지 전달을전달을 이용한이용한 한계버퍼한계버퍼 문제문제 해법해법const
capacity = …; // buffering capacitynull = …; // empty message
var i : integer;procedure producer ;var pmsg : message ;begin
while true dobegin
receive (mayproduce, pmsg) ;pmsg := produce () ;send (mayconsume, pmsg) ;
endend;procedure consumer ;var cmsg : message ;begin
while true dobegin
receive (mayconsume, cmsg) ;consume (cmsg) ;send (mayproduce, null) ;
endend;
20052005--0404--0606 운영체제운영체제 8080
메시지메시지 전달을전달을 이용한이용한 한계버퍼한계버퍼 문제문제 해법해법
begin // main procedurecreate_mailbox (mayproduce);create_mailbox (mayconsume);for i = 1 to capacity do
send (mayproduce, null);cobegin
producer;consumer;
coendend
20052005--0404--0606 운영체제운영체제 8181
배리어배리어 ((Barrier)Barrier)
배리어
프로세스 그룹에 대한 동기화 메카니즘
배리어의 동작 방식
일부 응용은 다수의 실행 단계(step)로 나누어짐
각 실행 단계의 끝에 배리어를 위치시킴
모든 프로세스들이 다음 단계로 진행할 준비가 될 때까지 어떤
프로세스도 다음 단계로 진행하지 못함
임의의 프로세스가 배리어에 먼저 도착하면 모든 프로세스가
배리어에 도착할 때까지 block됨
각 프로세스는 배리어에 도착하면 barrier primitive를 실행
모든 프로세스가 배리어에 도착하면 다음 실행 단계로 이동
20052005--0404--0606 운영체제운영체제 8282
배리어배리어 ((Barrier)Barrier)
배리어의 사용 예
20052005--0404--0606 운영체제운영체제 8383
제제 2 2 절절. . 고전적인고전적인 IPC IPC 문제들문제들
20052005--0404--0606 운영체제운영체제 8484
고전적인고전적인 동기화동기화 문제들문제들
식사하는 철학자 문제(Dining-Philosophers Problem)
판독자-기록자 문제(Readers-Writers Problem)
잠자는 이발사 문제 (Sleeping Barber Problem)
20052005--0404--0606 운영체제운영체제 8585
식사하는식사하는 철학자철학자 문제문제
제한된 수의 자원을 배타적으로 사용하려고 경쟁하는 프
로세스들을 모델링하는데 유용
철학자들의 행동 : 생각하고 식사만 함
둥근 탁자와 5개의 젓가락(or 포크)을 공유
식사를 하려면 2개의 젓가락(or 포크)이 필요함
한번에 하나의 젓가락만 집을 수 있음
배가 고프면 젓가락을 하나씩 집어 식사하고 제자리에 놓음
요구사항
교착상태가 발생하지 않는 해법을 제시할 것
20052005--0404--0606 운영체제운영체제 8686
식사하는식사하는 철학자철학자 문제문제
문제 상황
or
20052005--0404--0606 운영체제운영체제 8787
식사하는식사하는 철학자철학자 문제문제 : : 해법해법 1 1
공유 데이터
var chopstick : array [0..4] of semaphore(init=1);
Philosopheri 의 행동
repeatthinkwait (chopstick[i])wait (chopstick[i+1 mod 5])eatsignal (chopstick[i]);signal (chopstick[i+1 mod 5]);
until false;
20052005--0404--0606 운영체제운영체제 8888
식사하는식사하는 철학자철학자 문제문제 : : 해법해법 1 1
20052005--0404--0606 운영체제운영체제 8989
식사하는식사하는 철학자철학자 문제문제 : : 해법해법 11
문제점 : 교착상태 야기
교착 상태 : 환형 대기(Circular waiting)
모든 철학자들이 동시에 왼쪽 젓가락을 들고 오른쪽 젓가
락을 집기 위해 기다리는 상황
교착 상태 제거 방법들
4명에게만 젓가락을 집을 수 있도록 허용
젓가락 2개를 다 집을 수 있을 때만 젓가락을 집도록 허용
비대칭적 해법 (홀수 – 오른쪽 먼저, 짝수 – 왼쪽 먼저)
20052005--0404--0606 운영체제운영체제 9090
식사하는식사하는 철학자철학자 문제문제 : : 개선안개선안
개선안 11) 왼쪽 젓가락을 집은 후 오른쪽 젓가락을 집을 수 있는지 검사
2) 오른쪽 젓가락을 집지 못하면 왼쪽 젓가락을 내려 놓고 잠시 기
다린 후 다시 처음부터 시도
동일한 작업이 반복되면 해당 프로세스는 전혀 식사를 하지 못하게 됨 ⇒ 기아상태 (starvation) 유발
개선안 2 : random 대기 시간 이용
오른쪽 젓가락을 집지 못하면 상이한 시간동안 기다린 후 다시
시도
예) Ethernet 망에서 패킷 충돌시 random 시간동안 대기후 재시도
20052005--0404--0606 운영체제운영체제 9191
식사하는식사하는 철학자철학자 문제문제 : : 해법해법 22
교착상태와 기아상태가 없는 해법
20052005--0404--0606 운영체제운영체제 9292
식사하는식사하는 철학자철학자 문제문제 : : 해법해법 22
20052005--0404--0606 운영체제운영체제 9393
판독자판독자--기록자기록자 문제문제
문제 상황
파일 등의 데이터는 다수의 병행 프로세스들간에 공유됨
일부 프로세스는 공유 데이터의 내용을 읽고, 어떤 프로세스
들은 공유 데이터를 갱신함
예) 데이터베이스 시스템
판독자(reader) 프로세스 : DB를 읽기만 하는 프로세스
기록자(writer) 프로세스 : DB를 갱신하는 프로세스
요구사항
2개 이상의 판독자 프로세스의 동시 접근은 허용
판독자 프로세스와 기록자 프로세스의 동시 접근은 불허
2개 이상의 기록자 프로세스의 동시 접근도 불허
20052005--0404--0606 운영체제운영체제 9494
판독자판독자--기록자기록자 문제문제
공유 데이터
var mutex : semaphore (init=1); // controls access to readcount
db : semaphore (init=1); // controls access to the database
readcount : integer (init=0); // # of processes reading or wanting to
기록자 프로세스 (Writer process)repeat
think_up_data ();wait (db);write_database (); signal (db);
until false;
20052005--0404--0606 운영체제운영체제 9595
판독자판독자--기록자기록자 문제문제 ((계속계속))
판독자 프로세스 (Reader process)repeat
wait (mutex);readcount := readcount +1;if readcount = 1 then wait (db);signal (mutex);read_database ();wait (mutex);readcount := readcount – 1;if readcount = 0 then signal (db);signal (mutex);
until false;
20052005--0404--0606 운영체제운영체제 9696
잠자는잠자는 이발사이발사 문제문제
문제 상황
이발사 : 1명, 이발용 의자 : 1개, 대기용 의자 : n개
이발사는 손님이 없으면 수면 상태가 됨
손님이 오면 이발사가 깨어남
이발하는 동안 도착한 손님은 대기용 의자가 비어 있으면 앉
아서 기다리고, 그렇지 않으면 이발소를 떠남
요구사항
이발사와 손님이 경쟁조건에 빠지지 않도록 함
해결방법 : 3개의 세마포어를 이용
customers, barbers, mutex
20052005--0404--0606 운영체제운영체제 9797
잠자는잠자는 이발사이발사 문제문제
20052005--0404--0606 운영체제운영체제 9898
잠자는잠자는 이발사이발사 문제문제#define CHAIRS 5 /* # of chairs for waiting customers */
semaphore customers = 0; /* # of customers waiting for service */semaphore barbers = 0; /* # of barbers waiting for customers */semaphore mutex = 1; /* for mutual exclusion */int waiting = 0; /* customers are waiting (not being cut) */
void barber (void) {
while (TRUE) {wait (&customers); /* go to sleep if # of customers is 0 */wait (&mutex); /* acquire access to ‘waiting’ */waiting = waiting – 1; /* decrement count of waiting customers */signal (&barbers); /* one barber is now ready to cut hair */signal (&mutex); /* release ‘waiting’ */cut_hair (); /* cut hair (outside critical section) */
}}
20052005--0404--0606 운영체제운영체제 9999
잠자는잠자는 이발사이발사 문제문제
void customer (void) {
wait (&mutex); /* enter critical section */if (waiting < CHAIRS) { /* if there are no free chairs, leave */
waiting = waiting + 1; /* increment count of waiting customers */signal (&customers); /* wake up barber if necessary */signal (&mutex); /* release access to ‘waiting’ */wait (&barbers); /* go to sleep if # of free barbers is 0 */get_haircut (); /* be seated and be serviced */
} else {signal (&mutex); /* shop is full; do not wait */
}}