当前位置:首页 > 计算机操作系统习题及答案(4)
负责处理读入的字符;进程P负责把处理后的字符取出并打印输出。只有当缓冲区单元中的字符被进程P取出后,才又可用来存放下一次读入的字符。请用P、V操作为同步机制写出它们能正确并发执行的程序。
解:semaphore buffer_number=n; semaphore char_number=0;
semaphore man_number=0; main() { cobegin R;M;P; coend } R()
{ while (true)
{P(buffer_number); read a char to buffer; V(char_number); } } M()
{ while (true)
{P(char_number); manipulate a char; V(man_number); } } P()
{ while (true)
{P(man_number); print a char;
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 类职员:①领班:接受顾客点菜;②厨师:准备顾客的饭菜;③打包工:将做好的饭菜打包;④出纳员:收款并提交食品。每个职员可被看作一个进程,试用一种同步机制写出能让四类职员正确并发运行的程序。
解:
semaphore S1=1;// S1表示是否可以开始点菜
semaphore S2=0;// S2表示是否可以开始做菜 semaphore S3=0;// S3表示是否可以开始打包 semaphore S4=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 操作实现它们的同步。
解:
semaphore s1=0; //s1表示是否允许司机启动汽车,其初值为0 semaphore s2=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操作实现猎手、农民、动物园和饭店的同步。
解:
semaphore cage=1; //cage表示可用的铁笼子资源 semaphore pig=0; //pig表示可用的猪资源 semaphore tiger=0; //tiger表示可用的虎资源
main( ) {
cobegin hunter( ); peasant( ); zoo( );
restaurant( ); coend }
hunter( )
{ while (true)
{
P(cage); place a tiger; V(tiger); } }
peasant( )
{ while (true) {
P(cage); place a pig; V(pig); } } zoo( )
{ while (true) {
P(tiger); take a tiger; V(cage); } }
restaurant( ) { while (true) {
P(pig); take a pig; V(cage); } }
共分享92篇相关文档