作者回复: 这是两个级别的事情。CPU与内存之间打交道,中间会经过缓存。这是一个级别,CPU与外设之间通过DMA通讯,内存做为buffer,这是另外一个级别。你担心的DMA区域的读写冲突,CPU会保证的,CPU把一块内存当做DMA区域之后,这块区域的所有权可以认为是外设的,只有当DMA完成后,外设发起中断通知CPU,这块内存还给你了,CPU再会去读这一块的内容。
作者回复: 1. 写传播不光要告诉其他CPU(比如就是CPU1)那块缓存无效了,还要告诉它新的值是什么。有些时候,CPU1其实并不太需要立即知道那里的值是什么。只需要在CPU1读数据的时候再知道。所以写无效就是通知一下CPU1,你那里的副本失效了啊,你需要的话再来问我要。写传播则是我每一次更新都要把新的值通知给你。这是两者的区别。 2. 这个是确实是笔误,我尽快修复。谢谢。
作者回复: 我们讲核间通讯,默认就是核间总线了。是cpu内部的。
作者回复: 必然,所以第16课讲解了一些优化的办法,但这需要软件工程师的配合。
作者回复: 是的,已经修复,谢谢。
作者回复: 请读一下第16节课,了解了内存屏障,然后我们会在第18节课再讲Java内存模型。所以volatile需要的前置知识非常多。你可以看一下目录先了解一下后面的课程内容。
作者回复: 不一定,学完第16节和第18节课你就明白了,有的CPU,比如x86,它的硬件提供了比较强的缓存一致性支持,但有的CPU,比如Arm,它指供的缓存一致性支持就很弱,这就需要软件工程师在正确的位置插入内存屏障来保证这种一致性。
作者回复: Wiki吧。因为其实各个CPU的设计都不相同。MESI只是一个基本的总结。Intel和AMD两家使用的核间同步协议都不相同。比如AMD真正使用的是自己改进的版本MOSEI,可以看各家CPU自己的编程手册,例如AMD的:http://developer.amd.com/wordpress/media/2012/10/24593_APM_v21.pdf