※ 전남대학교 박태준 교수님의 운영체제 강의를 듣고, 정리한 내용입니다.
공유 버퍼를 사이에 두고, 생산자와 소비자간 공유버퍼를 문제없이 사용하도록 생산자와 소비자를 동기화시키는 문제를 생산자 - 소비자 문제 라고 합니다.
생산자 : 데이터를 공급 ( Inqueue )
소비자 : 데이터를 처리 ( Dequeue )
생산자는 수를 늘리면서 물건을 채우고, 소비자는 수를 줄이면서 물건을 소비하는 형식 입니다.
이때, 생산자 코드와 소비자 코드가 동시에 실행될 경우 문제가 발생합니다.

상호 배제 해결
비어있는 공유 버퍼 문제
꽉 찬 공유 버퍼 문제
읽기용 세마포어와 쓰기용 세마포어를 구분지어 문제를 해결할 수 있습니다.
먼저 읽기 가능한 버퍼의 갯수를 확인합니다.
버퍼가 비어있는 상태에서 소비자가 읽으려고 하는 경우, 소비자에게 기다리라는 신호 ( wait ) 를 보내게 됩니다.
이로써 비어있는 버퍼 문제를 해결할 수 있습니다.

먼저 쓰기 가능한 버퍼의 갯수를 확인합니다.
버퍼가 가득 찬 상태에서 생산자가 쓰려고 할 때, 생산자에게 기다리라는 신호 ( wait ) 를 보내게 됩니다.
이로써 꽉 찬 공유 버퍼 문제를 해결할 수 있습니다.

위의 케이스들을 알고리즘으로 표현하면 다음과 같습니다.
R : 버퍼에 읽기 가능한 버퍼의 개수
W : 버퍼에 있는 쓰기 가능한 버퍼의 개수
M : 뮤텍스, 생산자 소비자 모두 사용
