MESI问题

有一个变量a=0;有两个线程同时在多核环境下去执行a++去更改这个变量。 按照缓存一致性是不是应该是这样一个过程:两个cpu都把a读到缓存,此时a是一个S的状态,现在两个cpu都要去修改a,但是只能有一个cpu(假设是cpu1)把a修改为M状态,另一个会变为I(失效状态),当cpu2再要去执行a++的时候,会去主存读取a(因为缓存中的a已经是失效状态),这就会先触发cpu1缓存中的M状态的a(此时a=1)写回主存,然后cpu2才会读取到主存中a=1到缓存,这时两个cpu缓存中的a都变成S状态,然后cpu2再去做修改。---------过程如果是这样的话,最后输出的a一定是2了(测试结果并不是-。-)。

全部评论
你自己举的例子就已经说明不保证原子性了,我感觉你是对原子性的概念理解错了
点赞 回复 分享
发布于 2020-06-15 18:54
+1操作是三个操作
点赞 回复 分享
发布于 2020-06-15 18:56
我觉得应该从失效化队列和写缓存器角度考虑吧。 “有一个cpu(假设是cpu1)把a修改为M状态,另一个会变为I(失效状态)”:cpu1修改了a的值之后,会给总线中发送消息,要求其他CPU把他们高速缓存中a的状态置为I。但是其他CPU收到消息后,为了提高响应效率,是把这个a放入失效化队列,然后就立刻给出回复,表示自己已经把a置成I了,其实缓存条目的修改是要滞后的。 写缓存器也是一样的,对于CPU1来说,要修改a的值,不是马上在高速缓存修改,而是把a的新值写入写缓存器, 从写缓存器同步到高速缓存还需要一点时间。  因为写缓存器和失效化队列是每个内核独有的,不能互相访问,所以会出现在CPU1已经修改了a的值的情况下,CPU2依然读到了旧的a的值。
点赞 回复 分享
发布于 2020-06-15 21:44

相关推荐

10-15 09:13
已编辑
天津大学 soc前端设计
点赞 评论 收藏
分享
ProMonkey2024:5个oc?厉害! 但是有一个小问题:谁问你了?😡我的意思是,谁在意?我告诉你,根本没人问你,在我们之中0人问了你,我把所有问你的人都请来 party 了,到场人数是0个人,誰问你了?WHO ASKED?谁问汝矣?誰があなたに聞きましたか?누가 물어봤어?我爬上了珠穆朗玛峰也没找到谁问你了,我刚刚潜入了世界上最大的射电望远镜也没开到那个问你的人的盒,在找到谁问你之前我连癌症的解药都发明了出来,我开了最大距离渲染也没找到谁问你了我活在这个被辐射蹂躏了多年的破碎世界的坟墓里目睹全球核战争把人类文明毁灭也没见到谁问你了(别的帖子偷来的,现学现卖😋)
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务