명품 운영체제
[운영체제] 생산자 소비자
코딩 못하는 감자
2024. 4. 18. 22:58
생산자 소비자 문제란
유한한 크기의 공유버퍼에 데이터를 공급하는 생산자와
공유버퍼에서 데이터를 읽고 소비하는 소비자
공유버퍼를 문제없이 사용하도록
생산자와 소비자를 동기화시키는(실행 순서 제어) 문제이다.
생산자 소비자 문제는 다음 3가지 경우에 발생할 수 있다.
1. 상호배제(생산자와 소비자의 공유버퍼 사용 충돌)
2. 버퍼가 비어 있는 경우
3. 버퍼가 가득 차 있는 경우
해결책
읽기 가능한 버퍼의 개수를 관리하는 세마포 R
쓰기 가능한 버퍼의 개수를 관리하는 세마포 W을 두어
관리한다.
예를 들어
공유 버퍼가 비어있을 때
소비자가 공유버퍼에 접근하게 되면(P 연산)
세마포 R의 counter가 0이므로 P연산에서 잠을 잔다.
생산자 스레드에서 버퍼에 데이터를 쓰고 V연산을 실행하면
세마포 R의 counter의 값을 1로 바꾸고 소비자를 깨운다.
이후 소비자는 깨어나 P연산의 나머지 부분을 수행 후
P연산의 실행을 마치고 counter을 0으로 만든다.
반대로 생산자의 경우
공유 버퍼가 가득 차 있을 때
생산자가 공유버퍼에 접근하게 되면(P 연산)
세모포 W의 counter가 0이므로 P연산이 잠을 재운다
소비자 스레드에서 버퍼에서 데이터를 읽고
세마포 W에 대해 V연산을 수행하면
counter의 값을 1로 만들고 생산자 스레드를 깨운다.
이후 생산자 스레드는 깨어나 P연산의 나머지 부분을 수행 후
P연산의 실행을 마치고 counter을 0으로 만든다.