计算机组成原理 - 存储 (学习笔记)

计算机的存储体系
  • 寄存器(Register)
  • L1-L3 的 CPU Cache (指令cache,数据cache) ; SRAM ; L1: 1 ns, L2: 4 ns
  • 内存 - RAM ; 100 ns
  • 硬盘-HDD,SSD
数据存储策略
  • 硬件的成本、访问的数据量以及访问的数据分布
  • 局部性原理(Principle of Locality):时间局部性(temporal locality)和空间局部性(spatial locality)
  • LRU(Least Recently Used)缓存算法
  • 缓存命中率(Hit Rate/Hit Ratio)
高速缓存
  • CPU 需要访问 L1-L3 Cache,从里面读取指令和数据,而无需访问内存
  • Cache Line(缓存块)
  • CPU 如何知道要访问的内存数据,存储在 Cache 的哪个位置呢?
  • 直接映射 Cache(Direct Mapped Cache):直接映射 Cache 采用的策略,确保任何一个内存块的地址,始终映射到一个固定的 CPU Cache 地址(Cache Line)。而这个映射关系,通常用 mod 运算(求余运算)来实现。
  • 现在 CPU 想要读取 X 号内存块,在读取到 Y 号缓存块的时 , 候究竟是不是 X 号对应的数据?
  • 组标记(Tag):当前缓存块内存储的数据对应的内存块
  • 有效位(valid bit):对应的缓存块中的数据是否是有效的
  • Data Block 中定位对应字的位置偏移量
  • 一个内存的访问地址,最终包括高位代表的组标记、低位代表的索引,以及在对应的 Data Block 中定位对应字的位置偏移量
  • 整个过程
  1. 根据内存地址的低位,计算在 Cache 中的索引;
  2. 判断有效位,确认 Cache 中的数据是有效的;
  3. 对比内存访问地址的高位,和 Cache 中的组标记,确认 Cache 中的数据就是我们要访问的内存数据,从 Cache Line 中读取到对应的数据块(Data Block);
  4. 根据内存地址的 Offset 位,从 Data Block 中,读取希望读取到的字。
数据一致性
  • volatile 关键字究竟代表什么含义呢?它会确保我们对于这个变量的读取和写入,都一定会同步到主内存里,而不是从 Cache 里面读取。
  • 写入的数据,到底应该写到 Cache 里还是主内存呢?
  • 策略1:写直达(Write-Through)
  • 策略2:写回(Write-Back)不再是每次都把数据写入到主内存,而是只写到 CPU Cache 里。只有当 CPU Cache 里面的数据要被“替换”的时候,我们才把数据写入到主内存里面去。
  • 假设写入的数据所对应的 Cache Block 里,放的是别的内存地址的数据。如果是脏的话,先把这个 Cache Block 里面的数据,写入到主内存里面。然后,再把当前要写入的数据,写入到 Cache 里,同时把 Cache Block 标记成脏的。如果 Block 里面的数据没有被标记成脏的,那直接把数据写入到 Cache 里面,然后再把 Cache Block 标记成脏。
MESI协议:多核CPU的高速缓存保持一致
  • 写传播(Write Propagation): 在一个 CPU 核心里, Cache 数据更新,必须能够传播到其他的对应节点的 Cache Line 里
  • 事务的串行化(Transaction Serialization):在一个 CPU 核心里面的读取和写入,在其他的节点看起来,顺序是一样的 (如果两个 CPU 核心里有同一个数据的 Cache,那么对于这个 Cache 数据的更新,需要有一个“锁”的概念)
  • 总线嗅探(Bus Snooping):把所有的读写请求都通过总线(Bus)广播给所有的 CPU 核心,然后让各个核心去“嗅探”这些请求,再根据本地的情况进行响应。
  • 写失效(Write Invalidate)协议:广播一个“失效”请求告诉所有其他的 CPU 核心
  • 写广播(Write Broadcast)的协议
  • M:代表已修改(Modified)
  • E:代表独占(Exclusive)
  • S:代表共享(Shared)
  • I:代表已失效(Invalidated)
  • “独占”和“共享”这两个状态:无论是独占状态还是共享状态,缓存里面的数据都是“干净”的
  • 在独占状态下的数据,如果收到了一个来自于总线的读取对应缓存的请求,它就会变成共享状态:另外一个 CPU 核心,也把对应的 Cache Block,从内存里面加载到了自己的 Cache 里来
  • 共享状态下,想要更新 Cache 里面的数据的时候,不能直接修改,而是要先向所有的其他 CPU 核心广播一个请求,要求先把其他 CPU 核心里面的 Cache,都变成无效的状态,然后再更新当前 Cache 里面的数据。这个广播操作,一般叫作 RFO(Request For Ownership)
内存
  • 内存需要被分成固定大小的页(Page),然后再通过虚拟内存地址(Virtual Address)到物理内存地址(Physical Address)的地址转换(Address Translation),才能到达实际存放数据的物理内存位置
  • 多级页表
  • 一个进程的内存地址空间是怎么分配的。在整个进程的内存地址空间,通常是“两头实、中间空”。在程序运行的时候,内存地址从顶部往下,不断分配占用的栈的空间。而堆的空间,内存地址则是从底部往上,是不断分配占用的
  • 多级页表就像一个多叉树的数据结构:页表树
  • 4级索引 3级索引 2级索引 1级索引 物理页号
  • 因为一个进程的内存地址相对集中和连续,所以采用这种页表树的方式,可以大大节省页表所需要的空间。
  • 加速地址转换:TLB (地址变换高速缓冲(Translation-Lookaside Buffer)):“加个缓存”,把之前的内存转换地址缓存下来,不需要反复去访问内存来进行内存地址转换。
  • 指令的 TLB 和数据的 TLB,也就是 ITLB 和 DTLB
  • 在 CPU 芯片里面,封装了内存管理单元(MMU,Memory Management Unit)芯片,用来完成地址转换。和 TLB 的访问和交互,都是由这个 MMU 控制的。
  • 两个内存保护:导致一个进程可以访问别的进程的数据或者代码,甚至是执行对应的代码,造成严重的安全问题
  • 可执行空间保护(Executable Space Protection): 只把其中的指令部分设置成“可执行”的,对于其他部分,比如数据部分,不给予“可执行”的权限
  • 地址空间布局随机化(Address Space Layout Randomization)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值