2013-10-04 5 views
0

세마포어를 사용하여 해결할 때 생산자 - 소비자 문제를 누구에게 설명 할 수 있습니까? 좀 더 구체적으로 말하면, 생산자 코드와 소비자 모두에서 부침의 순서가 바뀌면 어떻게되는지 이해하는 데 어려움을 겪고 있습니다.생산자 - 소비자 및 작동 방식

semaphore mutex = 1; 
semaphore full = 0; 
semaphore empty = N; 

void producer (void){ 
{ 
while(true) 
{ 
int item = produce_item(); 
down(&empty); 
down(&mutex); 
insert_item(item); 
up(&mutex); 
up(&full); 
} 
} 

void consumer (void){ 
{ 
while(true) 
{ 
down(&full); 
down(&mutex); 
int item = remove_item(item); 
up(&mutex); 
up(&empty); 
consume_item(item); 
} 
} 

나는 다소 이야기하는 코드입니다.

답변

2

바쁜 대기를 사용하여 구현 된 세마포어처럼 보입니다. 다음과 같이

그것은 작동합니다

생산자와 소비자가 서로 평행하게 노력하고 있습니다. 뮤텍스는 상호 배제 용입니다. 즉, 이들 중 하나만이 동시에 비공유 데이터 구조에 액세스하고 있음을 의미합니다. down()은 뮤텍스가 사용 가능한지 검사합니다 (이 경우 == 1). 다음과 같은 잠시 루프를 점검하고 있습니다 : while (mutex < 1);. 뮤텍스가 마침내 사용 가능하지 않으면 값을 줄입니다 ("뮤텍스 가져 오기"라고 함).

다른 두 세마포어는 반드시 두 가지를 만들기위한 것입니다 :

  1. 자료 구조는 자료 구조가 완전하지 않은 경우 생산자는 생성 할 수
  2. 비어 있지 않은 경우, 소비 만 할 수있는 소비자

둘 중 하나가 다른 것보다 빠르기 때문에 이것은 필요합니다.

down(&empty);으로 제작자는 데이터 구조에 빈 슬롯이 있는지 확인합니다. 그렇지 않은 경우 그는 아직 생산이 허용되지 않습니다 (슬롯이 비어있을 때까지 대기 중입니다. 즉, 빈> 0). 그렇지 않으면 빈 상태로 줄어들어 계속됩니다. 데이터 구조에 생성 된 항목을 추가 할 때 전체 슬롯의 값을 up(&full);으로 늘립니다.

down(&full);으로 소비자는 읽을 전체 슬롯이 있는지 확인합니다. 그렇지 않은 경우 그는 아직 읽을 수 없습니다 (슬롯이 가득 찰 때까지 대기, 완전히> 0). 그렇지 않으면 그는 완전히 감소하고 계속됩니다. 데이터 구조에서 항목을 소비했을 때 빈 슬롯 값이 증가합니다.

상승 및 감소의 순서를 변경하면 서로를 오랫동안 기다릴 수 있기 때문에 교착 상태가 발생할 수 있습니다.