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

为何《操作系统概念》第9版中基于test_and_set的有界等待互斥算法采用无限do-while循环?

关于基于test_and_set的有界等待互斥算法中do-while(true)循环的疑问

我在学习Avi Silberschatz、Peter Baer Galvin、Greg Gagne所著的《操作系统概念》第9版的进程同步章节时,看到了一段基于test_and_set的「有界等待互斥」算法,具体代码如下:

do {
    waiting[i] = true;
    while (waiting[i] && test_and_set(&lock)) ;
    waiting[i] = false;
    /* 临界区 */
    j = (i + 1) % n;
    while ((j != i) && !waiting[j])
        j = (j + 1) % n;
    if (j == i)
        lock = false;
    else
        waiting[j] = false;
    /* 剩余区 */
} while (true);

我已经理解了该算法的逻辑,但不清楚为何要使用无限的do-while(true)循环?


这其实是进程同步算法里的标准设计思路,原因主要有两点:

  • 贴合进程的持续运行特性
    在操作系统中,绝大多数进程都是持续执行、反复需要访问共享资源的——比如循环处理请求的服务器进程、不断读取输入的交互进程。do-while(true)的无限循环,正好模拟了进程这种「永不终止、重复执行核心工作流程」的行为。

  • 保证互斥框架的完整性
    这段代码是一个完整的互斥控制框架,它需要覆盖「尝试获取锁→进入临界区→执行临界区操作→释放锁/唤醒下一个进程→执行剩余区代码→再次尝试获取锁」的全流程。无限循环让这个同步流程可以反复运行,满足进程在生命周期内多次访问临界区的需求。

简单来说,这个无限循环就是为了让进程能不断重复它的核心工作:每次完成一轮临界区和剩余区的操作后,立刻回到起点,重新尝试进入临界区,完美匹配实际进程的运行模式。


内容的提问来源于stack exchange,提问作者Nikhil Mishra

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 07:57:39