操作系统中的饥饿算法:是否存在类似Peterson算法的无饥饿防护互斥算法?
存在!简化版无饥饿预防的共享标志互斥算法
你说的这种算法确实存在,本质上是去掉Peterson算法中用于保证公平性的turn变量,只保留每个进程的请求标志。咱们用类C语言的代码来直观展示,再拆解它的特性:
算法实现
假设有两个进程P0和P1共享临界区:
// 全局共享变量,所有进程可见 bool flag[2] = {false, false}; // 进程P0的执行逻辑 void process0() { while (true) { // 标记自己想要进入临界区 flag[0] = true; // 等待对方没有进入临界区的请求 while (flag[1]) { // 空循环等待,啥也不做 } // 进入临界区执行核心操作 critical_section(); // 退出后清除自己的请求标记 flag[0] = false; // 执行临界区之外的剩余代码 remainder_section(); } } // 进程P1的执行逻辑 void process1() { while (true) { flag[1] = true; while (flag[0]) { // 空循环等待 } critical_section(); flag[1] = false; remainder_section(); } }
为什么它能实现互斥?
这个算法严格满足互斥性:如果P0已经进入临界区,flag[0]会保持为true,此时P1执行到while(flag[0])会一直卡住,无法进入临界区;反之同理,两个进程绝对不可能同时进入临界区。
为什么它没有饥饿预防能力?
问题出在抢占的不公平性上:假设P0和P1几乎同时设置自己的flag为true,进入等待循环。如果P0先退出临界区,它会立刻把flag[0]设为false,紧接着又马上重新把flag[0]设为true——这时候P1还在傻乎乎地等flag[0]变false,结果P0又抢先一步进入了临界区。
如果这种场景反复发生,P1可能永远得不到进入临界区的机会,直接陷入饥饿状态。而Peterson算法里的turn变量就是用来解决这个问题的:进程设置自己的flag后,会把turn交给对方,哪怕自己先退出,下一次也得让对方优先进入,从机制上保证了公平性,避免了饥饿。
总结
这个简化算法完全符合你的要求:用共享标志变量实现互斥,但没有饥饿预防能力。它也常被用作教学中的反面例子,用来解释为什么公平性(饥饿预防)在互斥算法里是个很重要的设计目标。
内容的提问来源于stack exchange,提问作者Qwerto
相关产品推荐
相关产品推荐

