在计算机内部,数据的读和写是逐级实现的。
1、读的情况:一个数据要从外部到达cpu,则要通过外存---》内存---》二级缓存---》一级缓存---》cpu寄存器---》参与计算。
2、写的情况:一般情况下,cpu产生的数据并没有(也不一定会)马上要写到外存上。那么这些数据往往是先保留在缓存或内存里,直到cpu通知写,写动作才会发生。
3、多个数据要读时,则要排队;同样,多个数据要写时,也要排队。
4、当同时有读和写的动作请求时,cpu必须安排好他们的顺序。
例子:
1、cpu要读一个数据:当前指令寄存器中找不到该数据,则cpu会从一级缓存当中查找,没有则查二级缓存,然后依次是内存、外存。
2、cpu读入一个数据后,内存、二级缓存、一级缓存都有该数据。随着数据读入的增加,缓存会满。这时就需要一个放弃的策略。先进后出法或先进先出法,还有一种策略:使用率最高的数据保留。
3、这样,缓存或内存中就有好多数据。当cpu要查找数据时,也要有一种策略:相联(全相联、半相联、部分相联)。就是把缓存划分成若干个相对独立的区域,查找数据时按照某个策略查找,这样效率会高些。
4、当cpu有数据要“写”到缓存时,这种数据要优先考虑保留,直到cpu“写”通知到达。
5、当读和写要求同时发生时,会发生2种情况:先读后写,先写后读。这两种情况都要认真考虑。比如:
(1)要写的数据地址刚好是要读的数据地址。先读后写使得读的是旧数据,当你需要的是最新的数据时,就出错了;先写后读使得原来的数据被覆盖了,当你需要原来的数据时,这时读出来的数据也是错。
(2)要写的数据地址虽然不是马上要读的数据,但它的中间结果还保留在缓存中。这样也会产生错误。
这也称为数据相关性。设计程序时应尽量避免(或减少)发生数据相关。虽然程序编译时会优化数据相关性。