1. 程式人生 > >顧客銀行辦理業務時,首先在取號機上取號,然後坐在椅子上等候業務員叫號時前往視窗辦理業務,假設銀行現在有3個視窗可辦理業務,請採用訊號量和PV操作描述顧取號等候叫號和銀行業務員叫號辦理業務的同步操作。

顧客銀行辦理業務時,首先在取號機上取號,然後坐在椅子上等候業務員叫號時前往視窗辦理業務,假設銀行現在有3個視窗可辦理業務,請採用訊號量和PV操作描述顧取號等候叫號和銀行業務員叫號辦理業務的同步操作。

顧客銀行辦理業務時,首先在取號機上取號,然後坐在椅子上等候業務員叫號時前往視窗辦理業務,假設銀行現在有3個視窗可辦理業務,請採用訊號量和PV操作描述顧取號等候叫號和銀行業務員叫號辦理業務的同步操作。

1)首先識別哪些事務可以作為程序

顧客,業務員

2)其次識別臨界資源,即程序共享的事務

取號機,椅子,顧客,業務員

3)定義資料結構

定義共享變數及私有變數

int number=0;//顧客計數器

定義代表臨界資源的訊號量

Semaphore getNum=1;//互斥改變顧客序號number

4)定義程序操作

4.1顧客操作程序:

顧客進入銀行

取號機取號

顧客數增1

業務員叫號

辦理業務

 顧客數減1

 4.2業務員程序操作

  呼叫一位顧客

  辦理業務

 5)程序的虛擬碼實現

int Number=0;//顧客計數器

semaphore getNum=1;//互斥改變顧客序Number

semaphore customers=0;//顧客數訊號量

semaphore callMe=0; //等待叫號的顧客數訊號量

/*顧客程序的實現*/

Process customer()

{

       到來;

       P(getNum);//互斥取號

       Number++;//取號

       V(getNum);

       V(customers);/顧客數加1

       P(callMe);//等待叫號

       辦理業務;

       P(getNum);//顧客數減1

       Number--;

V(getNum);

離開;

}

/*業務員程序實現*/

Process worker()

{

       While(1)

{

       P(customers);//取一個顧客號

V(callMe);//叫號

辦理業務;

}

}

拓展問題:顧客銀行辦理業務時,首先在取號機上取號,然後坐在椅子上等候業務員叫號時前往視窗辦理業務,如果等待時間超過1小時,則顧客離開.椅子有20把,如果沒有空椅子,則顧客站立,如果站立等待超過30分鐘,則顧客離開,等待假設銀行現在有3個視窗可辦理業務,請採用訊號量和PV操作描述顧取號等候叫號和銀行業務員叫號辦理業務的同步操作。