首页 > 试题广场 >

题目来源于王道论坛 进程P0和P1的共享变量定义及其初

[单选题]
题目来源于王道论坛

进程P0和P1的共享变量定义及其初值为:

boolean flag[2];

int turn=0;

flag[0]=FALSE;flag[1]=FALSE;

若进程P0和P1访问临界资源的类C伪代码实现如下:


则并发执行进程P0和P1时产生的情形是()。




  • 不能保证进程互斥进入临界区,会出现“饥饿”现象
  • 不能保证进程互斥进入临界区,不会出现“饥饿”现象
  • 能保证进程互斥进入临界区,会出现“饥饿”现象
  • 能保证进程互斥进入临界区,不会出现“饥饿”现象
推荐

这是皮特森算法的实际实现,保证进入临界区的进程合理安全。该算法为了防止两个进程为进入临界区而无限期等待,设置变量turn,表示不允许进入临界区的编号,每个进程在先设置自己标志后再设置turn标志,不允许另一个进程进入,这时,再同时检测另一个进程状态标志和不允许进入表示,这样可以保证当两个进程同时要求进入临界区时只允许一个进程进入临界区。保存的是较晚的一次赋值,则较晚的进程等待,较早的进程进入。先到先入,后到等待,从而完成临界区访问的要求。

其实这里可以想象为两个人进门,每个人进门前都会和对方客套一句“你走先”。如果进门时没别人,就当和空气说句废话,然后大步登门入室;如果两人同时进门,就互相请先,但各自只客套一次,所以先客套的人请完对方,就等着对方请自己,然后光明正大地进门。

发表于 2018-09-03 20:27:35 回复(2)
皮特孙算法! 互相谦让,不会出现饥饿,可保证互斥进入。 单标志法 违背 空闲让进 双标志先检查法 违背 忙则等待 双标志后检查法 可能 饥饿
发表于 2018-12-04 23:44:10 回复(0)
turn是共用的,P0P1刚开始是都能进入whiletrue)循环体的,这之前没有限制,此时假设P0先进入了,此时将trun改为了1flag[0]改为了true,程序在进入临界区争抢临界资源前那段代码是逗能执行的,所以P2当仁不让的也执行了循环体中第一行代码,将flag[1]改为了true,此时因为可能收尾有一个差异就是它后面执行吧turn又改为了0,那么此时P1P2都在进行循环体里面的嵌套循环体判断条件,此时P1很明显不满足,所以等待区去了,P2就刚好满足因为此时全局标识flag[0]=true&&turn=0。那么同理,如果P0“稍”后一点把turn改成了1,反向思维,P0就可以进入临界资源了,P2这回就得等待了
发表于 2019-01-07 11:56:42 回复(1)
为啥选D啊,我理解的选C
编辑于 2024-03-27 18:06:25 回复(0)