CS/운영체제
Chapter 5: 병행 프로세스와 동기화
GaeunLee
2022. 5. 3. 15:28
5.1 병행 프로세스
- 병행(concurrent): 메모리에 다수의 프로세스가 같이 존재한다는 것
- 처리기(CPU)의 개수 상관 X
- 논리적 concurrent - 단일 처리 (실제로는 parallel 아님)
- 물리적 concurrent - 다중 처리(진정한 parallel)
- 병렬(Parallel): 다중처리 시스템의 경우 여러개의 프로세스가 동시에 병렬로 실행
- 병행(concurrent)전제
💡 병행 프로세스 사이의 비동기적(Asynchronous)
다른 프로세스들이 어떤 상태에 있는지, 어떤 자원을 가지고 있는지, 어디까지 실행됐는지 전혀 모름. 독립적이다.
- 병행 프로세스 사이의 Rule: 공유된 자원에 대해 한 번에 한 프로세스만이 접근하도록 하고, 해당 자원에 대해 의도했던 실행을 완료하도록 보장
5.2 상호배제
- 경쟁 상태(Race Condition): 프로세스들이 공유데이터에 서로 접근을 시도하는 상황
- 상호배제(Mutual Exclusion): 한 번에 하나의 프로세스만이 임계영역에 들어가야 함
- 교착상태(Deadlock): 프로세스가 자원을 얻지 못해 다음 처리를 하지 못하는 상태
- 라이브락(Livelock): 두 프로세스의 속도가 고묘히 맞물렸을 때 둘 다 임계영역에 진입하지 못하는 현상
- 기아(Starvation)
- 임계영역(Critical Section): 두 개 이상의 프로세스가 동시에 사용할 수 없는 자원에 접근하는 코드 부분
임계영역 앞뒤에 적절하게 코딩을 하면 상호배제 성공- enter primitive: 임계영역 앞
- exit primitive: 임계영역 뒤
5.3 상호배제를 위한 소프트웨어 기법들
- parbegin/ parend ⇒ parallel begin parallel end
- 단일 처리: 각 문장의 수행 순서를 임의로 진행(순서가 상관 없음)
- 다중 처리: 각 문장을 병렬로 실행
- 미완성 시도
- 첫 번째 시도
- 임계 영역의 첫번째 진입의 고정 (임계영역이 비어있을 때 진입을 원하는 프로세스를 방해해서는 안된다는 원칙을 어김)
- 번갈아가며 진입이 가능 (누구든 연속해서 두번이상 진입할 수 없다)
- 실행속도가 느린 프로세스의 속도에 의존적임
- 두 번째 시도
- while문과 flag문 사이에 들어가면 둘다 critical section에 접근 가능 (상호배제 어김)
- 세 번째 시도
- while문과 flag문 사이에 들어가면 둘다 critical section에 접근 못함 (상호배제 어김)
- 첫 번째 시도
- 성공적인 기법
- Petorson의 알고리즘: 프로세스 2개 사이의 해결
void P0() {
while (true) {
flag[0] = true;
turn = 1;
while (flag[1] && turn == 1);
<critical section>
flag[0] = false;
<remainder>
}
}
- Bakery 알고리즘(Lamport의 알고리즘): n개의 프로세스 사이의 해결
do {
choosing[i] = true;
number[i] = max(number[0], number[1], ..., number[n-1])+1;
// 넘버 값을 순서대로 부여
choosing[i] = false;
for (j=0;j<n;j++) {
while(choosing[j]); //true면 num받는 중, false면 num받았거나 시도X
while((number[j]!=0) && ((number[j],j) < (number[i],i));
//j가 끝나지 않았고, j가 i보다 작으면 busy waiting
<critical section> // num[j]가 0이거나 j가 크면 접근가능
number[i]=0; //들어간 사람만 들어가는 것을 방지하기 위해서
// -> exit primitive
<remainder>;
} while(1);
- 번호 값에 의해 차례가 결정되므로 특정 프로세스의 무한대기는 걱정하지 않아도 된다.
- 그러나 busy wait로 낭비가능성있다.
5.4 상호배제를 위한 하드웨어 기법들
- 인터럽트 금지를 사용한 기법
- 인터럽트를 임계영역의 실행을 완료할 때까지 발생하지 않도록 한다
- 단점
- 시스템의 효율적인 운영을 방해하기 쉽다
- 다중처리 시스템에서 다른 처리기에서 실행되는 프로세스로부터의 접근가능성
- 하드웨어 명령어를 사용한 기법
- tetandset 명령어
boolean testandset(boolean &target) { boolean rv = target; target = true; //setting return rv; }
- exchange 명령어
void exchange(boolean &r, boolean &m) { boolean temp = r; r = m; m = temp; }
- testandset과 exchange를 사용한 상호배제
5.5 세마포어
- 세마포어(semaphore): 세 개의 특수한 명령들만 접근할 수 있게 허용되는 보호된 변수
- P 명령
- V 명령
- 세마포어를 사용해서 해결할 수 있는 문제들
- mutual exclusion(상호배제)
- 공유자원의 풀(Pool)관리
- syncronization(동기화)
5.6 생산자-소비자 문제
- 무한 버퍼용 알고리즘의 경우
5.7 Eventcount 와 Sequencer을 사용한 기법
- Eventcount/ Sequencer: 특별한 명령들에 의해서만 접근이 가능한 정수형 변수
- ticket(s)
- read(E)
- advance(E)
- await(E,v)
- 임계영역의 진입을 시도하는 프로세스들에게 순번 표를 부여함으로써 기다린 순서대로 처리되게 하여 기아를 방지한다.
5.8 모니터
- 모니터(monitor): 공유데이터들과 이들에 대한 임계영역들을 관리하는 소프트웨어 구성체
모니터 내의 변수들은 프로시저들을 통해서만 접근이 가능- 진입은 프로시저의 호출로 가능// 진입큐의 개수는 모니터 안의 프로시저의 수
- 호출될 프로시저 개수만큼 대기큐 있어야함
- 조건큐도 조건의 개수만큼 있어야함
- 신호자 대기 큐 있어야함
- 상호배제(mutual exclusion)지키기
모니터의 진입을 한 프로세스로 제한함으로 한번에 하나의 프로세스만이 모니터 내에 있게함
- 스풀링(Spooling)
- spooler: 보조기억장치에 빠른 속도로 출력을 하는 일반적인 프로세스
- de-spooler: 디스크에 임시로 출력된 내용을 실제로 프린터로 출력하는 프로세스
Dinning Philosopher
- 한번에 포크를 두개 집으면 교착상태가 된다.