问答题
有一个阅览室,读者进入阅览室必须先在一张登记表上登记,该表为每一座位设一个表目,读者离开时要消掉其登记信息,阅览室共有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); //释放这个空座位
离开;
}
【答案解析】