LinuxProgramming

[Linux] producer consumer in bounded array

mintuchel 2023. 12. 10. 14:21

 

유한버퍼에서의 producer consumer는 총 3개의 세마포어를 사용해야한다

 

1. semaphore s : controls buffer access

s는 0 아니면 1만 가질 수 있다. 읽고 쓰기를 오직 한 프로세스만 가능하게 하기 위해서이다.

이건 producer 와 consumer 가 각각 한 명이 아니더라도 당연히 적용된다. 

그냥 한 프로세스가 semop로 0 만들어버리면 아무도 접근하지 못하기 때문이다.

 

2. semaphore e : number of items available for consumption (prevents underflow)

consumer가 읽을 수 있는 데이터 개수이다. 최소 0 최대 버퍼 사이즈이다.

만약 값이 0이라면 버퍼에 데이터가 없다는 뜻이다.

따라서 이때 더 읽어들이려고 하면 BLOCKING 상태에 들어가 강제 waiting을 하게 된다.

만약 producer가 데이터를 입력하면 그때서야 BLOCKING 상태에서 깨어나 데이터를 읽는다.

 

3. semaphore n : amount of free space left in buffer (prevents overflow)

producer가 사용할 수 있는 버퍼 공간량이다. 최소 0 최대 버퍼 사이즈이다.

만약 값이 0이면 버퍼가 꽉찼다는 뜻이다.

따라서 이때 더 입력하면 BLOCKING 상태에 들어가 semaphore 연산에 의해 강제 wait(semwait)을 하게 된다.

 


 

 

 

우선 buffer는 front 와 rear로 되어있으므로 circular queue같은 느낌으로 구현해야한다.

그냥 인덱스 계산만 추가로 넣어주면 된다는 얘기다.

 

그리고 여기서 힌트가 ushort buf[3] 이다. 한 개의 set에 semaphore 3개로 풀라는 뜻이다.

따라서 유한버퍼에서의 producer consumer 문제가 맞다.

 

[producer.c]

 

[consumer.c]

 

 

까먹으면 이 동영상 보면 됨

ㅈㄴ 잘 설명해줌

 

https://www.youtube.com/watch?v=nxw2y27z0V4