동기화, 데드락 코딩

suhan cho·2022년 12월 19일
0
repeat
while(flag[1]) do
endwhile
flag[0] = true
임계
flag[0] = false
P()
if (S >0)
	then s <- s-1
else wait on the queue Q;

V()
if(exsist waiting process on Q)
then wakeup one of them;
else s <- s+1

생산자 소비(세마포)

# 생산자 소비 문제
(shared variables)
var consumed 세마포 <-1
	produced 세마포 <-0
    buffer   message;

producer Pi --> buffer --> consumer cJ

// 생산 
repeat
....
	create a new message
    P(consumed); //counsumed 처음에 1이므로 P로 0으로 바뀜
    buffer<-m
    V(produced); //반납으로 생산됐다고 0을 1로 바꿈
....
until(false);

//소비
repeat
...
	P(produced) // 생산된 1을 사용하였으므로 0으로 바꿈
    m <- buffer // 버퍼에 있던 거 이동
    V(consumed) // 소비했으므로 0을 1로 바꿈
    consumed the message m;
....
until(false)

Reader-Writer(세마포)

var wmutex, rmutex 세마포 =1, 1
	nreaders 	   integer =0

// Reader Ri
repeat
...
	P(rmutex)
    if(nreaders=0) then
    	P(wmutex)
    endif
    nreader <- nreader +1 
    V(rmutex)
    perform read
    P(rmutex)
    nreadr <- nreader -1
    if(nreaders=0) then
    	V(wmutex)
    endif;
    V(rmutex)
    ...
until(false)

// Writer Wj
repeat
...
	P(wmutex);
    perform write operations
    V(wmutex);
...
until(false);
    
profile
안녕하세요

0개의 댓글