You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

操作系统中的饥饿算法:是否存在类似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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:46:34