虚拟内存
虚拟内存的目的是为了让物理内存扩充更大的逻辑内存,从而让程序获得更多的可用内存
为了更好的管理内存,操作系统将内存抽象成地址空间。每个程序拥有自己的地址空间,这个地址空间被分割成多个快,每一块称为一页。这些页被映射到物理内存,但不需要被映射到连续的物理内存,也不需要所有的页都在物理内存中。当程序引用到不在物理内存中的页时由硬件执行必要的映射,将缺失的部分装入物理内存并重新执行失败命令
分页系统地址映射
内存管理单元(MMU)管理着地址空间和物理内存的转换,其中的页表(page table)存储着页(程序地址空间)和页框(物理内存空间)的映射表。
一个虚拟地址分为两部分,一部分存储着页面号,一部分存储着偏移量
下面页表存储着16个页,这16个页需要用4比特位来进行索引定位。例如对于虚拟地址(0010 000000000100),前 4 位是存储页面号 2,读取表项内容为(110 1),页表项最后一位表示是否存在于内存中,1 表示存在。后 12 位存储偏移量。这个页对应的页框(物理地址)的地址为 (110 000000000100)。
页面置换算法
在程序运行过程中,如果要访问的页面不在内存中,就发生缺页中断从而将该页调入内存中。此时如果内存已无空闲空间,系统必须从内存中调用出一个页面到磁盘兑换区来腾出空间,将新页调入内存中
页面置换算法和缓存淘汰策略类似,可以将内存看成磁盘的缓存。在缓存系统中缓存的大小有限,当新的缓存到达时,需要淘汰一部分已经存在的缓存,这样才有空间存放新的缓存数据
页面置换算法主要目标就是使页面置换频率最低
-
OPT:最佳
无法实现,因为无法知道一个页面多长时间不再被访问
-
LRU:最近最久未使用
虽然无法知道将来要使用的页面情况,但是可以知道过去使用页面的情况
-
FIFO:先进先出
选择换出的页面是最先进入的页面
该算法会将那些经常被访问的页面换出,导致缺页率升高
-
CLOCK:时钟
分段
虚拟内存采用的是分页技术,也就是将地址空间划分成固定大小的页,每一页再与内存进行映射
下图为一个编译器在编译过程中建立的多个表,有 4 个表是动态增长的,如果使用分页系统的一维地址空间,动态增长的特点会导致覆盖问题的出现
分段的做法是把每个表分成段,一个段构成一个独立的地址空间。每个段的长度可以不同,并且可以动态增长
段页式
程序的地址空间划分成多个拥有独立地址空间的段,每个段上的地址空间划分成大小相同的页。这样既拥有分段系统的共享和保护,又拥有分页系统的虚拟内存功能
分页与分段的比较
- 对程序员的透明性:分页透明,但是分段需要程序员显式划分每个段
- 地址空间的维度:分页是一维地址,分段是二维的
- 大小是否可以改变:页的大小不可变,段的大小可以动态改变
- 出现原因,分页主要用于实现虚拟内存,从而获得更大的地址空间;分段主要是为了程序和数据可以被划分为逻辑上独立的地址空间并且有助于共享和保护