曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 3566|回复: 0
打印 上一主题 下一主题

[X86] 总线监测(Bus Watching)

[复制链接]

4917

主题

5879

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34382
跳转到指定楼层
楼主
发表于 2011-3-12 17:44:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
总线监测技术的基本原理是:


CPU 和 外部设备 访问内存时都必须经过总线仲裁,现在使用一个专门的硬件模块记录在缓存中的内存区域,当外部设备对内存进行写入操作时,该模块判断这个区域是否位于 CPU 缓存中,如果是则使缓存无效。缓存无效后,就会重新加载内存刷新缓存。当外部设备读取内存时,如果这个内存区域在缓存中,并且缓存已经被 CPU 修改,就把缓存写到内存中。这样内存就得到了更新。

所以,在 X86 的单 CPU 平台上,软件不需要考虑内存一致性问题,但是在多 CPU 平台上情况会变得复杂。

在多 CPU 的系统中,各个 CPU 都有各自独立的缓存,而缓存大小远远小于内存大小,因此缓存和内存是一对多的关系。也就是说一个缓存行可以对应多个内存区域。在这种情况下,可能 CPU1 对缓存的修改还没回写到内存中,但此时 CPU2 已经已经发出读取操作(假设 CPU2 读取的内存区域还未曾经加载到缓存中),这时 CPU2 读取到的是旧的数据。即使 CPU1 及时地把修改的内容回写到内存中,但由于 CPU2 在此之前已经把对应的内存区域读取到缓存中,因此 CPU2 仍然是从换从中读取旧数据。


然而,有总线监测技术的保证,X86 架构可以保证 写操作 的 cache 和内存的一致性。假设 CPU1 对某个内存地址进行了写操作,结果保存在 CPU 的缓存中,且没有及时回写到内存。这时,CPU2 对相应内存进行读取,只要对应的内存地址在此之前并没有在 CPU2 的缓存中 (CPU2 由于没有缓存命中,因此通过内存总线对该地址进行了一次读取操作),在这种情况下,总线监测模块仍然能够保证 CPU2 读取到的是最新的值。因此,在对关键数据结构的写入操作后,软件不需要额外的考虑内存屏障问题。如果对应的内存之前就被保存到 CPU2 的缓存中,由于读操作是不需要经过内存总线的,因此总线监测模块对确保读取到最新数据就无能为力了,所以在读取操作之前 CPU2 必须使自己的缓存无效。在 X86 中,有许多指令能够做到这一点,比如使用 lock 前缀的指令可以使缓存无效。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2024-5-15 19:02 , Processed in 0.081898 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表