제8 장. 병행 프로세스cfs2.tistory.com/upload_control/download.blog?fhandle...2005-04-06...

99
8 8 . . 병행 병행 프로세스 프로세스 동명정보대학교 컴퓨터공학과

Upload: others

Post on 25-Dec-2019

0 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 제8 장. 병행 프로세스cfs2.tistory.com/upload_control/download.blog?fhandle...2005-04-06 운영체제 19 상호배제: 잠금변수(Lock variable) 잠금변수: 공유변수

제제 8 8 장장. . 병행병행 프로세스프로세스

동명정보대학교

컴퓨터공학과

Page 2: 제8 장. 병행 프로세스cfs2.tistory.com/upload_control/download.blog?fhandle...2005-04-06 운영체제 19 상호배제: 잠금변수(Lock variable) 잠금변수: 공유변수

20052005--0404--0606 운영체제운영체제 22

제제 1 1 절절. . 프로세스간프로세스간 통신통신

Page 3: 제8 장. 병행 프로세스cfs2.tistory.com/upload_control/download.blog?fhandle...2005-04-06 운영체제 19 상호배제: 잠금변수(Lock variable) 잠금변수: 공유변수

20052005--0404--0606 운영체제운영체제 33

프로세스간프로세스간 통신통신 ((IPC)IPC)

프로세스는 종종 다른 프로세스들과 통신할 필요가 있음

예 : Shell pipeline (who | wc –l)

프로세스간 통신에서의 고려사항

프로세스간 정보 전달 방법

두 개 이상의 프로세스가 중요한 일을 할 때 서로 방해하지 않

음을 보장

두 개의 프로세스가 마지막 1MB의 메모리를 얻고자 할 때

프로세스간에 의존성이 존재할 때의 적절한 실행 순서 결정

프로세스 A는 데이터 생산, 프로세스 B는 데이터 출력 담당

Page 4: 제8 장. 병행 프로세스cfs2.tistory.com/upload_control/download.blog?fhandle...2005-04-06 운영체제 19 상호배제: 잠금변수(Lock variable) 잠금변수: 공유변수

20052005--0404--0606 운영체제운영체제 44

병행병행 프로세스프로세스

다수의 프로세스가 공존하는 동안 공유 자원에 병행 접근

(Concurrent access)하게 되면 자원의 불일치 상태가 야기

될 수 있음

예 : 프린터 스풀러 (spooler)

스풀링 시스템

파일을 출력할 프로세스는 스풀러 디렉토리에 파일명을 입력

프린터 데몬 (Printer daemon)주기적으로 스풀러 디렉토리내의 출력 대상 존재 여부를 점검

출력 대상 존재시 파일을 출력하고 디렉토리에서 파일명 삭제

Page 5: 제8 장. 병행 프로세스cfs2.tistory.com/upload_control/download.blog?fhandle...2005-04-06 운영체제 19 상호배제: 잠금변수(Lock variable) 잠금변수: 공유변수

20052005--0404--0606 운영체제운영체제 55

병행병행 프로세스프로세스 : : 스풀링스풀링 시스템시스템

스풀러 디렉토리 : 파일명을 저장할 다수의 slot이 존재

공유 변수 : in, out스풀러 디렉토리의 특정 순간

slot 0 ~ 3 : empty, slot 4 ~ 6 : full

프로세스 A와 B가 동시에 파일 출력을 시도

Page 6: 제8 장. 병행 프로세스cfs2.tistory.com/upload_control/download.blog?fhandle...2005-04-06 운영체제 19 상호배제: 잠금변수(Lock variable) 잠금변수: 공유변수

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

Page 7: 제8 장. 병행 프로세스cfs2.tistory.com/upload_control/download.blog?fhandle...2005-04-06 운영체제 19 상호배제: 잠금변수(Lock variable) 잠금변수: 공유변수

20052005--0404--0606 운영체제운영체제 77

병행병행 프로세스프로세스

경쟁 조건 (race condition)다수의 프로세스가 공유 데이터를 읽거나 쓰게 될 때 어떤 프

로세스가, 언제 실행을 하는가에 따라 최종 결과가 결정됨

경쟁 조건의 예방책

다수의 프로세스들이 공유 데이터를 동시에 읽거나 쓰지 않도

록 함

Page 8: 제8 장. 병행 프로세스cfs2.tistory.com/upload_control/download.blog?fhandle...2005-04-06 운영체제 19 상호배제: 잠금변수(Lock variable) 잠금변수: 공유변수

20052005--0404--0606 운영체제운영체제 88

동기화동기화 ((Synchronization)Synchronization)

프로세스간에 공유 데이터에 대한 연산이나 사건 처리 등의

선수 관계 실현을 의미

1) [프로세스] 디스크로부터 데이터를 읽어오도록 요청

2) [프로세스] 세마포어를 기다림

3) [입출력 모듈] 입출력 완료

4) [ISR] 세마포어에 신호를 보냄

5) [프로세스] 실행을 계속함

Process A is synchronized with Process B

Page 9: 제8 장. 병행 프로세스cfs2.tistory.com/upload_control/download.blog?fhandle...2005-04-06 운영체제 19 상호배제: 잠금변수(Lock variable) 잠금변수: 공유변수

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;

Page 10: 제8 장. 병행 프로세스cfs2.tistory.com/upload_control/download.blog?fhandle...2005-04-06 운영체제 19 상호배제: 잠금변수(Lock variable) 잠금변수: 공유변수

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;

Page 11: 제8 장. 병행 프로세스cfs2.tistory.com/upload_control/download.blog?fhandle...2005-04-06 운영체제 19 상호배제: 잠금변수(Lock variable) 잠금변수: 공유변수

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

생산자 프로세스 소비자 프로세스

Page 12: 제8 장. 병행 프로세스cfs2.tistory.com/upload_control/download.blog?fhandle...2005-04-06 운영체제 19 상호배제: 잠금변수(Lock variable) 잠금변수: 공유변수

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;

Page 13: 제8 장. 병행 프로세스cfs2.tistory.com/upload_control/download.blog?fhandle...2005-04-06 운영체제 19 상호배제: 잠금변수(Lock variable) 잠금변수: 공유변수

20052005--0404--0606 운영체제운영체제 1313

임계임계 구역구역 ((Critical Section)Critical Section)

경쟁 조건의 예방책

상호배제 (Mutual Exclusion) 기법

