Assembly 是否在非缓存内存上锁定CMPXCHG?

Assembly 是否在非缓存内存上锁定CMPXCHG?,assembly,x86,x86-64,Assembly,X86,X86 64,一个简单的问题:是否可以在非缓存内存(即页面表中标记为非缓存的页面)上锁定CMPXCHG 此答案的内容与的内容非常相似,特别是“锁定”部分,我参考了该部分以了解启用快速路径互连(QPI)的系统上的锁定。 因此,这篇文章被标记为“社区维基” 是的,有可能 8086没有缓存,但能够缓存。 这是由于在系统中引入了#锁定信号而实现的。当这个信号被断言时,任何代理都不能启动新的事务,只有锁定的事务可以被执行(实际上),因此系统 随着缓存的引入,对总线锁的需求减少了。处理器可以通过在锁定期间延迟来自其他代理

一个简单的问题:是否可以在非缓存内存(即页面表中标记为非缓存的页面)上锁定CMPXCHG

此答案的内容与的内容非常相似,特别是“锁定”部分,我参考了该部分以了解启用快速路径互连(QPI)的系统上的锁定。
因此,这篇文章被标记为“社区维基”

是的,有可能

8086没有缓存,但能够缓存。
这是由于在系统中引入了#锁定信号而实现的。当这个信号被断言时,任何代理都不能启动新的事务,只有锁定的事务可以被执行(实际上),因此系统

随着缓存的引入,对总线锁的需求减少了。处理器可以通过在锁定期间延迟来自其他代理的任何请求来操作其缓存。
但是,由于向后兼容以及保护变量可能会丢失,保留了传统总线锁

当FSB为了支持(想想放弃集线器架构和多插座系统)而放弃时,“锁定”信号也被放弃了

现在,其中一个QPI代理被设计为静止主机(QM)。当处理器需要锁时,它会请求QM,QM会通知其他代理(包括DMA代理)停止任何未来的请求。
当每个代理向QM确认后,它会通知锁请求者系统已锁定。然后执行原子操作,完成后,向QM提交请求的解锁。最后,QM将继续通知其他代理再次允许新交易。

这样,锁定整个内存子系统的机制在现代设计中仍然存在并发挥作用。

为什么不呢?我想不起手册中有什么其他的说法。如果说有什么区别的话,那就是被特别处理的可缓存内存。这是可能的,只是慢一点。我认为缓存一致性更容易实现。有了缓存一致性,内核就可以在缓存中保留缓存线,直到操作完成。如果没有,我无法想象一个比锁定“总线”更现实的方法。是的,这就是QPI之前的实现方式。现在,有一个#锁信号的“虚拟”类比,其中一个代理充当静止主机,并指示另一个代理不启动任何进一步的事务。请参阅的锁定部分。回答得好。需要明确的是,关于QPI和缓存协议交互的讨论是否适用于单套接字系统?我不清楚。讨论的大多数机制都是为了保持多个套接字之间的一致性(其中QPI是它们之间的路径),但在单个套接字系统中,您没有这种复杂性,因为L3主要充当仲裁器(即,协调线程主要通过L3交换数据,L3是缓存的第一共享级别)。我不知道有DMA功能的代理,比如视频卡或stoage。也许他们会用它?@BeeOnRope,我真的不知道。来自微软的消息似乎表明PCIe根复合体负责锁定PCIe总线。它可以由三级缓存(充当QM)控制,也可以是QM本身(PCIe根复合体是否通过QPI连接?)