计算机操作系统习题及答案.docx
《计算机操作系统习题及答案.docx》由会员分享,可在线阅读,更多相关《计算机操作系统习题及答案.docx(12页珍藏版)》请在冰豆网上搜索。
计算机操作系统习题及答案
第4章进程同步与通信
1〕选择题
〔1〕在操作系统中,P、V操作是一种_D__。
A.机器指令B.系统调用命令
C.作业控制命令D.低级进程通信原语
〔2〕假设信号量S的初值为2,当前值为-1,那么表示有_B__等待进程。
A.0个B.l个
C.2个D.3个
〔3〕在直接通信方式中,系统提供两条通信原语进展发送和接收,其中Send原语中参数应是_C_。
A.sender,messageB.sender,mailbox
C.receiver,messageD.receiver,mailbox
〔4〕下述那个选项不是管程的组成局部_A__。
A.管程外过程调用管程内数据构造的说明
B.管程内对数据构造进展操作的一组过程
C.局部于管程的共享数据说明
D.对局部于管程的数据构造设置初值的语句
〔5〕某通信方式通过共享存储区来实现,其属于_D__。
A.消息通信B.低级通信
C.管道通信D.高级通信
〔6〕用P、V操作管理临界区时,信号量的初值应定义为__C__。
A.-1B.0
C.1D.任意值
〔7〕临界区是_B__。
A.一个缓冲区B.一段程序
C.一段共享数据区D.一个互斥资源
〔8〕信箱通信是一种_D__通信方式。
A.直接通信B.信号量
C.低级通信D.间接通信
〔9〕对于两个并发进程,设互斥信号量为mutex,假设mutex=0那么__A_。
A.表示有一个进程进入临界区
B.表示没有进程进入临界区
C.表示有一个进程进入临界区,另一个进程等待进入
D.表示有两个进程进入临界区
〔10〕对信号量S执行V操作后,下述选项正确的选项是_C__。
A.当S小于等于0时唤醒一个阻塞进程
B.当S小于0时唤醒一个阻塞进程
C.当S小于等于0时唤醒一个就绪进程
D.当S小于0时唤醒一个就绪进程
〔11〕在消息缓冲通信中,消息队列属于_A__资源。
A.临界B.共享C.永久D.可剥夺
〔12〕在消息缓冲通信机制中,使用的临界资源是_D__。
A.信箱B.消息队列中的某个缓冲区
C.管道D.整个消息队列
2〕填空题
〔1〕信号量的物理意义是:
当信号量值大于0时表示可用资源的个数;当信号量值小于0时,其绝对值为等待该信号量的进程数。
〔2〕如果信号量的当前值为-4,那么表示系统中在该信号量上有__4__个等待进程。
〔3〕对于信号量可以做P操作和V操作,P操作用于阻塞进程,V操作用于释放进程。
程序中的P和V操作应慎重使用,以保证其使用的正确性,否那么执行时可能发生死锁。
〔4〕有m个进程共享同一临界资源,假设使用信号量机制实现对临界资源的互斥访问,那么信号量值的变化范围是_[-(m-1),1]_。
〔5〕管程由局部于管程〔资源对象〕的共享变量的说明、对管程〔资源对象〕数据进展操作的一组过程和对局部于管程的数据设置初始值的语句三局部组成。
〔6〕访问临界资源的进程应该遵循的条件有:
空闲让进、忙那么等待、有限等待和让权等待。
〔7〕每个信箱可以包含信箱头和信箱体两局部。
〔8〕为了实现消息缓冲通信,在PCB中应增加的数据项有消息队列中消息资源的信号量、对消息队列互斥操作的信号量和指向消息队列的指针。
3〕解答题
〔1〕什么是临界资源?
什么是临界区?
对临界资源的访问有哪些原那么?
答:
一次仅允许一个进程使用的共享资源被称为临界资源。
每个进程中访问临界资源的那段程序称为临界区。
对临界资源的访问原那么是:
①空闲让进,如果有假设干进程要求进入空闲的临界区,一次仅允许一个进程进入。
②忙那么等待,任何时候,处于临界区内的进程不可多于一个。
如已有进程进入自己的临界区,那么其它所有试图进入临界区的进程必须等待。
③有限等待,进入临界区的进程要在有限时间内退出,以便其它进程能及时进入自己的临界区。
④让权等待,如果进程不能进入自己的临界区,那么应让出CPU,防止进程出现“忙等〞现象。
〔2〕请给出P、V操作的定义。
如何用P、V操作实现进程间的互斥?
解:
P原语操作的动作是:
①sem减1;
②假设sem减1后仍大于或等于零,那么进程继续执行;
③假设sem减1后小于零,那么该进程被阻塞后进入与该信号相对应的队列中,然后转进程调度。
V原语操作的动作是:
①sem加1;
②假设相加结果大于零,那么进程继续执行;
③假设相加结果小于或等于零,那么从该信号的等待队列中唤醒一等待进程,然后再返回原进程继续执行或转进程调度。
由于用于互斥的信号量sem与所有的并发进程有关,所以称之为公有信号量。
公有信号量的值反映了公有资源的数量。
只要把临界区置于P(sem)和V(sem)之间,即可实现进程间的互斥,sem的初值通常设置成1。
使用P、V操作实现进程互斥时应该注意的是:
①每个程序中用户实现互斥的P、V操作必须成对出现,先做P操作,进临界区,后做V操作,出临界区。
假设有多个分支,要认真检查其成对性。
②P、V操作应分别紧靠临界区的头尾部,临界区的代码应尽可能短,不能有死循环。
③互斥信号量的初值一般为1。
〔3〕请用P、V操作写出一个不会出现死锁的哲学家进餐问题的解?
解:
至多只允许四个哲学家同时进餐,以保证至少有一个哲学家能够进餐,最终总会释放出他所使用过的两支筷子,从而可使更多的哲学家进餐。
以下将room作为信号量,只允许4个哲学家同时进入餐厅就餐,这样就能保证至少有一个哲学家可以就餐,而申请进入餐厅的哲学家进入room的等待队列,根据FIFO的原那么,总会进入到餐厅就餐,因此不会出现饿死和死锁的现象。
semaphorechopstick[5]={1,1,1,1,1};
semaphoreroom=4;
voidphilosopher(inti)
{
while(true)
{
think();
wait(room);//请求进入房间进餐
wait(chopstick[i]);//请求左手边的筷子
wait(chopstick[(i+1)%5]);//请求右手边的筷子
eat();
signal(chopstick[(i+1)%5]);//释放右手边的筷子
signal(chopstick[i]);//释放左手边的筷子
signal(room);//退出房间释放信号量room
}
}
〔此题有多种解法。
〕
〔4〕高级进程通信方式有哪几类?
各自如何实现进程间通信?
答:
高级进程通信方式可以分为三大类:
共享存储器系统、消息传递系统以及管道通信系统。
在共享存储区系统中,进程通过共享内存中的存储区来实现通信。
在消息传递系统中,进程间的数据交换以消息为单位,程序员直接利用系统提供的一组通信命令〔原语〕来实现通信。
管道是用于连接读进程和写进程以实现它们之间通信的共享文件,向管道提供输入的发送进程〔即写进程〕以字符流形式将大量的数据送入管道,而接收管道输出的接收进程〔即读进程〕可以从管道中接收数据。
〔5〕设有6个进程P1、P2、P3、P4、P5、P6,它们有如图3.5所示的并发关系。
试用P、V操作实现这些进程间的同步。
解:
semaphorea,b,c,d,e,f=0,0,0,0,0,0;
{cobegin
P1;P2;P3;P4;P5;P6;
coend}
P1()
{P1;
V(a);
V(b);}
P2()
{P(a);
P2;
V(c);}
P3()
{P(b);
P3;
V(d);}
P4()
{P(c);
P4;
V(e);}
P5()
{P(d);
P5;
V(f);}
P6()
{P(e);
P(f);
P6;}
〔6〕有一个单向行驶的公路桥,每次只允许一辆汽车通过。
当汽车到达桥头时,假设桥上无车,便可上桥;否那么需等待,直到桥上的汽车下桥为止。
假设每一辆汽车为一个进程,请用P、V操作保证汽车按要求过桥。
解:
此题中使用一个信号量m用于互斥过河,因为每次允许一辆汽车通过,所以m初值为1。
semaphorem=1;
main()
{cobegin
passi();
coend}
passi()
{P〔m〕;
Passtheriver;
V〔m〕;
}
passi表示第i辆汽车。
〔7〕有3个并发进程R、M、P,它们共享了一个可循环使用的缓冲区B,缓冲区B共有n个单元。
进程R负责从输入设备读信息,每读一个字符后,把它存入到缓冲区B的一个单元中;进程M负责处理读入的字符;进程P负责把处理后的字符取出并打印输出。
只有当缓冲区单元中的字符被进程P取出后,才又可用来存放下一次读入的字符。
请用P、V操作为同步机制写出它们能正确并发执行的程序。
解:
semaphorebuffer_number=n;
semaphorechar_number=0;
semaphoreman_number=0;
main()
{cobegin
R;M;P;
coend}
R()
{while(true)
{P(buffer_number);
readachartobuffer;
V(char_number);
}
}
M()
{while(true)
{P(char_number);
manipulateachar;
V(man_number);
}
}
P()
{while(true)
{P(man_number);
printachar;
V(buffer_number);
}
}
〔8〕在生产者-消费者问题中,如果对调生产者描述中的两个P操作会发生什么情况?
如果对调生产者描述中的两个V操作的顺序又会发生什么情况?
答:
在生产者-消费者问题中,如果将两个P操作位置对调,都可能引起死锁。
考虑系统中缓冲区全满前时,假设一生产者进程先执行了P(mutex)操作并获得成功,当再执行P(empty)操作时,它将因失败而进入阻塞状态,它期待消费者执行V(empty)来唤醒自己。
在此之前,它不可能执行V(mutex)操作,从而使企图通过P(mutex)进入自己的临界区的其他生产者和所有的消费者进程全部进入阻塞状态,从而引起系统死锁。
类似地,消费者进程假设先执行P(mutex),后执行P(full),同样可能造成死锁。
V(full)和V(mutex)互换位置,或者V(empty)和V(mutcx)互换位置,那么不会引起死锁,其影响只是使临界资源的释放略为推迟一些。
〔9〕一个快餐厅有4类职员:
①领班:
承受顾客点菜;②厨师:
准备顾客的饭菜;③打包工:
将做好的饭菜打包;④出纳员:
收款并提交食品。
每个职员可被看作一个进程,试用一种同步机制写出能让四类职员正确并发运行的程序。
解:
semaphoreS1=1;//S1表示是否可以开场点菜
semaphoreS2=0;//S2表示是否可以开场做菜
semaphoreS3=0;//S3表示是否可以开场打包
semaphoreS4=0;//S4表示是否可以提交食品
main()
{cobegin
LB〔〕;
CS〔〕;
DBG〔〕;
CNY〔〕;
coend}
LB()
{while(true)
{
顾客到达;
P(S1);
承受顾客点菜;
V(S2);
}}
CS()
{while(true)
{
P(S2);
准备顾客的饭菜;
V(S3);
}}
DBG()
{while(true)
{
P(S3);
打包顾客的饭菜;
V(S4);
}}
CNY()
{while(true)
{
P(S4);
收款并提交食品;
V(S1);
}}
〔10〕设公共汽车上,司机和售票员的活动分别如下:
①司机的活动:
启动车辆:
正常行车;到站停车。
②售票员的活动:
关车门;售票;开车门。
在汽车不断地到站、停车、行驶过程中,这两个活动有什么同步关系?
用信号量和P、V操作实现它们的同步。
解:
semaphores1=0;//s1表示是否允许司机启动汽车,其初值为0
semaphores2=0;//s2表示是否允许售票员开门,其初值为0
main()
{
cobegin
driver();
busman();
coend
}
driver()
{while(true)
{
P(s1);
启动车辆;
正常行车;
到站停车;
V(s2);}
}
busman()
{while(true)
{
关车门;
V(s1);
售票;
P(s2);
开车门;
上下乘客;}
}
〔11〕有一只铁笼子,每次只能放入一只动物,猎手向笼中放入老虎,农民向笼中放入猪,动物园等待取笼中的老虎,饭店等待取笼中的猪,试用P、V操作实现猎手、农民、动物园和饭店的同步。
解:
semaphorecage=1;//cage表示可用的铁笼子资源
semaphorepig=0;//pig表示可用的猪资源
semaphoretiger=0;//tiger表示可用的虎资源
main()
{
cobegin
hunter();
peasant();
zoo();
restaurant();
coend
}
hunter()
{while(true)
{
P(cage);
placeatiger;
V(tiger);}
}
peasant()
{while(true)
{
P(cage);
placeapig;
V(pig);}
}
zoo()
{while(true)
{
P(tiger);
takeatiger;
V(cage);}
}
restaurant()
{while(true)
{
P(pig);
takeapig;
V(cage);}
}