임계 구역 (Critical Section / Critical region)

프로그램에서 공유 데이터가 사용되는 부분

두 개의 프로세스들 중 어느 누구도 동시에 임계 구역에 존

재하지 않는다면 경쟁 조건은 막을 수 있음

Page 14: 제8 장. 병행 프로세스cfs2.tistory.com/upload_control/download.blog?fhandle...2005-04-06 운영체제 19 상호배제: 잠금변수(Lock variable) 잠금변수: 공유변수

20052005--0404--0606 운영체제운영체제 1414

임계임계 구역구역 ((Critical Section)Critical Section)

Page 15: 제8 장. 병행 프로세스cfs2.tistory.com/upload_control/download.blog?fhandle...2005-04-06 운영체제 19 상호배제: 잠금변수(Lock variable) 잠금변수: 공유변수

20052005--0404--0606 운영체제운영체제 1515

임계임계 구역구역 문제문제

각 프로세스는 공유 데이터에 접근하는 임계 구역을 보유

문제 (Problem)

하나의 프로세스가 자신의 임계 구역에서 수행중일 때 다른

프로세스들은 자신의 임계 구역에서 수행될 수 없음

프로세스 Pi의 구조

repeat

entry section

critical section

exit section

remainder section

until false;

Page 16: 제8 장. 병행 프로세스cfs2.tistory.com/upload_control/download.blog?fhandle...2005-04-06 운영체제 19 상호배제: 잠금변수(Lock variable) 잠금변수: 공유변수

20052005--0404--0606 운영체제운영체제 1616

임계임계 구역구역 문제의문제의 해법해법

네 가지 조건을 충족해야 함

1. 상호 배제 (Mutual Exclusion)

프로세스 Pi 가 임계 구역에서 실행 중일 때 다른 프로세스들은

임계 구역 밖에서 기다려야 함

2. 각 프로세스간 실행 속도의 차이는 없음

3. 진행 조건 (Progress)

임계 구역 밖에서 기다리는 프로세스가 다른 프로세스들의

임계 구역 진입을 방해하지 않음

4. 한계 대기 (Bounded Waiting)

어떤 프로세스라도 임계 구역 진입이 무한정 연기되어서는 안됨

Page 17: 제8 장. 병행 프로세스cfs2.tistory.com/upload_control/download.blog?fhandle...2005-04-06 운영체제 19 상호배제: 잠금변수(Lock variable) 잠금변수: 공유변수

20052005--0404--0606 운영체제운영체제 1717

상호상호 배제배제 : : 인터럽트인터럽트 불가능불가능

손쉬운 해결책 : Disabling Interrupts

각 프로세스가 임계 구역에 진입한 후 모든 인터럽트가 불가능

임계 구역을 빠져 나오기 전에 다시 인터럽트를 가능하게 함

문제점

인터럽트가 발생하지 않기 때문에 프로세스간 CPU 전이가 발

생하지 않음

사용자 프로세스에게 인터럽트를 불가능하게 하는 능력을 제

공하는 것은 현명하지 못함

임의의 사용자 프로세스가 인터럽트 불가능으로 만든 후 다시 인

터럽트 가능으로 만들지 않을 때에는 어떤 상황이 될까 ?

시스템의 종말

Page 18: 제8 장. 병행 프로세스cfs2.tistory.com/upload_control/download.blog?fhandle...2005-04-06 운영체제 19 상호배제: 잠금변수(Lock variable) 잠금변수: 공유변수

20052005--0404--0606 운영체제운영체제 1818

상호상호 배제배제 : : 인터럽트인터럽트 불가능불가능

다중처리기 시스템에서 인터럽트 불가능은 disable 명령어를

실행한 처리기에만 영향을 미침

다른 처리기들은 실행을 계속하고, 공유 메모리 접근도 가능

커널이 변수나 리스트를 갱신하는 동안 인터럽트를 불가능

하게 하는 것은 유용

결론 : 인터럽트 불가능 정책

운영체제 : 유용한 기법

사용자 프로세스 : 상호 배제 메커니즘으로 부적합

Page 19: 제8 장. 병행 프로세스cfs2.tistory.com/upload_control/download.blog?fhandle...2005-04-06 운영체제 19 상호배제: 잠금변수(Lock variable) 잠금변수: 공유변수

20052005--0404--0606 운영체제운영체제 1919

상호상호 배제배제 : : 잠금잠금 변수변수((Lock variable)Lock variable)

잠금 변수 : 공유 변수

초기 값 = 0

동작 형태

1) 임계 구역에 진입하려는 프로세스는 우선 잠금 변수 값을 검사

2) 변수 값이 0이면 1로 설정한 후 임계 구역에 진입

변수 값이 1일 때는 0이 될 때까지 기다림

3) 임계 구역을 벗어나면서 잠금 변수 값을 0으로 설정

문제점

스풀러 디렉토리와 같은 문제의 발생 가능성

두 프로세스가 동시에 임계 구역에 진입 가능

Page 20: 제8 장. 병행 프로세스cfs2.tistory.com/upload_control/download.blog?fhandle...2005-04-06 운영체제 19 상호배제: 잠금변수(Lock variable) 잠금변수: 공유변수

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)를 사용하는 잠금

Page 21: 제8 장. 병행 프로세스cfs2.tistory.com/upload_control/download.blog?fhandle...2005-04-06 운영체제 19 상호배제: 잠금변수(Lock variable) 잠금변수: 공유변수

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의 임계 구역 진입이 불가능

Page 22: 제8 장. 병행 프로세스cfs2.tistory.com/upload_control/download.blog?fhandle...2005-04-06 운영체제 19 상호배제: 잠금변수(Lock variable) 잠금변수: 공유변수

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

Page 23: 제8 장. 병행 프로세스cfs2.tistory.com/upload_control/download.blog?fhandle...2005-04-06 운영체제 19 상호배제: 잠금변수(Lock variable) 잠금변수: 공유변수

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개의 프로세스에 대한 임계 구역 문제를 해결

Page 24: 제8 장. 병행 프로세스cfs2.tistory.com/upload_control/download.blog?fhandle...2005-04-06 운영체제 19 상호배제: 잠금변수(Lock variable) 잠금변수: 공유변수

20052005--0404--0606 운영체제운영체제 2424

NN개개 프로세스들의프로세스들의 상호상호 배제배제

