티스토리 뷰
<<1. 재료 공급자와 흡연자 문제>>
상황 설명 :
흡연자(smoker)는 흡연을 합니다.
흡연을 하기위해선 3가지 재료가 필요합니다.
3가지 재료는 종이(paper), 담배잎(tobacco), 성냥(match)입니다.
흡연자는 세 재료중 한가지의 재료를 가지고 있습니다.
흡연자는 총 3명입니다.
흡연을 위한 나머지 2개의 재료는 랜덤하게 공급자(agent)가 (테이블 등에)공개하고
무한정 공급이 지속됩니다.
공개된 재료들을 보고 흡연자들이 흡연하기위해 재료를 집어 듭니다.
수도 코드 :
agentSem <- Semaphore(1);
tobacco <- Semaphore(0);
paper <- Semaphore(0);
match <- Semaphore(0);
//각 재료와 agentSem에 세마포어를 부여합니다.
//agentSem은 전체 흐름의 시작과 끝을 담당합니다.
agent {
while(무한 반복) {
switch( 랜덤한 숫자(0~2) )
case 0:
agentSem -> wait;
tobacco -> signal;
paper -> signal;
break;
case 1:
agentSem -> wait;
paper -> signal;
match -> signal;
break;
case 2:
agentSem -> wait;
tobacco -> signal;
match -> signal;
break;
//agentSem 은 taboacco, paper, match 중 2개를 택합니다.(총 3가지 경우가 있음)
}
}
Smoker with match {
tobacco -> wait;
paper -> wait;
3가지 재료로 담배를 만든후, 담배를 핀다;
agentSem -> signal;
// 흡연을 완료하였다면 agentSem에게 신호를 보낸다.
}
Smoker with tobacco {
paper -> wait;
match -> wait;
3가지 재료로 담배를 만든후, 담배를 핀다;
agentSem -> signal;
// 흡연을 완료하였다면 agentSem에게 신호를 보낸다.
}
Smoker with paper {
tobacco -> wait;
match -> wait;
3가지 재료로 담배를 만든후, 담배를 핀다;
agentSem -> signal;
// 흡연을 완료하였다면 agentSem에게 신호를 보낸다.
}
문제가 되는 경우 :
agent가 case0을 통해 담배잎과 종이를 제공합니다. 이 때 match smoker가 재료를 얻으려고 와서 첫 번째 재료를 얻었지만 곧바로 tobacco smoker가 paper 재료를 가져가는 바람에 match smoker는 무한정 기다리며 흡연을 할 수 없게 됩니다.
이 상황에서 match smoker와 tobacco smoker 둘다 다음 자원을 기다리며 흡연을 할 수 없게 됩니다.
|
agent |
match smoker |
tobacco smoker |
1 |
case 0 |
|
|
2 |
agentSem -> wait; |
|
|
3 |
tobacco -> signal; |
|
|
4 |
paper -> signal; |
|
|
5 |
|
tobacco -> wait; |
|
6 |
|
|
paper -> wait; |
7 |
|
paper -> wait; |
match -> wait; |
<< 헤어샵 손님맞이 문제 >>
상황 설명:
watingRoom에 5개의 의자가 있습니다. cutRoom에 1개의 의자가 있습니다.
hairdresser는 cutRoom에서 한 번에 한명의 손님에게만 서비스할 수 있습니다.
cutRoom에 이미 손님이 있다면, 추후에 오는 손님은 wating Room에서 대기하게 됩니다.
모든 좌석이 꽉 차 있다면 손님은 대기하기 않고 집게가게 됩니다.
수도코드 :
cutRoom <- semaphore(1);
watingRoom <- semaphore(5);
exist <- semaphore(0); // 대기하는 손님이 존재하는지 체크
hairdresser {
while(무한반복) {
exist -> wait;
cutRoom -> wait;
머리 자르기;
cutRoom -> signal;
}
}
customer {
if(cutRoom이 꽉차있다면) {
if(watingRoom이 꽉차있다면)
집에간다(= 종료한다);
else
watingRoom -> wait;
cutRoom에 자리가 생길 때 까지 기다린다;
if(cutRoom에 자리가 생기면)
watingRoom -> signal;
exist -> signal;
}
else {
exist -> signal;
}
}
문제가 되는 경우 :
cutRoom에서 새 손님을 맞이할 때, watingRoom에서 기다렸던 손님보다.
헤어샵에 막 들어온 손님이 먼저 cutRoom에 들어갈 수 있는 가능성이 있음.
|
hairdresser |
customer - 1 |
customer - 2 |
customer - 3 |
1 |
exist -> wait; |
|
|
|
2 |
|
else |
|
|
3 |
|
exist -> signal; |
|
|
4 |
cutRoom -> wait; |
|
|
|
5 |
|
|
if(cutRoom이 꽉차있다면) |
|
6 |
|
|
watingRoom -> wait; |
|
7 |
머리 자르기; |
|
|
|
8 |
cutRoom -> signal; |
|
|
|
9 |
|
|
if(cutRoom에 자리가 생기면) |
|
10 |
|
|
watingRoom -> signal; |
|
11 |
|
|
|
else |
12 |
|
|
|
exist -> signal; |
13 |
exist -> wait; |
|
|
|
14 |
cutRoom -> wait; |
|
|
|
15 |
머리 자르기; |
|
|
|
16 |
cutRoom -> signal; |
|
|
|
17 |
|
|
exist -> signal; |
|
18 |
exist -> wait; |
|
|
|
19 |
cutRoom -> wait; |
|
|
|
20 |
머리 자르기; |
|
|
|
21 |
cutRoom -> signal; |
|
|
|
나중에 들어온 customer - 3 이 먼저 들어온 손님보다 먼저 서비스 받는 상황이 일어났다.
'잊어버린 과거' 카테고리의 다른 글
[과제]윈도우프로그래밍. 해양 구조물 부식방지 시스템(제안서3, 최종결과) (0) | 2013.12.24 |
---|---|
[과제]윈도우프로그래밍. 해양 구조물 부식방지 시스템(제안서 2) (0) | 2013.12.24 |
[과제]윈도우프로그래밍. 해양 구조물 부식방지 시스템(제안서 1) (0) | 2013.12.24 |
[과제]운영체제. 페이징 시뮬레이션 소프트웨어 (2) | 2013.12.24 |
[과제]운영체제. 교착상태 해결 (0) | 2013.12.24 |
[과제]소프트웨어공학. 소프트웨어 개발(프레젠테이션) (0) | 2013.12.22 |
[과제]소프트웨어공학. 소프트웨어 개발(설계서_2) (0) | 2013.12.22 |
[과제]소프트웨어공학. 소프트웨어 개발(설계서_1) (0) | 2013.12.22 |
[과제]소프트웨어공학. 소프트웨어 개발(요구사항 명세서) (0) | 2013.12.22 |
[과제]소프트웨어공학. 소프트웨어 개발(제안서) (0) | 2013.12.22 |