생산자 - 소비자 문제

라마·2023년 7월 26일

운영체제

목록 보기
23/32

※ 전남대학교 박태준 교수님의 운영체제 강의를 듣고, 정리한 내용입니다.

생산자 - 소비자 문제 ( Producer - Consumer Problem )

공유 버퍼를 사이에 두고, 생산자와 소비자간 공유버퍼를 문제없이 사용하도록 생산자와 소비자를 동기화시키는 문제를 생산자 - 소비자 문제 라고 합니다.

  • 생산자 : 데이터를 공급 ( Inqueue )

  • 소비자 : 데이터를 처리 ( Dequeue )

생산자는 수를 늘리면서 물건을 채우고, 소비자는 수를 줄이면서 물건을 소비하는 형식 입니다.

이때, 생산자 코드와 소비자 코드가 동시에 실행될 경우 문제가 발생합니다.

생산자 - 소비자에서 고려해야할 3가지 문제점

  • 상호 배제 해결

    • 생산자들과 소비자들의 공유 버퍼에 대한 상호 배제
  • 비어있는 공유 버퍼 문제

    • 비어 있는 공유 버퍼를 소비자가 읽으면 안됨
  • 꽉 찬 공유 버퍼 문제

    • 꽉 찬 공유 버퍼에 생산자가 더 이상 데이터를 입력하면 안됨

해결책 : 세마포어 2개를 이용!

읽기용 세마포어쓰기용 세마포어를 구분지어 문제를 해결할 수 있습니다.

읽기용 세마포어

먼저 읽기 가능한 버퍼의 갯수를 확인합니다.

버퍼가 비어있는 상태에서 소비자가 읽으려고 하는 경우, 소비자에게 기다리라는 신호 ( wait ) 를 보내게 됩니다.

이로써 비어있는 버퍼 문제를 해결할 수 있습니다.

쓰기용 세마포어

먼저 쓰기 가능한 버퍼의 갯수를 확인합니다.

버퍼가 가득 찬 상태에서 생산자가 쓰려고 할 때, 생산자에게 기다리라는 신호 ( wait ) 를 보내게 됩니다.

이로써 꽉 찬 공유 버퍼 문제를 해결할 수 있습니다.

알고리즘으로 표현

위의 케이스들을 알고리즘으로 표현하면 다음과 같습니다.

  • R : 버퍼에 읽기 가능한 버퍼의 개수

    • 0 일 경우 ( 비어있는 경우 ) 대기
  • W : 버퍼에 있는 쓰기 가능한 버퍼의 개수

    • 0 일 경우 ( 꽉 차있는 경우 ) 대기
  • M : 뮤텍스, 생산자 소비자 모두 사용

0개의 댓글