Dijkstra가 처음 개발

Knuth가 개선안 제시

Eisenberg와 Mcquire

최대 n-1번 시도 이내에 임계 구역 진입 보장 알고리즘 제시

Lamport : 빵집 알고리즘 제시

Brinch Hansen : 분산처리 프로세스간 병행성 제어 기법 제시

Burns, et al : 하나의 공유 변수를 이용한 해결책 제시

Carvalho와 Rouairol : 컴퓨터 네트워크상에서 상호배제 시행책

Page 25: 제8 장. 병행 프로세스cfs2.tistory.com/upload_control/download.blog?fhandle...2005-04-06 운영체제 19 상호배제: 잠금변수(Lock variable) 잠금변수: 공유변수

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...

Page 26: 제8 장. 병행 프로세스cfs2.tistory.com/upload_control/download.blog?fhandle...2005-04-06 운영체제 19 상호배제: 잠금변수(Lock variable) 잠금변수: 공유변수

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 이 부여됨

Page 27: 제8 장. 병행 프로세스cfs2.tistory.com/upload_control/download.blog?fhandle...2005-04-06 운영체제 19 상호배제: 잠금변수(Lock variable) 잠금변수: 공유변수

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 ;

Page 28: 제8 장. 병행 프로세스cfs2.tistory.com/upload_control/download.blog?fhandle...2005-04-06 운영체제 19 상호배제: 잠금변수(Lock variable) 잠금변수: 공유변수

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;

Page 29: 제8 장. 병행 프로세스cfs2.tistory.com/upload_control/download.blog?fhandle...2005-04-06 운영체제 19 상호배제: 잠금변수(Lock variable) 잠금변수: 공유변수

20052005--0404--0606 운영체제운영체제 2929

동기화동기화 하드웨어하드웨어

Test-and-Set을 이용한 상호 배제

Page 30: 제8 장. 병행 프로세스cfs2.tistory.com/upload_control/download.blog?fhandle...2005-04-06 운영체제 19 상호배제: 잠금변수(Lock variable) 잠금변수: 공유변수

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;

Page 31: 제8 장. 병행 프로세스cfs2.tistory.com/upload_control/download.blog?fhandle...2005-04-06 운영체제 19 상호배제: 잠금변수(Lock variable) 잠금변수: 공유변수

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 ;

Page 32: 제8 장. 병행 프로세스cfs2.tistory.com/upload_control/download.blog?fhandle...2005-04-06 운영체제 19 상호배제: 잠금변수(Lock variable) 잠금변수: 공유변수

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;

Page 33: 제8 장. 병행 프로세스cfs2.tistory.com/upload_control/download.blog?fhandle...2005-04-06 운영체제 19 상호배제: 잠금변수(Lock variable) 잠금변수: 공유변수

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)

Page 34: 제8 장. 병행 프로세스cfs2.tistory.com/upload_control/download.blog?fhandle...2005-04-06 운영체제 19 상호배제: 잠금변수(Lock variable) 잠금변수: 공유변수

20052005--0404--0606 운영체제운영체제 3434

SleepSleep과과 WakeupWakeup

대안

프로세스가 임계 구역에 진입하지 못할 때에는 바쁜 대기(busy

waiting) 대신에 블록됨

블록킹되는 IPC 프리미티브 (primitive)

Sleep () 시스템 호출

다른 프로세스가 깨울 때까지 호출자를 대기(block)시킴

Wakeup () 시스템 호출

매개변수로 지정한 프로세스를 깨움

Page 35: 제8 장. 병행 프로세스cfs2.tistory.com/upload_control/download.blog?fhandle...2005-04-06 운영체제 19 상호배제: 잠금변수(Lock variable) 잠금변수: 공유변수

20052005--0404--0606 운영체제운영체제 3535

생산자생산자--소비자소비자 문제문제 : : sleep & wakeupsleep & wakeup

Page 36: 제8 장. 병행 프로세스cfs2.tistory.com/upload_control/download.blog?fhandle...2005-04-06 운영체제 19 상호배제: 잠금변수(Lock variable) 잠금변수: 공유변수

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

Page 37: 제8 장. 병행 프로세스cfs2.tistory.com/upload_control/download.blog?fhandle...2005-04-06 운영체제 19 상호배제: 잠금변수(Lock variable) 잠금변수: 공유변수

20052005--0404--0606 운영체제운영체제 3737

생산자생산자--소비자소비자 문제문제

⇒ 생산자 프로세스가 버퍼를 모두 채운 후 sleep 상태가 되면

두 프로세스는 영원이 sleep 상태를 유지

문제의 본질

잠들지 않은 프로세스에게 보내진 wakeup 시그널이 분실됨

해결책 : 깨우기 대기 비트(wakeup waiting bit)의 추가

깨우기 대기 비트의 활용 형태

1) 깨어있는 프로세스에게 wakeup 시그널이 보내지면 해당 비트가

설정됨

2) 프로세스가 sleep 상태로 갈 때 깨우기 대기 비트가 설정되어 있으

면 해당 비트를 해제하고 프로세스는 여전히 깨어 있음

깨우기 대기 비트 : wakeup 시그널에 대한 돼지 저금통과 같음

Page 38: 제8 장. 병행 프로세스cfs2.tistory.com/upload_control/download.blog?fhandle...2005-04-06 운영체제 19 상호배제: 잠금변수(Lock variable) 잠금변수: 공유변수

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 개 프로세스간의 상호배제 문제 해결에 사용가능

Page 39: 제8 장. 병행 프로세스cfs2.tistory.com/upload_control/download.blog?fhandle...2005-04-06 운영체제 19 상호배제: 잠금변수(Lock variable) 잠금변수: 공유변수

20052005--0404--0606 운영체제운영체제 3939

철도용철도용 세마포어세마포어 신호기신호기

old

newmediumspeed

clearstop

Page 40: 제8 장. 병행 프로세스cfs2.tistory.com/upload_control/download.blog?fhandle...2005-04-06 운영체제 19 상호배제: 잠금변수(Lock variable) 잠금변수: 공유변수

20052005--0404--0606 운영체제운영체제 4040

22가지가지 유형의유형의 세마포어세마포어

이진 세마포어(Binary semaphore)

정수형 변수의 값은 0 또는 1만 가능

구현이 용이

계수형 세마포어(Counting semaphore)

정수형 변수의 값에는 제한이 없음

