티스토리 뷰

운영체제/이론

(29) Synchronization Tools - 2

geonwoopaeng@gmail.com 2020. 9. 21. 21:46

### Producer and Consumer Problem ###

producer(data 넣기), consumer(data 사용)

: 컴퓨터가 가지는 상관 관계

 

(producer 와 consumer이 누구와 관계하고 있느냐에 따라 달라질 수 있다)

: data를 공유하기 위해서 중간에 buffer을 사용한다.

1. <Cooperating processes: Producer and consumer>

: producer process는 consumer process에 의해 consumer되는 정보를 생성합니다.

2. <Unbounded-buffer>

: capacity가 무한한 buffer

: producer가 data를 buffer에 넣을 때 대기하지 않아도 된다.

: consumer인 경우 buffer에 data 없는 경우 wait해야 한다.

: 이론적일 때 사용(이상적인 것)

3. <Bounded-buffer>

: capacity가 한정된 buffer(buffer size가 고정되어 있다)

: producer은 buffer가 가득차 있으면 wait한다.

: consumer은 buffer가 비어있으면 wait한다.

: producer와 consumer 사이에 존재하는 공유 메모리

// buffer empty 
in == out 

// buffer full
((in+1) % buffer_size) == out 

 

 

<Producer & Consumer 코드>

// producer 
item n_producer; #다음 생산할 항목

while true{
	
    while (((in + 1) % buffer_siez) == out); # 아무일도 일어나지 않는다 
    
    buffer[in] = n_producer;
    in = (in + 1) % buffer_siez;
    
    
    
// consumer 
item n_cosumer #다음 소비할 항목

while true{
	
    while (in == out); # 아무일도 일어나지 않는다 
    
    n_consumer = buffer[out];
    out = (out + 1) % buffer_siez;
    

(Producer의 코드에서 (in+1)이 2번 이기 때문에 index 1개를 버리게 된다 (메모리 낭비))

 

 

 

<Filling the buffer>

: 앞 코드의 메모리 낭비를 해결하기 위함 => count를 이용하여 buffer을 인지할 수 있게한다.

: producer가 counter값을 증가시키고 consumer가 counter값을 감소시켜
buffer의 값을 즉각 인지 할 수 있게 해주는 것

(producer - buffer full (count == buffersize), consumer - buffer empty (count == 0)) 

=> 위쪽 while 조건문을 바꿔주고 producer은 count++, consumer은 count--

 

 

 

 

<Race Condition>

: 2개 이상의 process가 자신들이 공유하는 data에 접근하고 바꿀수 있을 때

: 장치 또는 시스템이 둘 이상을 수행하려고 할 때 발생하는 바람직하지 않은 상황

=> 바뀌는 값이 process의 작업처리 순서에 영향받는 경우(의도하지 않는 결과 초례)

반응형
공지사항
최근에 올라온 글