范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

CPU缓存一致性原理解释MESI协议

  一些常识
  CPU CL
  CPU不能直接访问内存(write-back内存模型,也是主流模型),必须通过L1-L3才能访问到内存(具体执行是L3环形总线); CPU访问内存的粒度(write-back模型)——cacheline,是以64字节为一块来访问的,跟os中页的概念类似,为了节约带宽;(原因参考CPU的时空局部性原理解释) L3 cache实际上兼有总线的功能——可以用来传递 数据  与消息  ——叫做环形互联——MESI——x86_64的缓存一致性协议就是在这个层面实现;同一个CL在CPU中会有多分拷贝,不同层与不同核都有多个副本;如图中 C1  会存在在L3-L1每层中,而不同核心因为多线程访问也会有副本;但尽管有这么多副本,他们都代表同一块虚拟内存空间;这篇文章要讨论的缓存一致性协议在X86_64构架下叫做 MESI  协议。什么是MESIMESI是4个单词的缩写: M-modified  (修改的),E-exclusive  (独占的),S-shared  (共享的)以及I-invalid  (失效的)。而对于MESI需要了解的头等大事是:MESI是用来控制CL 同步  的协议。我们从上图可以看到,在SMP多核多线程访问共享变量的情况下,同一块虚拟内存地址映射的CL会存在在不同CPU core中,那么它们的读写必然会产生同步问题,就跟高级语言中的多线程同步一样。 public class shutDownThread implements Runnable {     volatile int shutDownRequested;     volatile int counter;     public void shutDown(){         shutDownRequested = true;     }     @Override     public void run() {         while (!shutDownRequested) {             System.out.println(counter++);         }     } }   public class Demo01 {     public static void main(String[] args) throws InterruptedException {         Thread[] th = new Thread[10];         shutDownThread t = new shutDownThread();         for(int i=0;i<=9;i++){             th[i] = new Thread(t);             th[i].start();         }         Thread.sleep(1000);         t.shutDown();     } }
  借用一下这段经典的程序说明下为什么缓存行存在同步问题: Thread1将共享变量 counter  从内存加载进入core1核心的C1缓存行;然后Thread2也将 counter  从内存加载进入core2核心的C1缓存行;Thread1对 counter  加1,然后将C1写回;此时内存中counter  为1;Thread2也对 counter  加1,接着写回C1,此时内存counter  还是1;而我们想让Thread1与Thread2合作,将 counter  加到2改怎么做?对,进行同步才行,所以CPU也会有这个同步的问题,事实上只要是对共享变量有多个计算单元进行操作,都会产生同步问题,JVM的锁工作在高层,粒度更粗;而CPU的多核同步机制工作在底层,粒度更小而已机制都是一样的。多说一点,上面这段代码在有MESI的情况下也不能实现线程同步,原因是 counter++  这条语句看上去只有一句,但是对于CPU至少有三条:mov [counter] eax; //加载counter从内存到寄存器(这条mov还会继续分解成操作CL的微指令) add 1 eax  //+1 mov eax [counter] //写回操作
  可见 counter++  在执行的过程中,可能会被打断(比如时钟中断)造成不可能是原子的。这时,你可能会问MESI  的作用是啥?如果java可以写汇编,只要将 counter++  改成lock inc [counter]  就能立马变成原子操作了,这就是MESI协议在做影响。有兴趣的朋友可以试试看(intel x86 cpu哦)这里给个C++的实现,没有用到C++的任何锁,但是用汇编调起CPU原子锁来做同步: #include  #include  #include   const int TC = 4; int count = 0; bool flag = true; void inc_count() {     asm("movl   $1, %eax");     asm("LOCK addl %eax,count(%rip)"); //count是个寄存器相对寻址。lock prefix是CPU原子指令。 } void testRun() {     for(int i=0; i<10000;i++)     {         inc_count();     } }  int main() {     std::thread threads[TC]; // 默认构造线程     for (int i = 0; i < TC; ++i)     {         threads[i] = std::thread(testRun); // move-assign threads     }      std::this_thread::sleep_for(std::chrono::seconds(1));     std::cout << "main thread id:" << std::this_thread::get_id() << std::endl;     flag = false;     for (auto &thread : threads)     {         thread.join();     }      std::cout << "All threads joined!"               << " count:" << count<同步->flush  的任务都委托给store buffer  ,自己就可以异步地执行下一条指令了;提高了系统的吞吐量;当core2接收到 busWr  后,不会直接到处理引擎,而是先将消息缓存到invalidate queue  里面,紧接着就发送ack  给core1,提高吞吐量;此时core2的CL还没有变成I  状态,但是等invalidate queue  处理完成,最终会变成I  ,中间会有个延迟。缺点Store buffer:导致数据实际更新时间比数据更新到内存要早;也就是 内存数据更新出现了延迟 ; Invalidation queue:core实际感受到数据失效的时间延迟了,也就是 数据可见性延迟了 。 当然,在大部分时间不会有什么问题,只会感觉到系统性能提高了,但是在某些极端情况,比如:多线程,高并发的场景下因为延迟加大,所以就不能忽略了。要修正这个bug又要获得效率就是大名鼎鼎的——内存屏障干的事了。 总结MESI是缓存行一致性协议,有了这个协议,多核CPU可以实现核间高速的 原子指令  与数据共享  ;理论上一份内存数据只要load到CPU一次,即可通过MESI协议实现多核数据共享,提高了吞吐量; 缓存行  在高并发、高性能程序设计中影响巨大,后面通过单独章节详细聊聊缓存行的结构与原理;Store buffer  与Invalidate Queues  是MESI协议的副作用——导致内存屏障技术出现的根本原因。后面章节会单独讨论CPU中的原子指令与内存屏障  。原子指令  是实现高层锁机制的基础,它的性能直接影响到了操作系统与用户程序的性能,在并发激烈或者对性能要求非常苛刻的操作系统中尤其突出。例如著名的spinlock自旋锁的性能问题,x86就因为MESI  协议在core的数量不断增大的情况下,通过L3环形互联发送的消息指数增长,而修改单个CL会导致大量的同步消息发布到互联总线,产生了著名的惊群  问题,性能也会急剧下降。这直接使得Linux这种非常看重扩展性  的操作系统非常不满  ,RCU这种真正的无锁  黑科技正式诞生,成为linux一个重要的子系统。后面在讲述Linux的同步机制  章节详细展开讨论。参考「链接」——MESI又叫做伊利诺伊同步协议 头条专栏:简一说道的《高性能编程必备计算机硬件知识》 补充重排序
  CPU为了提高执行效率与指令的吞吐量,发明了很多黑科技其中 指令重排序  就是一个,而指令重排序中有一个就是Store buffer与Invalid queue  的副作用导致的。store buffer  会导致当前的store指令(修改CL的指令)延后执行,相当于这条store指令往后挪了;invalidation queue  会导致读取到老的值,也就是load指令前移了。
  还有哪些重排序? 分支预测 编译器重排序
  这里给我们了一个重要的启示:任何优化都是双刃剑,有好的一面就一定有副作用,做工程最重要的工作就是做好平衡,只要平衡得好就是好的产品,不要什么都想要,结果一塌糊涂。
  比如:MESI协议因为有了 Store buffer  与Invalidation Queue  加快了速度,但是在大并发的多线程程序下可能出现指令重排序的bug,造成程序状态紊乱;这时就要开发屏障指令来弥补。但是屏障指令的弥补肯定会抵消掉一部分Store buffer  带来的提升。但是这种平衡是可取的,因为多核多线程的目的就是提高CPU的并行  能力,这部分的收益足以承担屏障指令带来的损耗,整体来看是个好的设计。同样的道理也可以适用于分支预测与编译器重排序这两种提高性能的方式。 好了,完毕!