계수형 세마포어는 이진 세마포어를 이용하여 구현가능

Page 41: 제8 장. 병행 프로세스cfs2.tistory.com/upload_control/download.blog?fhandle...2005-04-06 운영체제 19 상호배제: 잠금변수(Lock variable) 잠금변수: 공유변수

20052005--0404--0606 운영체제운영체제 4141

임계구역임계구역 문제문제 : : 세마포어세마포어 이용이용

공유 변수

var mutex : semaphore ;

초기값 : mutex := 1;

Process Pi

repeat

wait (mutex);

critical section

signal (mutex);

remainder section

until false;

Page 42: 제8 장. 병행 프로세스cfs2.tistory.com/upload_control/download.blog?fhandle...2005-04-06 운영체제 19 상호배제: 잠금변수(Lock variable) 잠금변수: 공유변수

20052005--0404--0606 운영체제운영체제 4242

세마포어를세마포어를 이용한이용한 생산자생산자--소비자소비자 문제문제

세마포어의 용도

mutex : 상호 배제

full, empty : 동기화

세마포어의 용도

mutex : 상호 배제

full, empty : 동기화

Page 43: 제8 장. 병행 프로세스cfs2.tistory.com/upload_control/download.blog?fhandle...2005-04-06 운영체제 19 상호배제: 잠금변수(Lock variable) 잠금변수: 공유변수

20052005--0404--0606 운영체제운영체제 4343

세마포어세마포어 : : mutexmutex

세마포어의 카운트 기능이 필요없을 때 세마포어의 단순화

된 버전인 mutex를 사용

공유 자원이나 특정 부분의 코드에 대한 상호 배제에 유용

mutex의 2가지 상태

잠금 또는 풀림 (내부적으로 0은 풀림을 표시)

기본적인 mutex 호출

mutex_lock : 프로세스가 임계 구역에 진입할 때 호출

임계 구역 진입을 시도하는 다른 프로세스들은 블록됨

mutex_unlock : 프로세스가 임계 구역에서 나올 때 호출

Page 44: 제8 장. 병행 프로세스cfs2.tistory.com/upload_control/download.blog?fhandle...2005-04-06 운영체제 19 상호배제: 잠금변수(Lock variable) 잠금변수: 공유변수

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

Page 45: 제8 장. 병행 프로세스cfs2.tistory.com/upload_control/download.blog?fhandle...2005-04-06 운영체제 19 상호배제: 잠금변수(Lock variable) 잠금변수: 공유변수

20052005--0404--0606 운영체제운영체제 4545

세마포어세마포어 : : mutexmutex

mutex_lock과 enter_region 코드와의 차이점

mutex_lock : 임계구역 진입에 실패하면 블록됨

enter_region : 임계구역 진입에 실패하면 잠금을 반복해서 검사

바쁜 대기 (busy_waiting) 상태

추가된 mutex 호출 : mutex_trylock

스레드가 임계구역 진입에 실패하면 코드는 반환하지만 블록되

지 않음

⇒ 잠금 획득에 실패하면 블록되지 않고 다른 일을 할 수 있는 유

연성(flexibility)을 제공

Page 46: 제8 장. 병행 프로세스cfs2.tistory.com/upload_control/download.blog?fhandle...2005-04-06 운영체제 19 상호배제: 잠금변수(Lock variable) 잠금변수: 공유변수

20052005--0404--0606 운영체제운영체제 4646

세마포어의세마포어의 구현구현

계수형 세마포어

세마포어 : 큐 (or 리스트)를 갖는 구조체로 재정의

type semaphore = record

value : integer ;

L : list of process ;

end;

2가지 표준 연산(atomic operation)을 통해 세마포어에

접근 가능

wait & signal 연산은 atomic해야 하므로 임계 구역에서 실행

Page 47: 제8 장. 병행 프로세스cfs2.tistory.com/upload_control/download.blog?fhandle...2005-04-06 운영체제 19 상호배제: 잠금변수(Lock variable) 잠금변수: 공유변수

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;

Page 48: 제8 장. 병행 프로세스cfs2.tistory.com/upload_control/download.blog?fhandle...2005-04-06 운영체제 19 상호배제: 잠금변수(Lock variable) 잠금변수: 공유변수

20052005--0404--0606 운영체제운영체제 4848

세마포어세마포어 구현구현 ((계속계속))

세마포어 값의 의미

if S.value = 0

어떤 프로세스도 기다리지 있지 않음

if S.value < 0

프로세스가 블록되어 큐 (or 리스트)에서 기다리고 있음

|S.value| : 기다리고 있는 프로세스의 수

Page 49: 제8 장. 병행 프로세스cfs2.tistory.com/upload_control/download.blog?fhandle...2005-04-06 운영체제 19 상호배제: 잠금변수(Lock variable) 잠금변수: 공유변수

20052005--0404--0606 운영체제운영체제 4949

범용범용 동기화동기화 도구로서의도구로서의 세마포어세마포어

세마포어의 초기값 flag := 0

프로세스 Pi 의 A가 수행된 후 프로세스 Pj 의 B 가 수행됨

Code:

Pi Pj

… …A wait (flag)

signal (flag) B

Page 50: 제8 장. 병행 프로세스cfs2.tistory.com/upload_control/download.blog?fhandle...2005-04-06 운영체제 19 상호배제: 잠금변수(Lock variable) 잠금변수: 공유변수

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

Page 51: 제8 장. 병행 프로세스cfs2.tistory.com/upload_control/download.blog?fhandle...2005-04-06 운영체제 19 상호배제: 잠금변수(Lock variable) 잠금변수: 공유변수

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);

기아상태 : 무한 블록킹

특정 프로세스가 중단된 세마포어 큐에서 절대로 제거될 수 없는 상태

Page 52: 제8 장. 병행 프로세스cfs2.tistory.com/upload_control/download.blog?fhandle...2005-04-06 운영체제 19 상호배제: 잠금변수(Lock variable) 잠금변수: 공유변수

20052005--0404--0606 운영체제운영체제 5252

모니터모니터 ((Monitor)Monitor)

병행 프로세스간에 추상 데이터 유형(abstract data type)의 안

전한 공유를 허용하는 고수준의 동기화 구문

개념 제시 : Hoare, Brinch Hansen

다수의 병행 프로그래밍 언어에서 사용

