操作系统 虚拟内存机制

由底层硬件和操作操作系统两种软硬件结合实现,是硬件异常、硬件地址翻译、主存、磁盘文件和内核的完美结合,主要提供3个能力

  • 1.给所有进程一致的地址空间 每个进程都认为自己是在独占CPU
  • 2.保证每个进程的地址空间不被其他进程破坏 隔离进程的地址访问
  • 3.把主存作为磁盘的高速缓存,在主存和磁盘之间根据需要来回传送数据 高效的使用了主存。

1.虚拟地址和物理地址

32位系统的虚拟地址是0-2^32
64位系统的虚拟地址是0-2^64

Linux内核把虚拟地址空间分为:用户进程空间和内核进程空间,二者的比例一般是3:1

这里写图片描述

CPU取一个实际物理地址的值:

  1. 把进程指令使用的虚拟地址通过MMU转换成物理地址
  2. 把物理地址映射到高速缓存的缓存行
  3. 如果高速缓存命中就返回
  4. 如果没有命中就产生一个缓存缺失中断,从主存相应的物理地址取值,并且从主存中加载到高速缓存中,CPU中断恢复,继续执行中断前的指令

高速缓存是和物理地址相映射的,进程指令中使用的是虚拟地址

这里写图片描述

内存管理原理:

缓存中的基本单位的块,每次换入换出有是一个块,同样的原理应用到内存管理中是使用页[Page]来表示块。
虚拟地址空间划分成多个固定大小的虚拟页[VP],物理地址划分成多个大小的物理页[Physcial Page].一般VP等于PP.VP的大小通常是4KB-2MB。JVM调优的时候有时候会使用2MB的大内存页来提高GC的性能。

缓存页的分类
1.未分配的页
没有任何数据和虚拟页关联 不占用任何磁盘空间
2.缓存的页
已经分配的虚拟页 并且已经缓存在具体的物理页中
3.未缓存的页
已经为磁盘文件分配了虚拟页 但是还没缓存到具体的物理页中

虚拟内存系统和高速缓存系统一样 需要判断一个虚拟页面是否缓存在DRAM(主存)中,如果命中,就直接找到对应的物理页。如果不命中,操作系统需要知道这个虚拟页对应磁盘的哪个位置,然后根据相应的替换策略从DRAM中选择一个牺牲的物理页,把虚拟页从磁盘中加载到DRAM物理主存中

虚拟内存的这种缓存管理机制是通过操作系统内核,MMU(内存管理单元)中的地址翻译硬件和每个进程存放在主存中的页表(page table)数据结构来实现的。

这里写图片描述

页表

页表(page table)是存放在主存中的,每个进程维护一个单独的页表。它是一种管理虚拟内存页和物理内存页映射和缓存状态的数据结构。它逻辑上是由页表条目(Page Table Entry, PTE)为基本元素构成的数组。

  1. 数组的索引号对应着虚拟页号

  2. 数组的值对应着物理页号

  3. 数组的值可以留出几位来表示有效位,权限控制位。有效位为1的时候表示虚拟页已经缓存。有效位为0,数组值为null时,表示未分配。有效位为0,数组值不为null,表示已经分配了虚拟页,但是还未缓存到具体的物理页中。权限控制位有可读,可写,是否需要root权限

这里写图片描述

DRAM缓存是全相联的,即只有一组,任意的缓存行可以缓存任意的内容,有一个比较判断的过程,即任意的虚拟页可以对应任意的物理页。

DARM缓存的命中称为页命中,不命中称为缺页。举个例子来说,

  1. CPU要访问的一个虚拟地址在虚拟页3上(VP3),通过地址翻译硬件从页表的3号页表条目中取出内容,发现有效位0,即没有缓存,就产生一个缺页异常

  2. 缺页异常调用内核的缺页异常处理程序,它会根据替换算法选择一个DRAM中的牺牲页,比如PP3。PP3中已经缓存了VP4对应的磁盘文件的内容,如果VP4的内容有改动,就刷新到磁盘中去。然后把VP3对应的磁盘文件内容加载到PP3中。然后更新页表条目,把PTE3指向PP3,并修改PTE4,不再指向PP3.

  3. 缺页异常处理程序返回后重新启动缺页异常前的指令,这时候虚拟地址对应的内容已经缓存在主存中了,页命中也可以让地址翻译硬件正常处理了

磁盘和主存之间传送页的活动叫做交换(swapping)或者页面调度(页面调入,页面调出)。现代操作系统都采用按需调度的策略,即不命中发生时才调入页面。操作系统都会在主存中分配一块交换区(swap)来作缓冲区,加速页面调度。

由于页的交换会引起磁盘流量,所以具有好的局部性的程序可以大大减少磁盘流量,提高性能。而如果局部性不好产生大量缺页,从而导致不断地在磁盘和主存交换页,这种现象叫缓存颠簸。可以用Unix的函数getrusage来统计缺页的次数

现代操作系统都采用多级页表的方式来压缩页表的大小。举个例子,

  1. 对于32位的机器来说,支持4G的虚拟内存大小,如果每个页是4KB大小,那么采用一级页表的话,需要10^6个页表条目PTE。32位机器的页表条目是4个字节,那么页表需要4MB大小的空间。

  2. 假设使用4MB大小的页,那么只需要10^3个页表项。假设每个4MB大小的页又分为4KB大小的子页,那么每个4MB大小的页需要10^3个的页表项来指向子页。也就是说可以分为两级页表,第一级页表项只需要4KB大小的页表项,每个一级页表项又指向一个4KB大小的二级页表,二级页表项则指向实际的物理页。

页表项加载是按需加载的,没有分配的虚拟页不需要建立页表项, 所以可以一开始只建立一级页表项,而二级页表项按需创建,这样大大压缩了页表的空间。

使用k级页表项的地址翻译如下:

这里写图片描述

Core i7 使用四级页表结构

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值