S1() {
?
v(b2); v(b3); } S2() {
p(b2);
?
v(b4); //v(b42) } S3() {
p(b3);
?
v(b4); //v(b43) } S4()
{//因为在S2及S3完成时均对b4做了v操作,因此这里要用两个p操作 p(b4);//p(b42) p(b4);//p(b43)
? }
5. 桌上有一空盘,允许存放一只水果。爸爸可向盘中放苹果,也可向盘中放桔子,儿子专等吃盘中的桔子,女儿专等吃盘中的苹果。规定当盘空时一次只能放一只水果供吃者取用,请用P、V原语实现爸爸、儿子、女儿三个并发进程的同步。
解:设置3个信号量S、SO、SA,信号量S表示盘子是否为空,其初值为1;信号量SO表示盘中是否有桔子,其初值为0;信号量SA表示盘中是否有苹果,其初值为0。 同步描述: int S=1; int SA=0; int SO=0; main() {
cobegin
father(); son();
daughter(); coend }
第 29 页 共 36 页
father() {
while(1)
{
p(S);//盘子是否空 将水果放入盘中;
if(放入的是桔子)v(SO);//变形
else v(Sa) //很少有学生如此做!而这却是本题的关键 } } son() {
while(1)
{
p(SO);//盘子中有无桔子 从盘中取出桔子; v(S); 吃桔子; } }
daughter() {
while(1)
{
p(SA);//盘子中有无苹果 从盘中取出苹果; v(S); 吃苹果; } }
6. 在单处理机的分时系统中,分配给进程P的时间片用完后,系统进行切换,结果调度到的仍然是进程P。有可能出现上述情形吗?如果可能请说明理由。
解:有可能出现上述情况。例如,若在进程P时间片用完后,被迫回到就绪队列时,就绪队列为空,这样进程P就是就绪队列中唯一的一个进程,于是调度程序选中的进程必然是进程P;又如在按优先级调度的系统中,就绪队列按进程优先级排列,在进程P时间片用完之后回到就绪队列时,若其优先级高于当前队列中的其他进程,则它将排在就绪队列之首,从而再次被调度程序选中并投入运行。
第 30 页 共 36 页
7. 哲学家甲请哲学家乙、丙、丁到某处讨论问题,约定全体到齐后开始讨论问题;在讨论的间隙4位哲学家进餐,每人进餐时都需使用刀、叉各一把,餐桌上的布置如图。请用信号量及P、V操作说明这4位哲学家的同步、互斥过程。 解:在本题中,应设置4个信号量fork1、fork2、knife1、knife2,其初值均为1,分别表示资源叉1、叉2、刀1、刀2是否可用。同步描述如下: int fork1=1; int fork2=1; int knife1=1; int knife2=1; main() {
cobegin Pa(); Pb(); Pc(); Pd(); Coend } Pa() {
while(1) {
p(knife1); p(fork1); 进餐; v(knife1); v(fork1); 讨论问题; } } Pb() {
while(1) {
p(knife2); p(fork1); 进餐; v(knife2); v(fork1); 讨论问题; } } Pc() {
第 31 页 共 36 页
while(1) {
p(knife2); p(fork2); 进餐; v(knife2); v(fork2); 讨论问题; } } Pd() {
while(1) {
p(knife1); p(fork2); 进餐; v(knife1); v(fork2); 讨论问题; } }
8. 请用信号量实现对某数据库的读者-写者互斥。 要求:(1)读者与写者之间互斥,写者与写者之间互斥。 (2)读者之间不互斥。
解:本题是读者-写者问题。在本题中,允许读进程同时读数据库,但写进程正在写数据库时不允许其他进程读该数据库,也不允许其他进程写该数据库。为了解决读、写进程之间的同步,应该设置2个信号量和一个共享变量:读互斥信号量rmutex,用于使读进程互斥地访问共享变量count,其初值为1;写互斥信号量wmutex,用于实现写进程与读进程的互斥及写进程与写进程的互斥,其初值为1;共享变量count,用于记录当前正在读数据库的读进程数目,初值为0。其工作过程描述如下: Semaphore rmutex=1; Semaphore wmutex=1; Int count=0; Main() {
Cobegin
Reader(); Writer(); Coend }
Reader()
第 32 页 共 36 页