Concurrent Pascal, Pascal-plus, Modula-2/3, uC++, Java 등

모니터는 세마포어를 이용하여 구현가능

모니터의 구성 요소

지역 변수, 하나 이상의 procedure, 초기화 문장

Page 53: 제8 장. 병행 프로세스cfs2.tistory.com/upload_control/download.blog?fhandle...2005-04-06 운영체제 19 상호배제: 잠금변수(Lock variable) 잠금변수: 공유변수

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

Page 54: 제8 장. 병행 프로세스cfs2.tistory.com/upload_control/download.blog?fhandle...2005-04-06 운영체제 19 상호배제: 잠금변수(Lock variable) 잠금변수: 공유변수

20052005--0404--0606 운영체제운영체제 5454

모니터모니터 ((계속계속))

상호 배제 보장

한번에 하나의 프로세스만 모니터내에 존재하도록 함

공유 데이터 보호를 위해 공유 데이터를 모니터내에 위치시킴

☞ 프로세스가 모니터에 진입할 때 공유 데이터에게 lock을 설정

조건 변수(condition variable)를 이용한 동기화

모니터를 호출한 프로세스는 조건이 만족될 때까지 중단됨

조건이 충족되고 모니터가 가용하면 프로세스가 수행을 재개하

고 모니터에 진입함

조건 변수 : 모니터에 대해 지역 변수

변수 선언 var x, y : condition ;

Page 55: 제8 장. 병행 프로세스cfs2.tistory.com/upload_control/download.blog?fhandle...2005-04-06 운영체제 19 상호배제: 잠금변수(Lock variable) 잠금변수: 공유변수

20052005--0404--0606 운영체제운영체제 5555

모니터모니터 ((계속계속))

wait 과 signal 연산을 통해 조건 변수에 접근 가능

x.wait 연산

x.wait을 호출하는 프로세스는 중단됨(suspend)

다른 프로세스가 모니터를 사용할 수 있음

x.signal 연산

wait을 호출한 후 중단된 프로세스들 중 하나의 수행을 재개

중단된 프로세스가 없으면 signal 연산은 아무 효과도 없음

Page 56: 제8 장. 병행 프로세스cfs2.tistory.com/upload_control/download.blog?fhandle...2005-04-06 운영체제 19 상호배제: 잠금변수(Lock variable) 잠금변수: 공유변수

20052005--0404--0606 운영체제운영체제 5656

조건조건 변수를변수를 갖는갖는 모니터모니터

Page 57: 제8 장. 병행 프로세스cfs2.tistory.com/upload_control/download.blog?fhandle...2005-04-06 운영체제 19 상호배제: 잠금변수(Lock variable) 잠금변수: 공유변수

20052005--0404--0606 운영체제운영체제 5757

모니터의모니터의 구조구조

모니터에는 한번에 하나의 실행 프로세스만 존재

대기 프로세스들은 진입 큐나 조건 변수 큐에 위치함

실행중인 프로세스는 x.wait 연산을 통해 일시적으로 중단된

후 조건 변수 x의 큐에 들어감

조건 변화시 재진입하기 위해 대기

x.signal 연산

실행중인 프로세스가 조건 변수의 변화를 탐지하면 signal 연산

수행

조건 변수 x의 큐에 위치한 하나의 프로세스를 모니터로 가져옴

호출 프로세스는 블록된 후 긴급 큐(urgent queue)에 위치함

Page 58: 제8 장. 병행 프로세스cfs2.tistory.com/upload_control/download.blog?fhandle...2005-04-06 운영체제 19 상호배제: 잠금변수(Lock variable) 잠금변수: 공유변수

20052005--0404--0606 운영체제운영체제 5858

모니터의모니터의 구조구조

condition x

x.wait

condition y

y.wait

signal

Page 59: 제8 장. 병행 프로세스cfs2.tistory.com/upload_control/download.blog?fhandle...2005-04-06 운영체제 19 상호배제: 잠금변수(Lock variable) 잠금변수: 공유변수

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;

Page 60: 제8 장. 병행 프로세스cfs2.tistory.com/upload_control/download.blog?fhandle...2005-04-06 운영체제 19 상호배제: 잠금변수(Lock variable) 잠금변수: 공유변수

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.

Page 61: 제8 장. 병행 프로세스cfs2.tistory.com/upload_control/download.blog?fhandle...2005-04-06 운영체제 19 상호배제: 잠금변수(Lock variable) 잠금변수: 공유변수

20052005--0404--0606 운영체제운영체제 6161

모니터모니터 메커니즘의메커니즘의 구현구현

세마포어를 이용한 모니터 메커니즘의 구현

모니터마다 세마포어 mutex (init = 1)를 제공

프로세스

모니터 진입 전에 wait (mutex) 연산 실행

모니터를 떠날 때 signal (mutex) 연산 실행

signal을 보내는 프로세스

수행이 재개된 프로세스가 떠나거나 대기할 때까지 기다림

signal을 보낸 프로세스는 수행이 중단됨

세마포어 next (init = 0)를 도입

변수 next-count

세마포어 next에서 중단된 프로세스 수

Page 62: 제8 장. 병행 프로세스cfs2.tistory.com/upload_control/download.blog?fhandle...2005-04-06 운영체제 19 상호배제: 잠금변수(Lock variable) 잠금변수: 공유변수

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) ;

모니터에서는 상호 배제가 보장됨

Page 63: 제8 장. 병행 프로세스cfs2.tistory.com/upload_control/download.blog?fhandle...2005-04-06 운영체제 19 상호배제: 잠금변수(Lock variable) 잠금변수: 공유변수

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 ;

Page 64: 제8 장. 병행 프로세스cfs2.tistory.com/upload_control/download.blog?fhandle...2005-04-06 운영체제 19 상호배제: 잠금변수(Lock variable) 잠금변수: 공유변수

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;

Page 65: 제8 장. 병행 프로세스cfs2.tistory.com/upload_control/download.blog?fhandle...2005-04-06 운영체제 19 상호배제: 잠금변수(Lock variable) 잠금변수: 공유변수

20052005--0404--0606 운영체제운영체제 6565

모니터모니터 메커니즘메커니즘 구현구현 : : 조건부조건부 대기구문대기구문

다수의 프로세스가 조건 변수 x에서 중단되어 있고 임의의 프

로세스가 x.signal 연산을 실행할 때 중단된 프로세스들의 실

