직업은 선물 트레이더

[과제]운영체제. 세마포어 문제(흡연자, 헤어샵)

잊어버린 과거

 

세마포어 흡연자 문제

<<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 이 먼저 들어온 손님보다 먼저 서비스 받는 상황이 일어났다.