프로그래밍/운영체제(OS)
[KOCW] 반효경 운영체제 강의 정리 - 6. Process Synchronization 1
병인
2022. 5. 13. 00:27
데이터의 접근
Race Condition
OS에서의 race condition (1/3)
- OS에서 race condition이 발생하는 경우
- kernel 수행 중 인터럽트 발생 시
- Process가 system call을 하여 kernel mode로 수행 중인데 context switch가 일어나는 경우
- Multiprocessor에서 shared memory 내의 kernel data
OS에서의 race condition (2/3)
OS에서의 race condition (3/3)
- multiprocessor
Process Syynchronization 문제
- 공유 데이터(shared data)의 동시 접근(concurrent access)은 데이터의 불일치 문제(Inconsistency)를 발생시킬 수 있다.
- 일관성(consistency) 유지를 위해서는 협력 프로세스(cooperating process) 간의 실행 순서(orderly execution)를 정해주는 매커니즘 필요
- Race condition
- 여러 프로세스들이 동시에 공유 데이터를 접근하는 상황
- 데이터의 최종 연산 결과는 마지막에 그 데이터를 다룬 프로세스에 따라 달라짐
- race condition을 막기 위해서는 concurrent process는 동기화(synchronize) 되어야 한다.
The Critical-Section Problem
- n개의 프로세스가 공유 데이터를 동시에 사용하기를 원하는 경우
- 각 프로세스의 code segment에는 공유 데이터를 접근하는 코드인 critical section이 존재
- Problem
- 하나의 프로세스가 critical section에 있을 때 다른 모든 프로세스는 critical section에 들어갈 수 없어야 한다.
프로그램적 해결법의 충족 조건
- Mutual Exclution (상호 배제)
- 프로세스 P가 critical section 부분을 수행 중이면 다른 모든 프로세스들은 그들의 critical section에 들어가면 안된다.
- Progress
- 아무도 critical section에 있지 않은 상태에서 critical section에 들어가고자 하는 프로세스가 있으면 critical section에 들어가게 해주어야 한다.
- Bounded Waiting (유한 대기)
- 프로세스가 critical section에 들어가려고 요청한 후부터 그 요청이 허용될 때까지 다른 프로세스들이 critical section에 들어가는 횟수에 한계가 있어야 한다.
- 가정
- 모든 프로세스의 수행 속도는 0보다 크다.
- 프로세스들 간의 상대적인 수행 속도는 가정하지 않는다.
Initial Attempts to Solve Problem
- 두 개의 프로세스가 있다고 가정 P0, P1
- 프로세스들의 일반적인 구조
do {
entry section
critical section
exit section
remainder section
}while (1);
- 프로세스들은 수행의 동기화(synchronize)를 위해 몇몇 변수를 공유할 수 있다.
- synchronization variable
Algorithm 1
- Synchronization variable
int turn;
initially turn = 0; // Pi는 Critical Section을 turn이 i일 때 들어갈 수 있다.
- Process P0
do {
while(turn != 0); // turn을 기다림
critical section
turn = 1; // turn을 넘김
remainder section
} while(1);
- Process P1
do {
while(turn != 1); // turn을 기다림
critical section
turn = 0; // turn을 넘김
remainder section
} while(1);
- 과잉양보
- 반드시 한번씩 교대로 들어가야만 함 (swap-turn)
- Progress 조건을 만족하지 못함
- 특정 프로세스가 빈번하게 critical section을 들어가고 싶지만 못함
Algorithm 2
- Synchronization variable
- boolean flag[2];
- initially flag[모두] = false;
- flag[i] == true일 경우 Pi는 critical section에 들어갈 수 있음
- Process Pi
do {
flag[i] = true;
while(flag[j]); // turn을 기다림
critical section
flag[i] = false; // turn을 넘김
remainder section
} while(1);
- Progress 조건을 만족하지 못함
- 둘 다 2행까지 수행 후 끊임 없이 양보하는 상황 발생
Algorithm 3 (Peterson's Algorithm)
- Algorithm 1과 2를 혼합해서 사용
- Process Pi
do {
flag[i] = true;
turn = j;
while(flag[j] && turn ==j);
critical section
flag[i] = false; // turn을 넘김
remainder section
} while(1);
- 3가지 조건을 모두 충족시킨다.
- Busy Waiting (계속 CPU와 memory를 쓰면서 기다린다.)