顾客银行办理业务时,首先在取号机上取号,然后坐在椅子上等候业务员叫号时前往窗口办理业务,假设银行现在有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操作描述顾取号等候叫号和银行业务员叫号办理业务的同步操作。