[{"data":1,"prerenderedAt":242},["ShallowReactive",2],{"post-mesi":3,"home":220},{"id":4,"title":5,"body":6,"date":209,"description":210,"extension":211,"meta":212,"navigation":213,"path":214,"seo":215,"stem":216,"tags":217,"__hash__":219},"blog\u002Fblog\u002Fmesi.md","MESI协议以及内存屏障",{"type":7,"value":8,"toc":197},"minimark",[9,13,17,23,30,34,50,56,61,64,139,144,147,150,154,157,160,163,166,172,180,183,186,189],[10,11,12],"h2",{"id":12},"缓存一致性",[14,15,16],"p",{},"由于L1\u002FL2 Cache是多个核心各自独有的，会带来缓存一致性的问题",[18,19,20],"blockquote",{},[14,21,22],{},"CPU Cache是由多个Cache Line组成，Cache Line也是CPU从内存读取数据的基本单位",[14,24,25],{},[26,27],"img",{"alt":28,"src":29},"cpu","https:\u002F\u002Fstarrobe-blog.oss-cn-beijing.aliyuncs.com\u002Fimages\u002Fcpu.png",[10,31,33],{"id":32},"mesi协议","MESI协议",[35,36,37,41,44,47],"ul",{},[38,39,40],"li",{},"Modified，已修改",[38,42,43],{},"Exclusive，独占",[38,45,46],{},"Shared，共享",[38,48,49],{},"Invalidated，已失效",[14,51,52],{},[26,53],{"alt":54,"src":55},"cpu memory1","https:\u002F\u002Fstarrobe-blog.oss-cn-beijing.aliyuncs.com\u002Fimages\u002Fmemory1.png",[18,57,58],{},[14,59,60],{},"CPU要从主存读写数据，需要向总线发起事务(读事务或写事务)来从主存读取或者写入数据",[14,62,63],{},"假设有两个CPU，A与B，内存中n的值为1",[65,66,67,85],"table",{},[68,69,70],"thead",{},[71,72,73,78,82],"tr",{},[74,75,77],"th",{"align":76},"left","操作",[74,79,81],{"align":80},"center","CPU A Cache 中数据的状态",[74,83,84],{"align":80},"CPU B Cache 中的数据的状态",[86,87,88,100,110,120,130],"tbody",{},[71,89,90,94,97],{},[91,92,93],"td",{"align":76},"1. B读取n时，此时Cache B中没有，从主存中读取",[91,95,96],{"align":80},"-",[91,98,99],{"align":80},"n变为独占状态",[71,101,102,105,108],{},[91,103,104],{"align":76},"2. A获取n时，此时Cache A中没有，而B收到总线通知，将n拷贝到Cache A",[91,106,107],{"align":80},"n变为共享状态",[91,109,107],{"align":80},[71,111,112,115,117],{},[91,113,114],{"align":76},"3. A要修改n的值时，通过总线发送失效指令，A收到B的ACK后才能进行修改",[91,116,99],{"align":80},[91,118,119],{"align":80},"n变为失效状态",[71,121,122,125,128],{},[91,123,124],{"align":76},"4. A修改完毕后，如令n=2",[91,126,127],{"align":80},"n变为已修改状态",[91,129,119],{"align":80},[71,131,132,135,137],{},[91,133,134],{"align":76},"5. 当B再次获取n时，发现自己是失效的，需要向A请求",[91,136,107],{"align":80},[91,138,107],{"align":80},[140,141,143],"h3",{"id":142},"store-buffer","Store Buffer",[14,145,146],{},"通过MESI保证了缓存一致性，即保证A与B缓存中的数据一致。但A的每次修改都需要等待B的ACK，会占用CPU的\n利用率，因此引用Store Buffer",[14,148,149],{},"当CPU发送失效指令后，将修改的数据放入Store Buffer，然后执行其他命令。当其他CPU都响应了ACK后，\nCPU Cache再从Store Buffer读取数据",[140,151,153],{"id":152},"store-forward","Store Forward",[14,155,156],{},"当修改后的数据还在Store Buffer，Cache中的数据仍是旧值时，CPU如果接到读取指令，会从Cache中读取到旧值。\n因此，当CPU读取数据时，会先查看Store Buffer中有没有，如果有则直接读取Store Buffer里的值，如果没有才\n读取Cache中的数据，这便是Store Forward",[140,158,159],{"id":159},"失效队列",[14,161,162],{},"所有的数据的修改都会存在Store Buffer中，而当Store Buffer满了后，CPU仍然需要等待ACK后才能进行修改。\n当其他CPU收到失效指令后，要先将数据置为失效状态，然后再响应ACK，而此时CPU可能很忙，不能及时处理",[14,164,165],{},"因此加入失效队列，当CPU收到失效指令时，将其放入失效队列中，并直接返回ACK，等到空闲时再处理队列中的消息",[14,167,168],{},[26,169],{"alt":170,"src":171},"cpu memory2","https:\u002F\u002Fstarrobe-blog.oss-cn-beijing.aliyuncs.com\u002Fimages\u002Fmemory2.png",[18,173,174,177],{},[14,175,176],{},"CPU的指令乱序执行是由Store Buffer以及失效队列造成的",[14,178,179],{},"假设缓存A，B中都有a，b。当CPU A先修改a后修改b时，可能会先收到b的ACK再收到a的ACK，即先修改b再修改a",[10,181,182],{"id":182},"内存屏障",[14,184,185],{},"Store Buffer不能保证最新的修改更新到主存，而CPU没有及时的读取失效队列的消息导致\n缓存数据没能及时变为失效状态，而直接被读取",[14,187,188],{},"内存屏障简单的说就是禁用Store Buffer以及失效队列",[35,190,191,194],{},[38,192,193],{},"在写入数据时，保证所有写入指令都执行完毕(Store Buffer都写入到Cache)",[38,195,196],{},"在读取数据时，保证所有失效队列的消息已经完成",{"title":198,"searchDepth":199,"depth":199,"links":200},"",2,[201,202,208],{"id":12,"depth":199,"text":12},{"id":32,"depth":199,"text":33,"children":203},[204,206,207],{"id":142,"depth":205,"text":143},3,{"id":152,"depth":205,"text":153},{"id":159,"depth":205,"text":159},{"id":182,"depth":199,"text":182},"2023-08-10","笔记","md",{},true,"\u002Fblog\u002Fmesi",{"title":5,"description":210},"blog\u002Fmesi",[218],"并发编程","s1oKyeYgJ-MS8sfNom9CTPc5fd0k76xYPgRSI0-exT8",{"id":221,"title":222,"avatar":223,"body":224,"description":228,"extension":211,"meta":229,"name":231,"navigation":213,"path":232,"seo":233,"social":234,"stem":240,"__hash__":241},"home\u002Fhome.md","Home","https:\u002F\u002Fstarrobe-blog.oss-cn-beijing.aliyuncs.com\u002Favatar\u002Fjashinchan.jpg",{"type":7,"value":225,"toc":226},[],{"title":198,"searchDepth":199,"depth":199,"links":227},[],"Programming enthusiast, maybe.",{"layout":230},"page","阿东","\u002Fhome",{"title":222,"description":228},{"github":235,"email":236,"bilibili":237,"qq":238,"rss":239},"https:\u002F\u002Fgithub.com\u002Fstarrobe","mailto:starrobe@163.com","https:\u002F\u002Fspace.bilibili.com\u002F382631863","tencent:\u002F\u002Fmessage\u002F?uin=2604335528","\u002Ffeed.xml","home","XHOrpn2fXb8x87SMsqZTGaANCESyH9qV8TDm8rnQewI",1777128585660]