知识卡片
信号量与临界区:解决竞态条件
内容
多个进程共享同一个不可复用的资源(如打印机)时,用一个”标志位”(0 表示空闲、1 表示占用)来协调访问看似简单,但”检查标志是否为0”和”把标志置为1”这两步操作之间如果被中断打断,两个进程就可能都以为自己抢到了资源——这就是竞态条件。解决办法是让”检查并置位”这两步在硬件层面被打包成一条不可分割的机器指令(test-and-set),或者在执行这段代码期间临时禁止中断,从而保证这段被称为临界区的代码一次只能被一个进程完整执行,这种排他性要求叫互斥;一个被正确实现、能够可靠守护临界区的标志,就称为信号量。发散:竞态条件的根源永远是”检查状态”和”修改状态”这两步被拆成了两条独立指令、中间留出了被打断的窗口,这个模式在多线程编程里换了个名字继续出现(check-then-act 反模式),解法思路也完全一致——要么让检查和修改原子化,要么在这段窗口内彻底禁止别人插手。
参考来源
《计算机科学概论》第3章《操作系统》