返回介绍

那些烦人的同步和互斥问题

发布于 2025-01-22 00:38:45 字数 2076 浏览 0 评论 0 收藏 0

1 批处理和脱机打印 打印机程序, 准确的说是打印机进程, 在这个批处理系统中生活的非常自在, 它所在的机器叫做 IBM1401 , 除了打印之外什么也不干, 每天大部分时间都是歇着。

这个系统还有两台机器, 一台还是 IBM1401,它专门收集程序员写出来的穿孔卡片, 然后转成磁带。

然后操作员把磁带输入到 IBM7094 这个昂贵又强大的计算机上执行, 执行结果也会输出到磁带上。

最后磁带被拿到 1401 上进行打印, 这叫做 脱机打印 (不和 7094 相连接)。 3 冲突 但是这个队列可不是原来的磁带了, 它完全是个动态变化的东西,试运行还不到 20 秒, 冲突就出现了。

WPS 气冲冲的来着打印机进程:"打印机, 你怎么搞的, 我的 放假通知.wps 为什么没有打印?“ 打印机:“我没看到什么放假通知.wps 啊”

WPS: “我明明放在了编号为 3 的槽里, 怎么可能没有了?”

在操作系统老大的协助下, 大家查了半天,才知道是 Word 引起的:

当时 Word 插了一脚,也进来打印, 读到了 in = 3, 就是说队列中编号为 3 的槽是空着的, 他把 3 这个值放到了自己的局部变量 free_slot 中, 这时候发生了一次时钟中断 , 操作系统老大认为 Word 已经运行了足够长的时间,决定切换到 WPS 进程。

WPS 也读到了 in = 3, 把 3 也存到自己的局部变量 free_slot 中, 现在 Word, WPS 都认为 下一个空的槽是 3 !

WPS 接着干活, 他把文件放到了第 3 号槽里, 并且把 in 改为 4, 然后离开了。

接下来又轮到 Word 运行了, 它发现 free_slot 为 3 , 就把文件也放到了第 3 号槽里, 把 free_slot 加 1,得到 4, 存入 in 中。

可怜的 WPS , 他的文件被覆盖掉了。 但是打印机程序啥也察觉不出来, 照样打印不误。

4 临界区 很明显, Word 和 WPS 这两个进程甚至多个进程在读写 in 这个共享变量的时候, 最后的结果严重依赖于进程运行的精确次序, 这次是 WPS 的文件被覆盖掉了, 下次可能就是 Word 了。

这种对共享变量, 共享内存,共享资源进行访问的程序片段叫做临界区 , 代码在进入临界区之前一定要做好同步或者互斥的操作。

WPS 说: ”老大, 当时你切换 Word 的时候是不是发生了一次时钟中断 ?“

操作系统: “是啊, 有了时钟中断我才能计算时间, 然后做进程切换啊”

“那在访问这个 in 共享变量的时候,我们自己能不能把这个中断给屏蔽? 这样就不会有进程切换, 肯定没问题了。” Word 问到。

“你想的美,时钟中断是最基本的东西, 我把这个权限给了你们应用程序, 到时候那个家伙屏蔽以后忘记开中断, 我们整个系统就要完蛋了! ” 操作系统狠狠的瞪了 Word 一眼, Word 赶紧噤声。

“不过我听说有些机器提供了一个特别的指令, 这个指令能检查并且设置内存的值, 而不会被打断, 叫做 TestAndSet, 如果用 C 语言描述的话,类似这样:” WPS 说: “果然是抽象大法好, 这多简单啊。 “ 操作系统说: “是啊, 无论是什么东西,抽象以后用起来好多了, 但是还是要了解底层,这样出现了类似于 BlockingQueue 这样的新概念, 你能迅速搞明白。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文