[OS] Condition Synchronization with Producer & Consumer Problem

G·2023년 5월 7일
0

OS

목록 보기
11/20
post-thumbnail

조건부 동기화와 이를 통한 생산자 소비자 문제를 알아보자.

Condition Synchronization

조건부 동기화란 말 그대로 조건에 따른 동기화 기법이다. 상호배제만 concurrent programmig의 전부가 아니다. 멀티 쓰레드 환경에서 critical section에 접근하기 위해 동기화를 수행해야하는 것뿐만 아니라, 조건에 따른 동기화도 필요하다.

예를 들어 행렬 곱셈이 있다. 각각의 쓰레드는 행렬 곱셈을 수행하고 이를 하나의 행렬로 만들 쓰레드가 있을 때, 해렬 곱셈이 모두 끝날 때 까지 대기해야한다. 조건이 주어져있다.


이러한 경우도 조건부 동기화이다. 부모 쓰레드는 자식 쓰레드가 종료되어야 그 이후에 종료한다.

Condition Variables

조건 변수란 조건이 참이될 때까지, 동기적으로 수행되는 쓰레드를 block 시키기 위한 data type이다.
조건 변수 CV는 condition에 따른 waiting queue이다.
또한 조건 변수는 상호배제와, 조건과 연관이 있다.

APIs

  • wait(): queue에 sleep한다.
  • signal(): 다른 쓰레드가 sleep 상태인 쓰레드를 awake 상태로 만들어준다.
  • broadcast(): 모든 waiting 쓰레드를 awake 상태로 만든다.


자러 갈때, 변수 m을 unlock한다. 깰 때 lock한다.

join() example

부모가 먼저 실행되던, 자식이 먼저 실행되던 자식 \rightarrow 부모 순으로 수행된다.

Producer/Consumer problem

마치 네트워크의 서버와 클라이언트의 동작원리의 개념적 부분이다.
하나의 공간에 생산자는 생산을 하고 소비자는 소비한다. 클라이언트가 서버의 receiving 버퍼에 패킷을 전송하면 버퍼의 크기는 +1이 되고 서버가 이 데이터를 가져가 application에서 사용해야 버퍼가 -1이 된다. 멀티플한 쓰레드가 다수의 클라이언트를 처리할 때, 이는 조건 동기화와 상호배제가 필요하다.
다음과 같은 조건이 발생한다.

  • Producer: 생산자는 버퍼가 꽉차면 대기한다.
  • Consumer: 소비자는 버퍼가 비어있으면 대기한다.

하지만 버퍼의 크기가 무제한이면 소비자한테만 제약이 걸린다. 그러나 대개 버퍼의 크기는 제한되어 있기 때문에 둘 다를 봐야한다.
구현은 pthread API의 상호배제와 조건 동기화(cond_signal)로 구현된다. 또는 세마포어로 구현할 수 있다.

크기가 무제한인 버퍼를 본다.

소비자가 한 명이고 무제한 버퍼에서만 동작한다.

if문이 문제가 된다. 버퍼가 비었는데 get()을 하게됨.


같은 큐를 사용하므로 생산자/소비자 모두 잠듦


같은 큐를 써라!

Semaphore as CV

세마포어를 CV로 사용가능하다. 애초에 sleep, awake 기법을 사용하기 때문이다.

Producer/Consumer Solution with Semaphore

그런데 auto release 기능이 없어 문제가 된다. m을 lock하고 sleep하기 때문에, consumer가 critical section에 들어올 수 없다.

순서를 바꾸면 깔끔하게 해결된다.

profile
열심히 안 사는 사람

0개의 댓글