행 재개 순서 결정

단순 해결책 : 선입선출(FIFO) 기법 사용

개선책 : 조건부 대기 구문 사용

조건부 대기 구문 (conditional wait construct)형식 : x.wait (c)

c : 정수형 수식으로 우선순위 값

중단된 프로세스에게 우선순위 값으로 c 를 부여함

x.signal 연산 실행시 c 값이 최소인 프로세스가 실행 재개

Page 66: 제8 장. 병행 프로세스cfs2.tistory.com/upload_control/download.blog?fhandle...2005-04-06 운영체제 19 상호배제: 잠금변수(Lock variable) 잠금변수: 공유변수

20052005--0404--0606 운영체제운영체제 6666

모니터모니터 메커니즘메커니즘 구현구현 : : 조건부조건부 대기구문대기구문

조건부 대기 구문 사용 예 : 단일 자원 할당 모니터

다수의 프로세스들에 대해 단일 자원의 할당을 제어

프로세스가 자원 할당을 요구할 때 최대 자원사용 예상시간을

명시

모니터의 자원 할당 정책

가장 짧은 시간동안 자원을 사용할 프로세스에게 할당

프로세스의 자원 요청 및 반환

R.acquire (t)…..

access the resource;…..

R.release

Page 67: 제8 장. 병행 프로세스cfs2.tistory.com/upload_control/download.blog?fhandle...2005-04-06 운영체제 19 상호배제: 잠금변수(Lock variable) 잠금변수: 공유변수

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.

Page 68: 제8 장. 병행 프로세스cfs2.tistory.com/upload_control/download.blog?fhandle...2005-04-06 운영체제 19 상호배제: 잠금변수(Lock variable) 잠금변수: 공유변수

20052005--0404--0606 운영체제운영체제 6868

메시지메시지 전달전달 ((Message Passing)Message Passing)

프로세스간 통신(IPC)의 종류

단일 시스템에서의 프로세스간 통신

분산 시스템에서의 프로세스간 통신

프로세스 동기화와 상호 배제 기능을 제공하는 새로운

방법으로 메시지 전달 기법을 사용

최소 2가지 primitive가 필요

send (destination, &message)

receive (source, &message)

Page 69: 제8 장. 병행 프로세스cfs2.tistory.com/upload_control/download.blog?fhandle...2005-04-06 운영체제 19 상호배제: 잠금변수(Lock variable) 잠금변수: 공유변수

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

Page 70: 제8 장. 병행 프로세스cfs2.tistory.com/upload_control/download.blog?fhandle...2005-04-06 운영체제 19 상호배제: 잠금변수(Lock variable) 잠금변수: 공유변수

20052005--0404--0606 운영체제운영체제 7070

메시지메시지 전달시전달시 동기화동기화

송신측이 send() 명령을 내린 후 Block되지 않는 경우

메시지를 다중 목적지로 전송할 수 있음

송신측이 메시지 수신 여부의 확인을 요구

수신측에 문제 발생 상황을 고려

수신측이 receive() 명령을 내린 후 Block되는 경우

수신측은 진행에 앞서 데이터를 필요로 함

데이터 수신 후 진행

문제점

송신측에서 send() 명령을 실행하기 전에 문제가 생기면 수신측

이 영원히 Block될 수 있음

Page 71: 제8 장. 병행 프로세스cfs2.tistory.com/upload_control/download.blog?fhandle...2005-04-06 운영체제 19 상호배제: 잠금변수(Lock variable) 잠금변수: 공유변수

20052005--0404--0606 운영체제운영체제 7171

메시지메시지 전달시전달시 동기화동기화

해결책 : blocking send, blocking receive 메시지를 수신할 때까지 양쪽이 모두 Block됨

통신 링크가 unbuffered일 때 가능한 방식

메시지 큐를 사용하지 않음

엄격한 동기화 기능 (예 : rendezvous) 제공

Page 72: 제8 장. 병행 프로세스cfs2.tistory.com/upload_control/download.blog?fhandle...2005-04-06 운영체제 19 상호배제: 잠금변수(Lock variable) 잠금변수: 공유변수

20052005--0404--0606 운영체제운영체제 7272

메시지메시지 전달시전달시 주소지정주소지정 방식방식

직접 주소지정 (direct addressing)

출발지와 목적지를 나타내기 위해 프로세스 ID를 사용

단점 : 출발지를 미리 명시할 수 없는 경우에는 부적합

예) 프린터/서버 프로세스 : 임의의 프로세스로부터 메시지 수신

간접 주소 지정 (indirect addressing) : 보다 편리함

메시지를 공유 메일박스로 전송

공유 메일박스 : 메시지 큐로 구성

송신측 : 메일박스로 메시지를 전송

수신측 : 메일박스에서 메시지를 가져감

Page 73: 제8 장. 병행 프로세스cfs2.tistory.com/upload_control/download.blog?fhandle...2005-04-06 운영체제 19 상호배제: 잠금변수(Lock variable) 잠금변수: 공유변수

20052005--0404--0606 운영체제운영체제 7373

메일박스메일박스((mailbox)mailbox)와와 포트포트((port)port)

메일박스

한 쌍의 송•수신자가 존재

다수의 송•수신자간에 공유 가능

포트

하나의 수신자와 다수의 송신자가

연계된 메일박스

클라이언트-서버 응용에 사용

수신자 : 서버

Page 74: 제8 장. 병행 프로세스cfs2.tistory.com/upload_control/download.blog?fhandle...2005-04-06 운영체제 19 상호배제: 잠금변수(Lock variable) 잠금변수: 공유변수

20052005--0404--0606 운영체제운영체제 7474

메일박스와메일박스와 포트의포트의 소유권소유권

메일박스

운영체제가 생성하고 프로세스가 소유권을 가짐

소유자가 요청하거나 소유자가 종료되면 메일박스도 소멸됨

포트

수신자 프로세스가 생성하고 소유함

수신자가 종료되면 port가 소멸됨

Page 75: 제8 장. 병행 프로세스cfs2.tistory.com/upload_control/download.blog?fhandle...2005-04-06 운영체제 19 상호배제: 잠금변수(Lock variable) 잠금변수: 공유변수

20052005--0404--0606 운영체제운영체제 7575

메시지메시지 형식형식 ((Message Format)Message Format)

메시지 : 메시지 헤더와 몸체로 구성

