﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-C小加-随笔分类-操作系统</title><link>http://www.cppblog.com/cxiaojia/category/18218.html</link><description>算法的实现依赖于数据结构的设计</description><language>zh-cn</language><lastBuildDate>Wed, 23 Nov 2011 09:13:04 GMT</lastBuildDate><pubDate>Wed, 23 Nov 2011 09:13:04 GMT</pubDate><ttl>60</ttl><item><title>高速缓存（cache）和主存内容不一致的情况及其处理办法</title><link>http://www.cppblog.com/cxiaojia/archive/2011/11/23/cache1.html</link><dc:creator>C小加</dc:creator><author>C小加</author><pubDate>Wed, 23 Nov 2011 09:11:00 GMT</pubDate><guid>http://www.cppblog.com/cxiaojia/archive/2011/11/23/cache1.html</guid><wfw:comment>http://www.cppblog.com/cxiaojia/comments/160808.html</wfw:comment><comments>http://www.cppblog.com/cxiaojia/archive/2011/11/23/cache1.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cxiaojia/comments/commentRss/160808.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cxiaojia/services/trackbacks/160808.html</trackback:ping><description><![CDATA[<div><span style="font-family: simsun; line-height: 23px; ">由于cache的内容只是主存部分内容的拷贝，它应当与主存内容保持一致。但是，在一些情况下会出现cache和主存内容不一致的情况。如下：<br />1、 写操作后，没有刷洗cache到内存里面，那么cache为脏，跟内存不同步<br />解决方案：<br />（1）写回法：当CPU写cache命中时，只修改cache的内容，而不立即写入主存；只有当此行被换出时才写回主存。这种方法使cache真正在CPU-主存之间读写两方面都起到高速缓存的作用。对一个cache行的多次写命中都在cache中快速完成，只是需要替换时才写回速度较慢的主存，减少了访问主存的次数。实现这种方法时，每个cache行必须配置一个修改位，以反映此行是否被CPU修改过。当某行被换出时，根据此行的修改位是1还是0，来决定将该行内容写回主存还是简单丢弃。<br />（2）全写法（写直达法）：当写cache命中时，cache与主存同时发生写修改，因而较好地维护了cache与主存的内容的一致性。当写cache未命中时，只能直接向主存进行写入。全写法是写cache与写主存同步进行，优点是cache中每行无需设置一个修改位，以及相应的判断逻辑。缺点是，cache对CPU向主存的写操作无高速缓冲功能，降低了cache的功效。<br /><br /></span><span class="Apple-style-span" style="font-family: simsun; ">2、多CPU模式。 &nbsp;一个CPU修改了本地cache，那么其它CPU的cache全部失效</span></div><span class="Apple-style-span" style="font-family: simsun; line-height: 22px; ">3、DMA访问。DMA修改了内存中的值，cache中仍然为原值，错误</span><img src ="http://www.cppblog.com/cxiaojia/aggbug/160808.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cxiaojia/" target="_blank">C小加</a> 2011-11-23 17:11 <a href="http://www.cppblog.com/cxiaojia/archive/2011/11/23/cache1.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>