1. 충족 조건
가. Mutual Exclusion(상호 배제): 어떤 프로세스가 critical section에 있으면 다른 모든 프로세스들은 들어가면 안 된다.
나. Progress(진행): Critical section에 아무도 업을 때, 프로세스가 들어가고 싶으면 들어갈 수 있어야 한다.
다. Bounded Waiting(유한 대기):Critical section에 들어가려고 요청한 후 허용되기 전까지 너무 기다리면 안 됨(횟수 제한)
2. 알고리즘
가.
int turn;
initially turn = 0 //들어갈 차례
do{
while (turn != 0); //my turn?
critical section
turn = 1 // Now it's your turn
remainder section
} while(1);
Mutual Exclusion은 가능, Progress는 만족 못 함(무조건 번갈아 들어가야 하므로)
나.
boolean flag[2] //들어가겠다는 의미
flag[모두] = false
do{
flag[i] = true; //pretend I am in
while(flag[j]); // Is he also in? then wait
critical section
flag[i] = false //I am out now
remainder section
} while(1)
Mutual Exclusion은 가능, Progress는 만족 못 함(동시에 들어가면 아무도 못 들어감)
다. Peterson's Algorithm
do{
flag[i] = true
turn = j
while(flag[j] && turn == j);
critical section
flag[i] = false
remainder section
} while(1)
3개 모두 만족한다.
단점: Busy Waiting(=spin lock), 계속 CPU와 memory를 쓰면서 wait한다.
라. Synchronization Hardware: 하드웨어 적으로 Test와 Modify를 atomic하게 수행하면 간단히 해결
Test_and_Set : 원래의 값을 읽고 그 값을 1(True)로 세팅하는 것을 하나의 instruction으로 만듦
do{
while(Test_and_Set(lock))
critical section
lock= false
remainder section
}
3. Semaphores: 앞의 방식들을 추상화 시킴
가. P(S): while (S<=0) do no-op; S--; 변수를 획득하는 과정
나. V(S): S++ 자원을 내어놓는 것
-> 위 2개가 atomic 하다고 가정
다. typedef struct{
int value //semaphore
struct process* L //process wait queue
} semaphore
라. P(S): S.value--
if(S.value < 0){
add this process to S.L
block()
}
마. V(S): S.value++
if(S.value <= 0){
remove a process P from S.L
wakeup(P)
}
4. Counting semaphore: 자원의 개수가 여러개
5. Binary semaphore: 자원의 개수가 2개(mutex)
6. Deadlock: 둘 이상의 프로세스가 서로 상대방에 의해 충족될 수 있는 event를 무한히 기다리는 현상
가. 하나의 프로세스가 특정한 자원을 가진 채로 block되었을 때, 다른 프로세스가 그 자원을 요구할 때 발생
-> 서로 상대방의 것을 원하고, 내어놓지 않아서 생기는 문제
-> 자원을 얻는 순서를 정해주면 해결됨
7. Starvation: indefinite blocking, 프로세스가 suspend된 이유에 해당하는 세마포어 큐에서 빠져나갈 수 없는 현상
-> 특정 프로세스만 자원을 가져서 다른 프로세스는 영원히 가질 수 없는 현상
8.
'Studying > Operating System' 카테고리의 다른 글
06. Process Synchronization (5/5) (Concurrency Control) (0) | 2018.06.14 |
---|---|
06. Process Synchronization (4/5) (0) | 2018.06.07 |
05. CPU Scheduling (3/3) / 06. Process Synchronization (1/5) (0) | 2018.06.02 |
05. CPU Scheduling (2/3) (0) | 2018.05.30 |
04. Process Management (2/2), 05. CPU Scheduling (1/3) (0) | 2018.05.26 |