就为了一个原子操作,其他 CPU 核心罢工了
消息来源:baojiabao.com 作者: 发布时间:2024-05-10
本文来自微信公众号:编程技术宇宙 (ID:xuanyuancoding),作者:轩辕之风
i++ 问题
"阿 Q 赶快回去吧,隔壁二号车间的虎子说我们改了他们的数据,上门来闹事了"
由于老 K 的突然出现,我不得不提前结束与小黑的交流,赶回了 CPU 一号车间。
见到我回来,虎子立刻朝我嚷嚷:"你们是怎么回事?才几纳秒的时间,就把数据给我改了,你说这事怎么办吧!"
我听着迷迷糊糊的,连连说到:"虎子你先别急,我刚回来,到底出什么事儿了,先让我了解清楚好不好?"
接下来,老 K 把事情的经过告诉了我。原来,我们两个 CPU 车间各自负责的线程都在执行一个 i++ 的操作,我们都把 i 的值放到了自己的缓存中,完了之后都没有通知对方,加了两次但结果却只有一次,出现了数据不一致问题。
原子操作
了解清楚事情的原委之后,我向虎子说道:"大家都执行一样的代码,这事儿也不能怪我们啊"
虎子一听急了,"怎么不怪你们了,我们比你们先一步找内存拿走了 i,那你们得等我们加完之后再用啊,不信你可以打电话问内存那家伙,看看是不是我们二号车间先来的"
"好好好,你先冷静一下,你看我们又不知道你们先去拿了,这不情有可原吗,再说现在事情已经出了,我们应该一起坐下来想个办法避免以后再次出现这种问题,你说是不是?"
虎子叹了口气问道:"那你说说你有什么办法?"
我继续说道:"你看啊,像咱们在执行 i++ 这种操作的时候就不应该被干扰"
"不被干扰?"
"对,比如虎子你们二号车间在访问 i 的时候,我们一号车间就不能访问,需要等着,等你们访问完成我们再来,非常简单的办法却很有用"
虎子听完一愣,"这不就是加锁吗?你是想怪程序员做 i++ 前没有加锁?"
"的确是加锁,不过这种简单操作还要程序员来加锁那也太麻烦了,咱们 CPU 内部处理好就行了"
"内部处理,你打算怎么实现?",虎子问到。
"这,,让我想想・・・",虎子问到了具体实现,我倒还没想到这一步。
这时,一旁的老 K 站了出来:"我倒是有个办法,可以找总线主任啊,他是负责协调各个车间使用系统总线访问内存的总指挥,让他在中间协调一下应该不难"
老 K 一语点醒梦中人,接着我们就去找了总线主任,后来我们商量出了一套解决方案:我们定义了一个叫原子操作的东西,表示这是一个不可切分的动作,谁要执行原子操作,总线主任就在系统总线上加上一个 LOCK#信号,其他车间的想去访问内存就得等着,直到原子操作指令执行完毕。
我们把这套方案上报了领导,很快就批下来了,后面我们 8 个车间都按照这套方案来工作,以后程序员们把 i++ 这样的动作换成原子操作后,问题就能迎刃而解。
不过施行了一段时间之后,各个车间却开始大倒苦水:就因为某个车间要执行一个原子操作,就让总线主任把系统总线锁住,其他车间的人都没法访问内存,都干不了活了,严重影响工作效率。
抱怨归抱怨,在没有更好的替代方案出现之前,日子还得过下去。
缓存引发的问题
不过,没过多久,数据不一致问题又一次出现了。
这一次,倒不是加法的问题,我们两车间还是因为各自缓存的原因,先后修改了变量的值,对方没有即时知道,误用了错误的值,以致酿成大错。
"阿 Q,上次那办法好是好,可解决不了这一次的问题啊",虎子再次找上门来。
"你来的正好,我正想去找你说这事呢"
"哦,是吗,难不成你想到破解之道了?"
"只是一些初步的想法,问题的核心在于现在咱们各个车间各自为政,都有自己的私有缓存,各自修改数据后向内存更新时也不互相打招呼,缺少一个联络机制"
虎子点了点头,"确实,所以咱们需要建立一个联络机制,来对各个车间的缓存内容进行统一管理是吗?"
"对!这事儿咱俩说了可不算,我建议召集 8 个核心车间的代表,统一开一个会议,详细讨论下这个问题。哦,对了,把总线主任也叫上,他经验丰富说不定能提供一些思路"
缓存一致性协议 MESI
很快,咱们 CPU 的 8 个核心车间就为此问题召开了会议,并且取得了非常重要的成果。
我们牵了一条新的专线,把 8 个核心车间连接起来,用于各个车间之间进行信息沟通,不同于 CPU 外部的总线系统,大家把这个叫片内总线。
新的线路铺设好了,以后大家就可以通过这条线路即时沟通,为了解决之前出现的问题,大家还制定了一套规则,叫做缓存一致性协议。
规则里面规定了所有车间的缓存单元 -- 缓存行有四种状态:
已修改 Modified (M)
缓存行已经被修改了,与内存的值不一样。如果别的 CPU 内核要读内存这块数据,要赶在这之前把该缓存行回写到主存,把状态变为共享 (S).
独占 Exclusive (E)
缓存行只在当前 CPU 核心缓存中,而且和内存中数据一样。当别的 CPU 核心读取它时,状态变为共享;如果当前 CPU 核心修改了它,就要变为已修改状态。
共享 Shared (S)
缓存行存在于多个 CPU 核心的缓存中,而且和内存中的内容一致。
无效 Invalid (I)
缓存行是无效的
四种状态之间的转换是这样的:
按照这套规则,大家不能再像以前那样随意了,各车间对自家缓存进行读写时,都要相互通一下气,避免使用过时的数据。
除此之外,还规定如果一块内存区域被多个车间都缓存,就不再允许多个车间同时去修改缓存了。
会议还有另外一个收获,以前被各车间诟病的每次原子操作都要锁定总线,导致大家需要访问内存的都只能干等着的问题也得到了解决。以后总线主任不再需要锁定总线了,通过这次的缓存一致性协议就可以办到。
自此以后,数据不一致的问题总算是根治了,咱们 8 个车间又可以愉快的工作了。
2022-12-21 17:27:01相关文章
- 美国法院裁定阿里须为Squishmallows玩具侵权案答辩
2023-12-28 19:59:34
- 小米汽车传员工3700人 雷军称小米汽车不可能卖9万9
2023-12-28 19:41:57
- 国家新闻出版署:认真研究《网络游戏管理办法(草桉徵求意见稿)》关切 实行前进一步完善
2023-12-28 19:14:56
- 天猫新规可以无条件申请“仅退款”了?淘宝天猫又离狗多多零元购近了一步
2023-12-28 18:57:55
- 印度以打击金融犯罪为由逮捕了两名 vivo 高管
2023-12-26 16:49:01
- 在国外微信收不到国内信息?微信和WeChat将被拆分
2023-12-15 10:40:15
- 苹果iPhone15 系列手机发布最新消息 预计上市发布时间9月
2023-08-06 23:21:02
- 华为将发布鸿蒙HarmonyOS4操作系统 功能五大升级支持设备清单
2023-08-06 23:17:37
- 整治自媒体网红账号 400万粉丝网红发布擦边视频被无限期封禁
2023-07-12 09:56:09
- 网传微信文件传输助手是真人是真的吗?微信官方回应
2023-06-27 15:53:32
- 电信移动送手机成了“信用购”?你上了运营商的贷款套路了吗?
2023-06-12 17:18:55
- 中国电信广东地区崩了无信号 客服回应已在核实处理
2023-06-08 15:39:04
- 消息称小米新能源汽车价格表正讨论定价区间:双版本不同配置,高配或超 35 万元
2023-03-06 12:56:03
- 华为因制裁被传或分拆剥离手机业务? 内部人士回应:可能性不大.
2023-03-05 23:26:41
- OPPO正式发布安第斯智能云,让终端更智能
2023-02-24 16:02:27
- 华为与OPPO签订全球专利交叉许可协议 包括5G蜂窝通信专利
2023-02-24 16:02:26
- 老蛙将推MINI镜头新品:目前未知具体规格 官宣将于12月20日发布
2023-02-24 16:02:26
- 首发全新35mm定制光学系统 努比亚Z50性能同样强悍
2023-02-24 16:02:25
- Redmi K60屏幕细节曝光:全系标配2K护眼柔性直屏+5000mAh大容量电池
2023-02-24 16:02:25
- OPPO Find N2今天发 合金金属折叠屏更轻了
2023-02-24 16:02:24