问答题 有一个阅览室,读者进入阅览室必须先在一张登记表上登记,该表为每一座位设一个表目,读者离开时要消掉其登记信息,阅览室共有100个座位,为了描述读者的动作,请用PV操作描述进程间的同步算法。 约定: 1)flag的值:0座位空闲,1座位被占用。 2)用语句:i=getflag(0)可搜索到一个空座位i,用语句i.falg=0或1可给标志位赋值。 3)用i=getname(readername)可搜索到某读者所登记的座位号i;用i.name=0或i.name=readrname,可给姓名字段赋值,0表示清除读者姓名。 4)计数信号量用count,互斥信号量用mutex。
【正确答案】该题所提供的已知条件和语句过多,容易给考生造成混乱,因此看到此题应先理清思路,不要考虑约定中提供的各种语句。首先,按照通常的同步互斥问题思路来思考。 读者进程:讲入阅览室首先应检查是否有空位子。若没有则等待,若有则登记,可设信号量count控制各进程对座位的争夺;读者离去时,便可释放该座位。登记时要对表中各量进行修改,该过程相对于各进程而言为互斥操作,因此设信号量mutex控制读者进入和离去时对表的互斥修改,题目所提供的各种语句只是用在修改登记表时所进行的具体操作,对本题的同步互斥问题无任何影响,照抄即可。读者进程实现如下: Semaphore count=100, mutex=1; Reader() { 进入阅览室; P(count); //占领一个空座位,没有则等待 P(mutex); //占用登记表 i=getflag(0); //找到空座位的编号 i.flag=1; //将位置标记为有人 i.name=readername; //写名字 V(mutex); //释放登记表 坐下看书; P(mutex); //占用登记表 i=getname(readername); //找到自己的位置 i.name=0; //把名字去掉 i.flag=0; //标记为无人 V(mutex); //释放登记表 V(count); //释放这个空座位 离开; }
【答案解析】