轮转之后,为什么结果错了?
调度决定谁先运行,同步保证共享数据正确。
刚执行的指令CPU 接下来执行
当前步骤
执行时间线
每格一条指令
同样的程序,换一个时间片
| 时间片 | 无锁:这次的结果 | 加锁保护 | 重新演示 |
|---|
调大时间片可能碰巧避开错误。一次运行正确,不能证明程序安全。两个进程必须使用同一把锁,保护完整的检查与更新过程。
课堂讨论与模型说明
本页是轮转调度的扩展示例。两个进程都在 t = 0 就绪,A 先运行;每次“下一步”执行一条教学指令。时间片 q 决定一轮最多执行几条指令,播放间隔只决定动画快慢。
加锁使用不可分割的获取操作;获取失败的进程进入阻塞等待,释放后被唤醒并重试。时间线中的“等”表示一次获取失败的尝试,等待本身不继续消耗 CPU 指令。
这些伪代码用于观察交错顺序,不表示高级语言的一行代码就是一条机器指令。转账例子将“读取两账户总额”简化为一次快照读取;真实程序同样需要让读写双方遵守一致的同步约定。
思考:如果只给“写回”那一行加锁,之前读到的旧值还可靠吗?