一个标记位,等价于地址的高 位;
一个设置数据,等价于地址的 ) 到 $ 位。
命中和不命中决定的方式和直接映射 方式是一样的。但是数据被驱
逐的方式同直接映射方式有很大的区别。每一个 包含两个 "# 和一个最近
最少使用位 。最近最少使用位将决定数据如何分配,这个标记位类似于
一个开关。例如当 在访问 **** 地址的数据时且 位为 * 时,
会将数据分配在第 * 路的第 * 列,此时 位会变成 ,当 访问 !***
地址的数据时,由于 为 故数据会被安排在第 路的第 * 列。无论对这个
列是读还是写的访问,都将改变这个最近最少使用标记位。当这两路都
存在数据后,当 再次读取 '*** 地址的数据且 为 时,第一路的数
据将会被逐出 而去存放 '*** 的数据(即原来存放 **** 的 "# 被
驱逐),此时两个第 * 列分别存放的是 !*** 以及 '*** 的数据。
对于 来说, 是一个读分配的 ,在一个写不命中操作时,数
据从写存储器(2"+34/)传递到内存中,绕过 。在一个写命
中操作时,数据写入 中而不是立即写入内存。
脏数据位指示当 里面的数据被写操作修改,而修改后的新数据还未
被写入到主存储器中。最初脏数据位将被赋值为 *。一旦当 对某列进行写
操作时,脏数据位将变为 。当此列被逐出 时,这个数据将被写回主存
储器中。为了实现 一致性问题可以通过软件产生一个回写命令将
中的脏数据写回到外存中。
不同 默认上电 状态不一致,具体参照手册。
三、cache 出问题的原因
在单核的工程中,除了 这种不经过 操作外, 不会出任何问
题。因为 存在脏数据位,知道 数据和 11 数据是否一致。如果
一致,这样的结果是我们接受的,如果不一致,当 满了, 会根据
脏数据位自动刷到 11 里面,这样的机制就会使得单核不存在一致性问题。所
以,单核的时候放心大胆地使用 即可。我们所有出 问题的地方
都是在分核的代码里面。
首先先谈 出了问题会是什么样的现象。这就是我们经常在嘴里说的
数据“进了 5。有可能你会在 的“67"#5里面看到数据“变色”的
情况,如果变色并且把 的选项勾掉,变色和不变色的数据不一致,那就
是数据进了 。在大型的工程中,你有可能会发现,单核跑的代码结果都
正确,但是整个算法跑完之后,结果却不对(个别情况会出现数据全部刷 *)
的情况。现在再来具体解释 在分核工程中出问题的原因。
1.读一致性的问题
评论0