在亚马逊云Lightsail上部署Ghost博客,并启用CDNGhost是优秀的开源CMS系统,长期保持开源内容管理系统关注度首位。自2013年上线以来,一直保持快速增长,特别是从3。0版本以后,定位更加清晰,为独立出版商提供技术平台。在文本苹果从诞生到闻名全世界,乔布斯艰苦的创业之路史蒂夫乔布斯是美国苹果公司的创始人。在他很小的时候就被父母遗弃了,但是有对好心的夫妻领养了他。乔布斯被他的邻居(惠普公司员工)所影响,第一次见到电脑,他就开始对计算机有了朦胧的认识中国商业史之锤子科技第1集新东方里最会说相声的企业家各位朋友们大家好,我是李侃侃。上一回给大家讲了贾老板贾跃亭和他的乐视集团。这贾老板呢?画了一张大饼圈钱无数,坑了中国的半个娱乐圈,还有地产大佬许家印和孙红斌。可是有句话你别忘了,天中国用人民币购买伊朗石油首单后,下一个珍珠港事件可能将会出现目前,大部分的美元是锚定美债扩张规模来发行的,也就是美债本位制,与沙特和其他中东产油国的石油美元协议巩固了美元从传统的金本位转变后的货币地位,人为的制造了全球市场对美元的额外需求,美国科技企业大规模裁员,中国以外区域2023年会陷入经济衰退吗?将1天作为观察点,什么也看不到。这无非是与历史上任何一天一样,没什么区别。虽然北美的通胀数据在持续降低恢复到接近正常值,但现实中科技企业今年在持续裁员,给市场带来一丝不安的预期。最中国企业在卡塔尔世界杯中竟然实现了软硬兼施双剑合璧中国企业成卡塔尔世界杯最大赞助商中国制造负责参与建设做乙方,而中国品牌负责投资赞助做甲方,像不像男人负责挣钱养家,女人负责貌美如花的两口子?11月21日,万众瞩目的2022年世界杯习近平向联合国中国空间探索与创新全球伙伴关系研讨会致贺信11月21日,国家主席习近平向联合国中国空间探索与创新全球伙伴关系研讨会致贺信。习近平指出,近年来,中国积极开展空间探索活动,嫦娥揽月天问探火羲和逐日空间站巡天,不断深化人类对宇宙中国科大实现通讯波段的按需式量子存储据合肥日报报道记者从中国科学技术大学获悉,该校郭光灿院士团队李传锋周宗权研究组基于掺铒波导实现了通讯波段光子的按需式量子存储,向构建大尺度光纤量子网络迈出重要一步。相关成果近日发表信心为王茅台酒把门槛拉到1000亿,努力给行业吹暖风说在前面的话以下全部内容仅为交流学习!请勿以此为投资依据!以下全部内容仅供参考,不对投资者构成任何建议!文名酒观察研究员文斯南11月21日晚间贵州茅台公告,初步核算今年公司茅台酒含又一百强县榜单发布,江浙两省在前十强中揽下八席中国中小城市发展指数研究课题组国信中小城市指数研究院上周末发布2022年中国中小城市高质量发展指数研究成果,2022年度全国综合实力百强县中,江浙两省在前10名中包揽八席,前20名中石化与卡塔尔签署史上最大液化天然气项目北京日报客户端记者杨天悦11月21日,中国石化宣布与卡塔尔能源公司签署了为期27年的液化天然气(LNG)长期购销协议,卡塔尔能源公司将每年向中国石化供应400万吨LNG。据悉,该协
四十六岁了怀孕了,生还是不生?生吧,现在国家鼓励生三胎,况且你正是婚龄阶段,也正是生孩子的年龄。当下老龄化社会逐渐明显,年轻人的社会负担也逐渐加重,未来的劳动力也会逐渐缺乏,如果人口数量下降,会对整个社会有很大怎么让宝宝爱上辅食呢?最近也有很多宝妈留言说宝宝不爱吃辅食,总结了一下我家两个小饭霸的养成记,供大家参考一下哈。说在前面宝宝肯定会有个体差异,我们讲的喂养原则可能不适应于个别的宝宝,宝爸宝妈们也不要过于怀孕16周可以打掉吗?怀孕16周可以打掉吗?怀孕16周可以打掉,但由于胎儿月份比较大,所以需要到大型的正规医院住院进行引产。怀孕16周月份比较大,所以这个时候打掉胎儿,就需要到大型的正规医院住院进行引产想不明白,为什么那么多人看不惯陈亚男呢?中国几千年传统文化,讲究从一而终,不因富贵贫贱抛弃结发妻,不因功成名就而招摇过市。反过来看陈亚楠,依靠大衣哥名声能挣钱了百般刁难朱小伟,目的就一个,踹了朱小伟,直播在粉丝面前说老朱萌新买了个lol账号发现里面有DNF角色,大家帮我看看这样角色值多少钱?赚了吗?大家好,我是吃瓜。今天要说的话题是萌新买了个lol账号发现里面有DNF角色,大家帮我看看这样角色值多少钱?赚了吗?DNF账号买卖是正常的事情,而且由于当初玩家众多现在可以说很多人q和平精英如何用好AK?谢邀在和平精英中,AK不仅威力大,后坐力也不是一般人能掌控,所以玩家们都不是很喜欢用它。经常吐槽的一句话就是AK压不住,如果能为AK多一个配件槽,想都不想肯定是加一个握把了,但现阶澳门赛陈梦和王曼昱半决赛狭路相逢,陈梦能赢得复仇之战吗?WTT澳门赛,上半区女单半决赛对阵揭晓,世界第一陈梦将再次挑战新科世乒赛女单冠军王曼昱。这是两个人继世乒赛之后,再次在半决赛相遇。已经5连败于王曼昱的陈梦,能赢得复仇之战吗?下面也国足沦落到如今这般田地,问题到底出在哪里?要说好的球员,咱不是没有过,要说好的教练,咱们也不是没请过那么问题到底在哪呢?莫非真的是造化弄人,好的球员没遇到好的教练或者好教练没赶上好球员?足协,你来说说呗这问题到底谁出在哪了詹姆斯被质疑!威少被球队孤立,湖人队该何去何从呢?一个烂队,集齐一帮马上过气的老家伙,混个关注,增加点流量,赚点钱得了,还不自量力去争夺什么总冠军,战绩出现反差,实际上是战略认知上出现偏差,期望值定的过高,而球队人员结构的老化,已gucci都有哪些好看的鞋子推荐啊?其实Gucci的鞋子种类比较多,也被很多女孩子追捧,下面我就为大家推荐几款今年比较时尚的款式!1小白鞋,19FW水钻箭头,以前主要是小蜜蜂为主,每一个时代的小白鞋都在更新,这款小白男人多久洗一次头发最科学?别看洗头发简单,这里面学问大着呢。虽说男人头发短,修剪起来快,不像女人头发,理发难度高,洗头发也是比较麻烦。但是,不论男女,洗头发麻烦与否,都得掌握一定的频率。我认为间隔两天到三天