计算机系统中的存储器主要分以下几个结构:

  • 寄存器
  • Cache(高速缓存)
  • 内存(主存/运行内存)
  • 外存(辅存)

由上到下组成
存储容量:外存 > 内存 > Cache > 寄存器
读写速度:寄存器 > Cache > 内存 > 外存

寄存器(CPU)

存在于 CPU 中,一般只能通过汇编语言进行操作,负责与 Cache 相关的读写操作

Cache(高速缓存)

  1. CPU 和内存之间的中间存储器,目的是为了解决 CPU内存之间速度容量不匹配问题。
  2. 对于开发者来说,它是不可操作的,属于透明状态
  • SRAM相联存储器,特点是按内容存取,原理是把数据或者数据某一部分作为关键字,按顺序写入信息,读取时并行将该关键字存储器的每一个单元进行比较,找出存储器内所有与该关键字相同的数据集。

  • 更适合做数据的检索和更新

  • 设置多级高速缓存 Cache可以提高访问的命中率,从而提高主存访问的效率

    • 多级 cache 一般分为一级cache二级cache三级cache
    • CPU 在访问主存时,会按顺序去优先访问一级 cache、二级 cache、三级 cache,如果都在 cache 中未命中访问内容,才会去主存中寻找
    • 在 CPU 进行 cache 查找时,需要一级cache拥有跟CPU主频一样快的访问速度
    • 按级别往下数的 cache 容量,它是由小到大的,一级大概为几KB,二级大概为几MB,依此类推

Cache 改善系统性能的依据时程序的局部性原理

  • 时间局部性:被引用过一次的存储器位置在未来会被多次引用,主要体现在循环结构上

  • 空间局部性:一个存储器的位置被引用,将来它附近的位置也会被引用,体现的是顺序执行的过程

  • demo:

const arr = [1, 2, 3, 4, 5, 6]; // 数组内的子项在循环体中按顺序存取,且只会使用一次,因此具有良好的空间局部性
let sum = 0; // sum 在循环体结构中被多次引用,因此它有良好的时间局部性
for (let i = 0; i < array.length; i++) {
sum += arr[i];
}
console.log("总值为:", sum);

Cache 中的地址映像方法

  • 直接相联映像 :主存的块与 Cache 块的对应关系是固定的
    • 优点:硬件电路设计、地址变换比较简单
    • 缺点:冲突率较高、灵活性较差
  • 全相联映像 :主存和 Cache 均分成大小相同的块,允许主存的任意一块可以调入 Cache 存储器的任何一个块的空间中
    • 优点:冲突率较低、主存的块调入 Cache 的位置不受限制,十分灵活
    • 缺点:电路难于设计和实现,只适用于小容量的 cache;无法从主存块号中直接获取 Cache 的块号,变换比较复杂,速度较慢
  • 组相联映像
    • 将 Cache 的块再分成组,采用直接相联映像方式采用全相联映像方式。即主存中任何区块的 0 组只能存储到 Cache 的 0 组中,依此类推。组内的块亦采用的是全相联映像方式,即一组内的块可以任意存放。进而可以理解主存一组(z0)中的任意一块可以存入Cache 相应组(c0)中的任意一个块中。
    • 优(缺)点:适用于直接相联映像全相联映像的折中

Cache 淘汰算法

  • 常见淘汰算法:

    • 随即替换算法 RAND(random)

      • 使用随机数发生器生成需要替换的块号,再将需要被替换的块号替换出去,以此达到随即替换过程
      • 这种以随机数形式来决定淘汰的方式,常被称为“随缘”、“佛系”淘汰
    • 先进先出算法 FIFO(First in First out)

      • 可以理解为队列的操作,它会将最先进入 Cache 的信息替换出去淘汰
    • 近期最少使用算法 LRU(Least Recently Used)

      • 语义化理解就是,会将近期最久未使用的 cache 中的信息块替换出去淘汰,cache 中的信息块存放时间越久,越优先淘汰
    • 最不频繁使用算法 LFU(Least Frequently Used)

      • 引用计数器记录访问页面次数,访问次数越多,淘汰率越低
    • 优化替换算法

      • 需要先执行一遍程序,统计 cache 的替换情况,在下次执行时才会根据最有效的方式进行替换
  • 读写过程(三种):

    Cache 内容是对主存内容的直接复制,在复制完成之后,Cache 才会在 CPU 调度下被使用,在使用过程中如果存在对 Cache 的修改,则会产生跟主存之间不一致的情况,这时候我们需要下面读写算法进行区分修改情况

    • 写直达:同时写 Cache 和内存,效率慢、性能损耗大
    • 写回:只写 Cache,淘汰页面时,写回内存
    • 标记法:只写内存,并将标志位清零,若是再用到此数据,只需要再次调取即可
      • 每次修改,直接修改内存,修改时同时对Cache做修改标志,在后续再使用该数据时,就可以直接从主存重新调取数据,反之则从 Cache 中返还,不用则不再调取

内存(主存)

内存在与 Cache 进行交互,是通过硬件实现的,反之同理

  • DRAM/RAM构成,其特点是在系统异常重启/切断电源后,会丢失存储的数据。与其相反的则是ROM(只读存储器),一般会拿来存储BIOS相关内容

外存(辅存)

外存在与内存的交互,则是通过软件硬件结合实现的,反之同理

  • 外存指的是电脑硬盘外部附加的存储器,如 SSD 固态硬盘机械硬盘光盘U 盘