2020. 7. 1. 14:38ㆍSystem/Beginner
본 글은 Youtube ‘HPC Lab. KOREATECH’의 "[Course] Operating System (CPA310)-운영체제 강의" 의 ppt 내용을 요약한 정리본 입니다.
강의 Instructor: Duksu Kim
Chapter4. 프로세스 동기화 & 상호배제
(Process Synchronization and Mutual Exclusion)
(1) Process Synchronization
다중 프로그램링 시스템: 여러 개의 프로세스들이 존재
프로세스들은 서로 독립적으로 동작
공유 자원 또는 데이터가 있을 때, 문제 발생 가능
동기화: 프로세스 들이 서로 정보를 공유하여 동작을 맞추는 것
병행 수행중인 비동기적 프로세스들이 공유 자원에 동시 접근할 때 문제가 발생할 수 있음.
Shared data(= Critical data)
Critical section(임계 영역): 공유 데이터를 접근하는 코드 영역(code segment)
Mutual exclusion(상호배제): 둘 이상의 프로세스가 동시에 critical section에 진입하는 것을 막는 것.
1) Mutual exclusion mehtods
- Mutual exclusion primitives: enterCS() primitive, exitCS() primitive
2) Mutual Exclusion Solutions
- SW solutions:
- Dekker's algorithm(Peterson's algorithm):
- Dijkstra's algorithm, knuth's algorithm, Eisenberg and McGuire's algorithm, Lamport's algorithm
- HW solutions:
- TestAndSet(TAS) instructino
- OS supported SW solution
- Spinlock
- Semaphore
- Eventcount/wequencer
- Language-Level solution
- Monitor
1. Dekker's alogirhtm
Two process ME을 보장하는 최초의 알고리즘
2. Dijkstra's Alogirhtm
flag[]값 | 의미
idle 프로세스가 임계 지역 진입을 시도하고 있지 않을 때
want-in 프로세스의 임계 지역 진입 시도 1단계일 때
in-CS 프로세스의 임계 지역 진입 시도 2단계 및 임계 지역 내에 있을 때
3. SW Solution들의 문제점
속도가 느림
구현이 복잡함
ME primitive 실행 중 preemption 될 수 있음
busy waiting, Inefficient
---------------------------------------------------------------------
4. TAS instruction(TestAndSet)
Test와 Set을 한번에 수행하는 기계어
Target값을 반환하면서, Target값을 True로 변환.
Machine instruction --> 실행 중 interrupt를 받지 않음(preemption 되지 않음)
Busy waiting --> inefficient
HW solution의 장점: 구현이 간단
단점: Busy waiting-->Inefficient
Busy waiting 문제를 해소한 상호배제 기법 --> Semaphore 대부분의 OS들이 사용하는 기법
3개 이상의 프로세스의 경우, Bounded Waiting 조건 위배 --> 한 프로세서가 Critical Section에 못 들어갈 수도 있음.
- N-process mutual exclusion
5. Os supported SW solution
- Spinlock:
- 정수형 변수 S
- 초기화, P()(물건 꺼내가, 자물쇠 걸어 --> 물건이 없으면 뺑뺑돌면서 기다려), V()(물건 반납, 자물쇠 풀어) 연산으로만 접근 가능
- 위 연산들은 indivisible(or atomic) 연산
- OS support --> 보장
- 전체가 한 instruction cycle에 수행 됨.
- 위 연산들은 indivisible(or atomic) 연산
init active =1; --> 임계 지역을 실행중인 프로세스 없음. 0이면 있음.
P(active); 자물쇠 걸어-->P연산은 중간에 preemptive 되지 않고 끝까지 수행됨을 보장하기 때문에, 동시에 들어가거나 아무도 못들어가는 문제 발생하지 않음.
Critical Section
V(active); 자물쇠 풀어.
문제:
- 멀티 프로세서 시스템에서만 사용 가능
- Busy waiting!
- Semaphore (s)
- 1965년 Dijkstra가 제안
- Busy waiting 문제 해결
- 음이 아닌 정수형 변수(s)
- 초기화 연산, P(), V()로만 접근 가능
- P: Probern(검사)
- V: Verhogen(증가)
- 임의의 s 변수 하나에 ready queue 하나가 할당 됨.
- 초기화 연산, P(), V()로만 접근 가능
- Binary semaphore
- s가 0과 1 두 종류의 값만 갖는 경우
- 상호배제나 프로세스 동기화의 목적으로 사용
- counting semaphore
- S가 0이상의 정수값을 가질 수 있는 경우
- Producer-Consumer 문제 등을 해결하기 위해 사용
- 생산자-소비자 문제
- 초기화 연산
- s 변수에 초기값을 부여하는 연산
- P()연산, V()연산
- P(s) --> 자물쇠 거는, 물건을 꺼내가는
- if(S>0) then S<-S-1; else(물건이 없을 때) wait on the queue Q_s;
- V(s) -->자물쇠를 푸는 연산
- if(exist waiting processes on Q_s) then wakeup one of them; else(기다리는 애가 없으면 물건을 하나 돌려놓고 나가) S<-S+1;
- P(s) --> 자물쇠 거는, 물건을 꺼내가는
- 모두 indivisible 연산
- OS support (보장!)
- 전체가 한 instruction cycle에 수행 됨
- Semaphore로 해결 가능한 동기화 문제들
- 상호배제 문제(Mutual exclusion) --> ready queue(대기실)
- 프로세스 동기화 문제(Process synchronization problem)
- process들의 실행 순서 맞추기. 프로세스들은 병행적이며, 비동기적으로 수행
- 생산자-소비자 문제(Producer-consumer problem)
- Producer-Consumer problem with single buffer
- Producer - P(consumed);V(produced); // Consumer - P(produced);V(consumed);
- Producer-Consumer problem with N-buffers
- circular queue가정 like container belt
- Producer - P(mutexP); P(nrempty); V(nrfull); V(mutexP); //Consumer - P(mutexC); P(nrfull); V(nrempty); V(mutexC);
- Producer-Consumer problem with single buffer
- Reader-Writer 문제
- Reader: 데이터에 대해 읽기 연산만 수행(여러 명 가능)
- Writer: 데이터에 대해 갱신 연산을 수행(한 명만)
- 데이터 무결성 보장 필요
- Reader들은 동시에 데이터 접근 가능
- Writer들(또는 ㄱeader와 write)이 동시 데이터 접근 시, 상호배제(동기화) 필요
- 해결법
- reader/ writer에 대한 우선권 부여
- reader preference solution
- writer preference solution
- reader/ writer에 대한 우선권 부여
- Dining philosopher problem
- 기타
- No busy waiting: 기다려야하는 프로세스는 block(asleep)상태가 됨
- Semaphore queue에 대한 wake-up 순서는 비결정적: starvation problem
- Eventcount/Sequencer
- wake-up 순서 정하기
- 은행의 번호표와 비슷한 개념
- Sequencer:
- 정수형 변수
- 생성시 0으로 초기화, 감소하지 않음
- 발생 사건들의 순서 유지
- ticket() 연산으로만 접근 가능
- Ticket(S)
- 현재까지 ticket() 연산이 호출 된 횟수를 반환
- indivisible operation
- Eventcount
- 정수형 변수
- 생성시 0으로 초기화, 감소하지 않음
- 특정 사건의 발생 횟수를 기록
- read(E), advance(E), await(E, v)연산으로만 접근 가능
- read(E): 현재 Eventcount 값 변환
- advance(E): E<-E+1, E를 기다리고 있는 프로세스를 깨움(wake-up)
- await(E,v): V는 정수형 변수, if(E<v)이면 E에 연결된 Q_E에 프로세스 전달(push) 및 CPU scheduler 호출
- No busy waiting
- No starvation (FIFO scheduling for Q_E)
- Semaphore 보다 더 low-level control이 가능
6. Language-Level solution (High-level Mechanism)
- Monitor
- Object-Oriented concept과 유사, 사용이 쉬움
- 공유 데이터와 Critical section의 집합
- Conditional variable: wait(), signal() operation
(1) Monitor의 구조
- Entry queue(진입 큐): 모니터 내의 procedure(function) 수만큼 존재
- Mutual exclusion: 모니터 내에는 항상 하나의 프로세스만 진입 가능
- Information hiding(정보 은폐): 공유 데이터는 모니터 내의 프로세스만 접근 가능
- Condition queue(조건 큐): 모니터 내의 특정 이벤트를 기다리는 프로세스가 대기
- Signaler queue(신호제공자 큐): 모니터에 항상 하나의 신호제공자 큐가 존재, signal() 명령을 실행한 프로세스가 임시 대기
'System > Beginner' 카테고리의 다른 글
가장 빨리 만나는 Docker 챕터 tutorial (0) | 2020.07.14 |
---|---|
리눅스 커널(운영체제) 도움 사이트 링크 (0) | 2020.07.10 |
Docker 설명 사이트 (0) | 2020.07.09 |
운영체제 정리(3) (0) | 2020.07.06 |
운영체제 정리 (0) | 2020.06.30 |