멀티스레드와 동시성

Ch08. 생산자 소비자 문제 - 소개

webmaster 2024. 8. 20. 22:00
728x90

생산자 소비자 문제는 멀티스레드 프로그래밍에서 자주 등장하는 동시성 문제 중 하나로, 여러 스레드가 동시에 데이터를 생산하고 소비하는 상황을 다룬다.

  • 멀티스레드의 핵심을 제대로 이해하려면 반드시 생산자 소비자 문제를 이해하고, 올바른 해결 방안도 함께 알아두어야 한다.
  • 생산자 소비자 문제를 제대로 이해하면 멀티스레드를 제대로 이해했다고 볼 수 있다. 그만큼 중요한 내용이다.

생산자 - 소비자 문제 예시

생산자 - 소비자 문제 예시

  • 생산자(Producer): 데이터를 생성하는 역할을 한다. 예를 들어, 파일에서 데이터를 읽어오거나 네트워크에서 데 이터를 받아오는 스레드가 생산자 역할을 할 수 있다.
    • 앞서 프린터 예제에서 사용자의 입력을 프린터 큐에 전달하는 스레드가 생산자의 역할이다.
  • 소비자(Consumer): 생성된 데이터를 사용하는 역할을 한다. 예를 들어, 데이터를 처리하거나 저장하는 스레드가 소비자 역할을 할 수 있다.
    • 앞서 프린터 예제에서 프린터 큐에 전달된 데이터를 받아서 출력하는 스레드가 소비자 역할이다.
  • 버퍼(Buffer): 생산자가 생성한 데이터를 일시적으로 저장하는 공간이다. 이 버퍼는 한정된 크기를 가지며, 생산자와 소비자가 이 버퍼를 통해 데이터를 주고받는다.
    • 앞서 프린터 예제에서 프린터 큐가 버퍼 역할이다.

문제 상황

  • 생산자가 너무 빠를 때: 버퍼가 가득 차서 더 이상 데이터를 넣을 수 없을 때까지 생산자가 데이터를 생성한다. 버퍼가 가득 찬 경우 생산자는 버퍼에 빈 공간이 생길 때까지 기다려야 한다.
  • 소비자가 너무 빠를 때: 버퍼가 비어서 더 이상 소비할 데이터가 없을 때까지 소비자가 데이터를 처리한다. 버퍼가 비어있을 때 소비자는 버퍼에 새로운 데이터가 들어올 때까지 기다려야 한다.

생산자 소비자 문제 - 비유

  •  비유 1: 레스토랑 주방과 손님
    • 생산자(Producer): 주방 요리사
    • 소비자(Consumer): 레스토랑 손님
    • 버퍼(Buffer): 준비된 음식이 놓이는 서빙 카운터
      • 요리사(생산자)는 음식을 준비하고 서빙 카운터(버퍼)에 놓는다.
      • 손님(소비자)은 서빙 카운터에서 음식을 가져가서 먹는다.
      • 만약 서빙 카운터가 가득 차면 요리사는 새로운 음식을 준비하기 전에 공간이 생길 때까지 기다려야 한다.
      • 반대로, 서빙 카운터가 비어 있으면 손님은 새로운 음식이 준비될 때까지 기다려야 한다.
  • 비유 2: 음료 공장과 상점
    • 생산자(Producer): 음료 공장
    • 소비자(Consumer): 상점
    • 버퍼(Buffer): 창고
      • 음료 공장(생산자) 음료를 생산하고 창고(버퍼) 보관한다.
      • 상점(소비자) 창고에서 음료를 가져와 판매한다.
      • 만약 창고가 가득 차면 공장은 새로운 음료를 생산하기 전에 공간이 생길 때까지 기다려야 한다.
      • 반대로, 창고가 비어 있으면 상점은 새로운 음료가 창고에 들어올 때까지 기다려야 한다

이 문제는 다음 두 용어로 불린다. 참고로 둘다 같은 뜻이다.

  • 생산자 소비자 문제(producer-consumer problem): 생산자 소비자 문제는, 생산자 스레드와 소비자 스레드가 특정 자원을 함께 생산하고, 소비하면서 발생하는 문제이다.
  • 한정된 버퍼 문제(bounded-buffer problem): 이 문제는 결국 중간에 있는 버퍼의 크기가 한정되어 있기 때문에 발생한다. 따라서 한정된 버퍼 문제라고도 한다.

 

728x90