此文来源于微信公众平台:技术编程宇宙空间 (ID:xuanyuancoding),创作者:瑶光歪风
i 难题
“阿 Q 赶紧回家吧,旁边二号车间的虎子说我们修改了学生的数据信息,上门滋事了”
因为老 K 的突然冒出,不得不提早结束和小黑沟通交流,回到了 CPU 一号车间。
看到我回家,虎子马上朝我嘟囔:“大家是什么原因?才几纳秒的时间也,把信息帮我修改了,你觉得这件事情该怎么办吧!”
我听着昏昏沉沉的,不断提到:“虎子先别着急,我刚回家,究竟出啥事儿了,先要我考虑清楚怎么样?”
下面,老 K 把事情经过告诉了我。原先,我们俩 CPU 车间分别负责任的进程都是在实行一个 i 操作,大家还把 i 数值放进自己的缓存中,完了之后也没有通告另一方,添加了2次但结果却是只有一次,出现数据不一致难题。
原子操作
考虑清楚事情的原委以后,向您虎子讲到:“人们都实行一样的编码,这个事情也不能怪我们啊”
虎子一听急眼了,“如何不怨您了,大家比你们先一步找运行内存收走了 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 个车间又能够轻松愉快的上班了。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。