请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

cpu缓存M中数据修改后在什么时候提交到主存呢?

//img1.sycdn.imooc.com//szimg/5aadd0d8000182ff09490516.jpg

老师在这里说M的值是存放正在编辑的数据,与主存的中数据是不一样的。  在某一个时间点中写回到主存中。  但是在哪一个时间点呢?不是很明白。 

 数据从M修改状态,假设他是在A核心上的内存中。如果B核心打算读取,那么就要把A核心的数据,同步到主存中。 同时把A核心的数据状态改成E独享。
是这样吗 ?如果是这样的话。 课程中说从E变到S是因为其他的CPU读取了该数据,就变成了共享状态。这里说的共享状态, 是说把这份数据,让多个CPU核心共享吗?  如果是多个CPU核心共享,是指一个指针指向呢,还是把这份数据复制 一份呢?

12479
收起

正在回答

2回答

我先从整体上对课程内容做一下阐述,再正面回答你的问题:

在一个典型多核系统中,每个核心都会有自己的缓存,共享主存总线,每个相应的CPU会发出读写请求。

一个缓存除在Invalid状态外都可以满足cpu的读请求,一个invalid的缓存必须从主存中读取(变成S或者E状态)来满足该CPU的读请求。

一个写请求只有在该cpu缓存状态是M或者E状态时才能被执行

如果缓存处于S状态,必须先将其它缓存中该缓存行变成Invalid状态

可以随时将一个非M状态的缓存作废,或者变成Invalid状态,而一个M状态的缓存必须先被写回主存。

一个处于M状态的缓存必须时刻监听所有试图读该缓存相对就主存的操作,这种操作必须在缓存将该缓存行写回主存并将状态变成S状态之前被延迟执行。

一个处于S状态的缓存也必须监听其它缓存使该缓存无效或者独享该缓存的请求,并将该缓存变成无效(Invalid)。

一个处于E状态的缓存也必须监听其它缓存读主存中该缓存行的操作,一旦有这种操作,该缓存行需要变成S状态。

对于M和E状态而言总是精确的,他们在和真正状态是一致的。而S状态可能是非一致的,如果一个缓存将处于S状态的缓存作废了,而另一个缓存实际上可能已经独享了该缓存行,但是该缓存却不会将该缓存行升迁为E状态,这是因为其它缓存不会广播他们作废掉该缓存的通知,同样由于缓存并没有保存该缓存行的copy的数量,因此即使有这种通知没有办法确定自己是否已经独享了该缓存行。

根据这个继续来回答你的问题,

现在如果A上该变量状态为M,做修改是可以直接修改的,而B如果要修改对应的同一个变量时,核心是看B现在到底是处于什么状态。

如果是共享状态,他代表的是该缓存可能被多个CPU缓存着,有其他CPU也缓存过这个变量。这里的共享本身就是一个状态,不是我们代码里的指针指向和数据复制。

5 回复 有任何疑惑可以回复我~
  • 提问者 温良恭 #1
    非常感谢!
    回复 有任何疑惑可以回复我~ 2018-03-20 13:12:48
Jimin 2018-03-18 11:02:26

你好,这是其他学员根据课程视频做的笔记 https://www.jianshu.com/p/be923a7beb2c ,你可以先看下。我现在人在外面稍微有些不便,你如果还有问题继续在这里接着回复就行,我晚点会继续帮你解答。祝你学习愉快~

0 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信