유닉스

ID는 없고 메시지 유형만 존재

제어 정보

버퍼 공간이 없을 때 조치 방법 기술

메시지 번호 (sequence number)

우선순위 등

큐잉 정책

일반적으로 FIFO 기법 사용

우선순위 정책의 적용도 가능

Page 76: 제8 장. 병행 프로세스cfs2.tistory.com/upload_control/download.blog?fhandle...2005-04-06 운영체제 19 상호배제: 잠금변수(Lock variable) 잠금변수: 공유변수

20052005--0404--0606 운영체제운영체제 7676

메시지메시지 전달전달 기법을기법을 이용한이용한 상호상호 배제배제

메시지 전달 기법을 이용한 상호 배제

n 개의 프로세스가 메일박스 mutex를 공유

send() : Non-Blocking 방식

receive() : mutex가 empty일 때 block됨

메일 박스의 초기화 : null 메시지 1개를 보유함

동작 방식

1) 임계 구역에 진입하려는 프로세스는 메시지 수신을 시도

2) 메일박스가 비어 있을 때 프로세스는 block됨

3) 메시지 수신 후 임계 구역에 진입한 프로세스는 임계 구역을

나올 때 메시지를 메일박스에 다시 놓아둠

메시지는 프로세스간에 전달되는 토큰(token)처럼 사용됨

Page 77: 제8 장. 병행 프로세스cfs2.tistory.com/upload_control/download.blog?fhandle...2005-04-06 운영체제 19 상호배제: 잠금변수(Lock variable) 잠금변수: 공유변수

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;

Page 78: 제8 장. 병행 프로세스cfs2.tistory.com/upload_control/download.blog?fhandle...2005-04-06 운영체제 19 상호배제: 잠금변수(Lock variable) 잠금변수: 공유변수

20052005--0404--0606 운영체제운영체제 7878

메시지메시지 전달을전달을 이용한이용한 한계버퍼한계버퍼 문제문제 해법해법

2개의 메일박스 사용

생산자 : 데이터 생성 후 메일박스 mayconsume에 전송

소비자 : 메일박스 mayconsume에서 데이터를 수신

메일박스 mayconsume버퍼처럼 동작

버퍼내의 데이터는 메시지 큐로 관리됨

버퍼의 크기 : 변수 capacity로 정의

메일박스 mayproduce초기화 : 버퍼 크기만큼 null message로 채움

데이터 생산시 크기 감소, 데이터 소비시 크기 증가

다수의 생산자-소비자 프로세스 지원가능

Page 79: 제8 장. 병행 프로세스cfs2.tistory.com/upload_control/download.blog?fhandle...2005-04-06 운영체제 19 상호배제: 잠금변수(Lock variable) 잠금변수: 공유변수

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;

Page 80: 제8 장. 병행 프로세스cfs2.tistory.com/upload_control/download.blog?fhandle...2005-04-06 운영체제 19 상호배제: 잠금변수(Lock variable) 잠금변수: 공유변수

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

Page 81: 제8 장. 병행 프로세스cfs2.tistory.com/upload_control/download.blog?fhandle...2005-04-06 운영체제 19 상호배제: 잠금변수(Lock variable) 잠금변수: 공유변수

20052005--0404--0606 운영체제운영체제 8181

배리어배리어 ((Barrier)Barrier)

배리어

프로세스 그룹에 대한 동기화 메카니즘

배리어의 동작 방식

일부 응용은 다수의 실행 단계(step)로 나누어짐

각 실행 단계의 끝에 배리어를 위치시킴

모든 프로세스들이 다음 단계로 진행할 준비가 될 때까지 어떤

프로세스도 다음 단계로 진행하지 못함

임의의 프로세스가 배리어에 먼저 도착하면 모든 프로세스가

배리어에 도착할 때까지 block됨

각 프로세스는 배리어에 도착하면 barrier primitive를 실행

모든 프로세스가 배리어에 도착하면 다음 실행 단계로 이동

Page 82: 제8 장. 병행 프로세스cfs2.tistory.com/upload_control/download.blog?fhandle...2005-04-06 운영체제 19 상호배제: 잠금변수(Lock variable) 잠금변수: 공유변수

20052005--0404--0606 운영체제운영체제 8282

배리어배리어 ((Barrier)Barrier)

배리어의 사용 예

Page 83: 제8 장. 병행 프로세스cfs2.tistory.com/upload_control/download.blog?fhandle...2005-04-06 운영체제 19 상호배제: 잠금변수(Lock variable) 잠금변수: 공유변수

20052005--0404--0606 운영체제운영체제 8383

제제 2 2 절절. . 고전적인고전적인 IPC IPC 문제들문제들

Page 84: 제8 장. 병행 프로세스cfs2.tistory.com/upload_control/download.blog?fhandle...2005-04-06 운영체제 19 상호배제: 잠금변수(Lock variable) 잠금변수: 공유변수

20052005--0404--0606 운영체제운영체제 8484

고전적인고전적인 동기화동기화 문제들문제들

식사하는 철학자 문제(Dining-Philosophers Problem)

판독자-기록자 문제(Readers-Writers Problem)

잠자는 이발사 문제 (Sleeping Barber Problem)

Page 85: 제8 장. 병행 프로세스cfs2.tistory.com/upload_control/download.blog?fhandle...2005-04-06 운영체제 19 상호배제: 잠금변수(Lock variable) 잠금변수: 공유변수

20052005--0404--0606 운영체제운영체제 8585

식사하는식사하는 철학자철학자 문제문제

제한된 수의 자원을 배타적으로 사용하려고 경쟁하는 프

로세스들을 모델링하는데 유용

철학자들의 행동 : 생각하고 식사만 함

둥근 탁자와 5개의 젓가락(or 포크)을 공유

식사를 하려면 2개의 젓가락(or 포크)이 필요함

한번에 하나의 젓가락만 집을 수 있음

배가 고프면 젓가락을 하나씩 집어 식사하고 제자리에 놓음

요구사항

교착상태가 발생하지 않는 해법을 제시할 것

Page 86: 제8 장. 병행 프로세스cfs2.tistory.com/upload_control/download.blog?fhandle...2005-04-06 운영체제 19 상호배제: 잠금변수(Lock variable) 잠금변수: 공유변수

20052005--0404--0606 운영체제운영체제 8686

식사하는식사하는 철학자철학자 문제문제

