본문 바로가기

컴퓨터 공학/운영체제

[운영체제] 생산자-소비자 문제 (Producer-Consumer Problem)

본 포스팅의 내용은 Operating System Concepts 10th, Operating Systems Three Easy Pieces를 참조하여 작성되었습니다.

 운영체제는 여러개의 프로세스들이 동시에(Concurrently) 실행되는 것처럼 사용자에게 보여주거나, 실제로 여러개의 코어를 활용해 여러개의 스레드를 실행시킵니다. 이때 모든 프로세스나 스레드가 자신만의 독자적인 메모리 주소공간을 사용한다면 문제가 없겠지만, 스레드 간의 공유하는 메모리 주소공간이 있다면 문제가 생길 수 있습니다. 이러한 문제를 가장 직관적으로 잘 설명한 것이 생산자(Producer)-소비자(Consumer) 문제(Problem)입니다.

쉽게 설명하기 위해 아래 그림을 통해 예를들어 설명해 보겠습니다. 왼쪽에 있는 소비자는 바구니에 있는 끊임없이 쿠키를 꺼내서 먹고, conut를 하나 내립니다. 그리고 만약 쿠키가 없다면(count가 0) 먹지않고 생산자가 만들어줄 때까지 기다립니다. 오른쪽에 있는 생산자는 끊임없이 쿠키를 만들어서 바구니에 넣고, count를 하나 올립니다.만약 바구니가 꽉 차면(count가 max) 쿠키를 넣지 않고 기다립니다. 이 규칙에 따르면, 쿠키가 없는데 소비자가 먹는 경우 또는 바구니가 꽉 찾음에도 불구하고 생산자가 쿠키를 더 만들어 집어넣는 경우는 발생하지 않아야 합니다.

위의 예시와 같은 상황을 표현한 프로세스 모델을 만든다면 코드는 아래처럼 작성될 것입니다. 소비자와 생산자는 conut라는 공유변수를 이용해서 쿠키의 개수를 판단하고 이를 이용해서 생산자와 소비자는 끊임없이 쿠키를 만들고 소비하는 일이 반복되어야 합니다.

소비자(Consumer)

 

그런데 위의 두 프로세스를 동시에 실행시킨다면 어떤 일이 발생할까요? 우리가 생각했던 대로 제대로 동작할까요? 정답부터 말씀드리자면, 위의 코드는 제대로 동작하지 않습니다. 왜냐하면 프로세스는 인터럽트(interrupt)에 의해 임의의 순간에 정지되고 다른 프로세서가 실행될 수 있는데 이 때 count라는 공유변수의 값이 바뀔 수 있기 때문입니다. 또는 여러개의 코어가 있는 CPU의 경우 병렬적으로 수행되어 동시에 count에 접근하는 상황이 발생할 수 있기 때문입니다. 아직 감이 안올 수 있으니, 구체적으로 코드를 통해서 살펴보겠습니다.

count를 1만큼 감소시키는 소비자의 기계어 코드는 다음과 같습니다.

소비자의 count-- 기계어

 

count를 1만큼 증가시키는 생산자의 기계어 코드는 다음과 같습니다.

소비자의 count++ 기계어

 위의 두개의 기계어(Machine Instruction)이 차례대로 실행되면 문제가 없겠지만 앞서 말했듯이 인터럽트가 발생하는 경우 다음과 같은 순서로 뒤섞여서 기계어가 처리될 수 있습니다.

 분명 문제가 있습니다. T4 시간에는 count가 6이었지만, T5시간에는 count가 4입니다. 쿠키가 6개에서 곧바로 4개가 되어버린 것입니다. 쿠키가 5개였을 때 1개를 생산하고 1개를 먹었으면 결론적으로 T5 시간의 쿠키의 갯수(count)는 5개를 기대했는데 말입니다. 이 처럼 여러개의 프로세스가 공유된 자원에 동시에 접근하여 수정하려 하고, 실행 순서에 따라서 결과가 달라지는 이러한 상황을 한 마디로표현하면 race condition (경쟁적 상태) 에 있다고 말합니다. 

 이 문제의 근본적인 원인을 찾아보면 2가지 정도로 압축해볼 수 있습니다. 첫 번째는 프로세스가 어느 순간에 Interrupt 될지 예측할 수 없다는 것과, 두 번째는 프로세스의 count를 올리는 명령어들이 원자적(Atomic)하지 않기 때문입니다. 

 그렇다면 두 개 이상의 프로세스에 공통된 자원이 있다면 어떤 방식으로 공유해야 올바른 수행 순서로, 올바른 결과 값을 얻을 수 있을 까요? 

더보기

 미리 알려드리자면, 정답은 운영체제의 도움을 받는 것입니다!  이러한 동기화(Synchronization), 상호 배제(Mutual Exclusion) 문제를 해결하기 위한 몇가지 도구들을 제공합니다. (세마포어, 모니터,  etc..)

 이상으로 공유된 자원을 가진 여러개의 프로세스들에서 발생하는 생산자-소비자 문제(Producer-Consumer Problem)를 알아보는 포스팅을 마치겠습니다.