在操作系统写回策略中,如果未命中cache,为何要先将数据读进cache再修改?

        下文摘抄自小林coding(2.4 CPU 缓存一致性 | 小林coding)

  •         如果当发生写操作时,数据已经在 CPU Cache 里的话,则把数据更新到 CPU Cache 里,同时标记 CPU Cache 里的这个 Cache Block 为脏(Dirty)的,这个脏的标记代表这个时候,我们 CPU Cache 里面的这个 Cache Block 的数据和内存是不一致的,这种情况是不用把数据写到内存里的;
  •         如果当发生写操作时,数据所对应的 Cache Block 里存放的是「别的内存地址的数据」的话,就要检查这个 Cache Block 里的数据有没有被标记为脏的:
  •         如果是脏的话,我们就要把这个 Cache Block 里的数据写回到内存,然后再把当前要写入的数据,先从内存读入到 Cache Block 里,然后再把当前要写入的数据写入到  Cache Block,最后也把它标记为脏的;
  •         如果不是脏的话,把当前要写入的数据先从内存读入到 Cache Block 里,接着将数据写入到这个 Cache Block 里,然后再把这个 Cache Block 标记为脏的就好了。

        读划线句子的时候,不知道大家心里有没有和我一样的困惑,分明直接修改cache并标记为脏就好了,为何还要先从内存中读进来再修改呢?

        原来,在计算机系统中,内存是按块(Cache Line)存储的,而不是单个变量。缓存通常以 64 字节为单位加载数据,所以一个内存地址可能不只是存一个整数,而是多个变量共享同一块内存。

        假设内存里有:

地址 100: [10, 20, 30, 40]

        现在,我想将30修改为100。然而,cache中并未命中,如果没有上述的读入cache操作,则此时cache的数据为:

        [ _ , _ , 100 , _ ] //下划线为cache之前的旧数据

        此时,10,20,40这三个数据发生了丢失。

        因此,正确的做法是将[10, 20, 30, 40]整体读入cache,再在其中将30修改为100。

你可能感兴趣的:(笔记)