문제 상황

or

Page 87: 제8 장. 병행 프로세스cfs2.tistory.com/upload_control/download.blog?fhandle...2005-04-06 운영체제 19 상호배제: 잠금변수(Lock variable) 잠금변수: 공유변수

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;

Page 88: 제8 장. 병행 프로세스cfs2.tistory.com/upload_control/download.blog?fhandle...2005-04-06 운영체제 19 상호배제: 잠금변수(Lock variable) 잠금변수: 공유변수

20052005--0404--0606 운영체제운영체제 8888

식사하는식사하는 철학자철학자 문제문제 : : 해법해법 1 1

Page 89: 제8 장. 병행 프로세스cfs2.tistory.com/upload_control/download.blog?fhandle...2005-04-06 운영체제 19 상호배제: 잠금변수(Lock variable) 잠금변수: 공유변수

20052005--0404--0606 운영체제운영체제 8989

식사하는식사하는 철학자철학자 문제문제 : : 해법해법 11

문제점 : 교착상태 야기

교착 상태 : 환형 대기(Circular waiting)

모든 철학자들이 동시에 왼쪽 젓가락을 들고 오른쪽 젓가

락을 집기 위해 기다리는 상황

교착 상태 제거 방법들

4명에게만 젓가락을 집을 수 있도록 허용

젓가락 2개를 다 집을 수 있을 때만 젓가락을 집도록 허용

비대칭적 해법 (홀수 – 오른쪽 먼저, 짝수 – 왼쪽 먼저)

Page 90: 제8 장. 병행 프로세스cfs2.tistory.com/upload_control/download.blog?fhandle...2005-04-06 운영체제 19 상호배제: 잠금변수(Lock variable) 잠금변수: 공유변수

20052005--0404--0606 운영체제운영체제 9090

식사하는식사하는 철학자철학자 문제문제 : : 개선안개선안

개선안 11) 왼쪽 젓가락을 집은 후 오른쪽 젓가락을 집을 수 있는지 검사

2) 오른쪽 젓가락을 집지 못하면 왼쪽 젓가락을 내려 놓고 잠시 기

다린 후 다시 처음부터 시도

동일한 작업이 반복되면 해당 프로세스는 전혀 식사를 하지 못하게 됨 ⇒ 기아상태 (starvation) 유발

개선안 2 : random 대기 시간 이용

오른쪽 젓가락을 집지 못하면 상이한 시간동안 기다린 후 다시

시도

예) Ethernet 망에서 패킷 충돌시 random 시간동안 대기후 재시도

Page 91: 제8 장. 병행 프로세스cfs2.tistory.com/upload_control/download.blog?fhandle...2005-04-06 운영체제 19 상호배제: 잠금변수(Lock variable) 잠금변수: 공유변수

20052005--0404--0606 운영체제운영체제 9191

식사하는식사하는 철학자철학자 문제문제 : : 해법해법 22

교착상태와 기아상태가 없는 해법

Page 92: 제8 장. 병행 프로세스cfs2.tistory.com/upload_control/download.blog?fhandle...2005-04-06 운영체제 19 상호배제: 잠금변수(Lock variable) 잠금변수: 공유변수

20052005--0404--0606 운영체제운영체제 9292

식사하는식사하는 철학자철학자 문제문제 : : 해법해법 22

Page 93: 제8 장. 병행 프로세스cfs2.tistory.com/upload_control/download.blog?fhandle...2005-04-06 운영체제 19 상호배제: 잠금변수(Lock variable) 잠금변수: 공유변수

20052005--0404--0606 운영체제운영체제 9393

판독자판독자--기록자기록자 문제문제

문제 상황

파일 등의 데이터는 다수의 병행 프로세스들간에 공유됨

일부 프로세스는 공유 데이터의 내용을 읽고, 어떤 프로세스

들은 공유 데이터를 갱신함

예) 데이터베이스 시스템

판독자(reader) 프로세스 : DB를 읽기만 하는 프로세스

기록자(writer) 프로세스 : DB를 갱신하는 프로세스

요구사항

2개 이상의 판독자 프로세스의 동시 접근은 허용

판독자 프로세스와 기록자 프로세스의 동시 접근은 불허

2개 이상의 기록자 프로세스의 동시 접근도 불허

Page 94: 제8 장. 병행 프로세스cfs2.tistory.com/upload_control/download.blog?fhandle...2005-04-06 운영체제 19 상호배제: 잠금변수(Lock variable) 잠금변수: 공유변수

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;

Page 95: 제8 장. 병행 프로세스cfs2.tistory.com/upload_control/download.blog?fhandle...2005-04-06 운영체제 19 상호배제: 잠금변수(Lock variable) 잠금변수: 공유변수

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;

Page 96: 제8 장. 병행 프로세스cfs2.tistory.com/upload_control/download.blog?fhandle...2005-04-06 운영체제 19 상호배제: 잠금변수(Lock variable) 잠금변수: 공유변수

20052005--0404--0606 운영체제운영체제 9696

잠자는잠자는 이발사이발사 문제문제

문제 상황

이발사 : 1명, 이발용 의자 : 1개, 대기용 의자 : n개

이발사는 손님이 없으면 수면 상태가 됨

손님이 오면 이발사가 깨어남

이발하는 동안 도착한 손님은 대기용 의자가 비어 있으면 앉

아서 기다리고, 그렇지 않으면 이발소를 떠남

요구사항

이발사와 손님이 경쟁조건에 빠지지 않도록 함

해결방법 : 3개의 세마포어를 이용

customers, barbers, mutex

Page 97: 제8 장. 병행 프로세스cfs2.tistory.com/upload_control/download.blog?fhandle...2005-04-06 운영체제 19 상호배제: 잠금변수(Lock variable) 잠금변수: 공유변수

20052005--0404--0606 운영체제운영체제 9797

잠자는잠자는 이발사이발사 문제문제

Page 98: 제8 장. 병행 프로세스cfs2.tistory.com/upload_control/download.blog?fhandle...2005-04-06 운영체제 19 상호배제: 잠금변수(Lock variable) 잠금변수: 공유변수

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) */

}}

Page 99: 제8 장. 병행 프로세스cfs2.tistory.com/upload_control/download.blog?fhandle...2005-04-06 운영체제 19 상호배제: 잠금변수(Lock variable) 잠금변수: 공유변수

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 */

}}