虚拟内存

进程创建加载的时候,会被分配一段暂时不存在的内存,等到进程真正运行的时候,需要某些数据并且数据不在物理内存中,会触发缺页中断,进行数据拷贝。

系统通过部分装入请求调入置换功能实现虚拟的更大的内存。

页表:记录虚拟页的状态,在物理内存中的地址,是否映射,是否缓存。

流程

  1. CPU想访问某个虚拟内存地址,找到进程对应的页表中的条目,判断有效位, 如果有效位为1,说明在页表条目中的物理内存地址不为空,根据物理内存地址,访问物理内存中的内容,返回
  2. CPU想访问某个虚拟内存地址,找到进程对应的页表中的条目,判断有效位,如果有效位为0,但页表条目中还有地址,这个地址是磁盘空间的地址,这时触发缺页异常,系统把物理内存中的一些数据拷贝到磁盘上,腾出所需的空间,并且更新页表。此时重新执行访问之前虚拟内存的指令,就会发现变成了情况1.

分段分页

  • 分页和分段是实现离散分配存储方式,它们都需要地址转换机制实现地址变换,且访问指令(或数据)需要两次内存访问

但两者概念上存在明显的区别,主要表现为:

  • 页是信息的物理单位,分页仅是系统管理内存的方便而进行的,不是用户的需要;段是信息的逻辑单位,分段是出于用户的需要;
  • 页的大小固定的,具体由系统决定;段的大小不固定,由用户程序本身决定;
  • 分页的逻辑地址空间是一维的连续空间;分段的逻辑地址空间是二维的,段之间的逻辑地址是不连续的。

缺页中断

当软件试图访问已映射在虚拟地址空间中,但是目前并未被加载在物理内存中的一个分页时,由中央处理器的内存管理单元所发出的中断。

  1. 保存CPU现场
  2. 缺页中断的虚拟地址,操作系统检查这个地址是否有效
  3. 检查是否有空闲页框。如果没有空闲页框,执行页面置换算法寻找一个页面来淘汰
  4. 操作系统查找所需页面在磁盘上的地址,通过磁盘操作将其装入
  5. CPU调度引发缺页中断的进程
  6. 恢复CPU

页面置换

先进先出 FIFO

优先淘汰最早进入内存的页面

最近最久未使用 LRU

选择最近最长时间未访问过的页面予以淘汰