《Linux Kernel development》

Snailclimb/JavaGuide

缓存一致性

我们常用的缓存一致性协议都是属于“snooping(窥探)”协议,各个核能够时刻监控自己和其他核的状态,从而统一管理协调。窥探的思想是:CPU的各个缓存是独立的,但是内存却是共享的,所有缓存的数据最终都通过总线写入同一个内存,因此CPU各个核都能“看见”总线,即各个缓存不仅在进行内存数据交换的时候访问总线,还可以时刻“窥探”总线,监控其他缓存在干什么。因此当一个缓存在往内存中写数据时,其他缓存也都能“窥探”到,从而按照一致性协议保证缓存间的同步。

虚拟内存

  1. 因为内存有限,不能给每个进程都分配内存。所以使用 虚拟内存按需分配, 每次需要加载去页表查询真实物理地址位置,如果不在内存,发出缺页异常,去磁盘读取。
  2. 避免直接访问, 隔离进程
  3. 避免外部空洞,提高利用效率

解决实际内存不够用。

虚拟地址的构成为页目录索引 (10位) +页表索引 (10位) +表内偏移 (12位)

以 win32 系统为例,页目录和页表都为 1024 个,页表大小为 4KB,一共是 4G 的虚拟内存空间

而从虚拟地址映射到物理地址实际上就是通过页目录和页表的索引找到内存页。

在页表项中有一位标志位,用来标识包含此数据的页是否在物理内存中,如果在的话,就直接做地址映射,否则,抛出缺页异常,操作系统会把次数据页调入内存。

通过 Page Table 存储虚拟内存页到物理内存页的映射。