有一阅览室,读者进入时必须先在一张表上进行登记。该表为每一个座位列出一个表目(包括座位号、姓名、阅览时间),读者离开时要撤销登记信息。阅览室有100个座位。
问答题
为描述读者的动作,应编写几个程序,应设置几个进程?程序和进程之间的对应关系如何?
【正确答案】 在本题中,每个读者都可视为一个进程,有多少读者就有多少进程。这些进程称为读者进程,设为Pi(i=0,1,…)。读者进程Pi执行的程序包括:登记、阅览和撤销。每个读者进程的活动都相同,所以其程序也相同。进程和程序的关系是各读者进程共用同一程序。
【答案解析】
【正确答案】 在读者进程所执行的程序中,对登记和撤销都需互斥执行,其信号量的初值为1,而对进入阅览室也需互斥执行,其信号量为100。现用P,V操作描述如下: 读进程Pi(i=0,1,...) P(S1) P(S2) 登记 V(S2) 阅览 P(S2) 撤销 V(S2) V(S1) 其中信号量S1的初值为100,信号量S2的初值为1。
【答案解析】
问答题
有一只铁笼子,每次只能放入一只动物。猎手向笼中放入老虎,农民向笼中放入猪,动物园等待取笼中的老虎,饭店等待取笼中的猪,试用P,V操作写出能同步执行的程序。
【正确答案】 这个问题实际上可看作是两个生产者和两个消费者共享了一个仅能存放一件产品的缓冲器。生产者各自生产不同的产品,消费者各自取自己需要的产品。利用P,V操作编程为: begin semaphore:S,S1,S2; Parbegin Process hunter begin L1:have a tiger; P(S); put a tiger; V(S1); go to L1; end; Process peasant begin L2:have a pig; P(S); put a pig; V(S2); go to L2; end; Process hotel begin L3:P(S1); get a pig; V(S); eat a pig; go to L3; end; Process zoo begin L4:P(S2); get a tiger; V(S); eat a tiger; goto L4; end; parend
【答案解析】
问答题
有三个进程P
A ,P
B 和P
C 合作解决文件打印问题:P
A 将文件记录从磁盘读入主存的缓冲区1,每执行一次读一个记录;P
B 将缓冲区1的内容复制到缓冲区2,每执行一次复制一个记录;P
C 将缓冲区2的内容打印出来,每执行一次打印一个记录。缓冲区的大小等于一个记录大小。请用P,V操作来保证文件的正确打印。
【正确答案】 在本题中,进程PA,PB,PC之间的关系为:PA与PB共用一个单缓冲区,而PB又与PC共用一个单缓冲区。当缓冲区1为空时,进程PA可将一个记录读入其中;若缓冲区1中有数据且缓冲区2为空,则进程PB可将记录从缓冲区1复制到缓冲区2中;若缓冲区2中有数据,则进程PC可以打印记录。在其他条件下,相应进程必须等待。事实上,这是一个生产者—消费者问题。 为遵循这一同步规则,应设置四个信号量empty1,empty2,full1,full2,信号量empty1及empty2分别表示缓冲区1及缓冲区2是否为空,其初值为1;信号量full1及full2分别表示缓冲区1及缓冲区2是否有记录可供处理,其初值为0。其同步描述如下: int empty1=1; int empty2=1; int full1=0; int full2=0; main() { cobegin PA(); PB(); PC(); coend } PA() { while(1) { 从磁盘读一个记录: P(empty1); 将记录存入缓冲1; V(full1); } } PB() { while(1) { 从缓冲区1中取出记录: V(empty1); P(empty1); 将记录存入缓冲2; V(full2); } } PC() { while(1) { P(full2); 从缓冲区2中取出记录; V(empty2); 打印记录; } } 本题也是一个典型的生产者一消费者问题。其中的难点在于PB既是一个生产者又是一个消费者。
【答案解析】
问答题
某数据库有一个写进程,多个读进程,它们之间读、写操作的互斥要求是:写进程正在写该数据库时不能有其他进程读该数据库,也不能有其他进程写该数据库;读进程之间不互斥,可以同时读该数据库。请用信号量及P、V操作描述这一组进程的工作过程。
【正确答案】 在本题中,允许读进程同时读数据库,但写进程正在写数据库时不允许其他进程读数据库,也不允许其他进程写该数据库。为了解决读、写进程之间的同步,应设置两个信号量和一个共享变量:读互斥信号量rmutex,用于使读进程互斥地访问共享变量count,其初值为1;写互斥信号量wmutex用于实现写进程与读进程的互斥及写进程与写进程的互斥,其初值为1;共享变量count用于记录当前正在读数据库的读进程数目,初值为0。其工作过程如下: int rmutex=1; int wmutex=1; int count=0; main() { cobegin Reader(); Writer(); coend } Reader() { while(1) { P(rmutex): if(count==0) P(wmutex);//当第一个读进程读数据库时,阻止写进程写; count++; V(rmutex): 读数据库; P(rmutex); count--; if(count==0) V(wmutex);//当最后一个读进程读完数据库时,允许写进程写; V(rmutex); } Writer() { while(i) { P(wmutex); 写数据库; V(wmutex); } } 在本题中,要注意对信号量rmutex意义的理解。rmutex是一个互斥信号量,用于使读进程互斥地访问共享变量count。该信号量并不表示读进程的数目,表示读进程数目的是共享变量count。当一个读进程要读数据库时,应将读进程计数count增加1。如果此前(count加1以前)数据库中无读进程,还应对写互斥信号量wmutex做P操作,这样若数据库中无写进程,则通过P操作组织写进程写;若数据库中有写进程,则通过P操作让读进程等待。 同理,当一个读进程完成读数据库操作时,应将读进程计数count减少1;如果此时(count减1以后)数据库中已无读进程,还应对写互斥信号wmutex作V操作,以允许写进程写。
【答案解析】
问答题
抽烟问题:有一个烟草代理和三个抽烟者。抽烟者若要抽烟,必须具有烟草、烟纸和火柴。三个抽烟者中,一个缺烟叶、一个缺烟纸、一个缺火柴。烟草代理会源源不断地分别供应烟叶、烟纸和火柴,并将它们放在桌上。如果他放的是烟叶,则缺烟叶的抽烟者会拾起烟叶,制作香烟,然后抽烟;其他类推。试用信号量同步烟草代理和三个抽烟者。
【正确答案】 semaphore smoker[3];//初始0,三个抽烟者 semaphore material[3];//初始0,三种原料 semaphore agent;//初始1,供应商 int turn;//初始0,轮到谁 agent: while(1) { wait(agent); signal(smoker[turn]); signal(material[(turn+1)%3]); signal(material[(turn+2)%3]); turn=(turn+1)%3 } smoker—i: while(1) { wait(smoker[i]); wait(material[(i+1)%3]); Wait(material[(i+2)%3]); signal(agent); }
【答案解析】
提交答案
关闭