- 非固定分区的内存管理
虚拟内存的根本就是将内存扩展到磁盘上,将磁盘也当做内存的一部分.虚拟地址就是用户每次看到的地址,这个地址只是一个抽象,它需要有内存单元进行翻译,变成物理内存地址才能使用.由于这个翻译是在程序执行过程中发生,因此成为动态地址翻译.有了动态地址翻译,一个虚拟地址仅在被访问的时候才需要放在内存里,在其他时候不需要占用内存,由于动态地址翻译可以动态地改变翻译参数或过程,因此可以在程序加载到不同的物理位置时,或不同虚拟地址占用同一物理地址时,做出正确翻译.
- 交换
交换就是将一个进程从内存倒到磁盘上,在将其从磁盘上加载到内存中的过程.目的就是为程序找到一片更大的空间,从而防止一个程序因空间不够而崩溃.
- 重叠
前面说过,如果一个程序在执行过程中占用空间增大了,我们可以通过交换给它找一个更大的空间来执行.这种情况下该程序的增长无法超过物理内存空间的容量.那么如果一个程序超过了物理内存,还能继续运行吗?
答案出乎意料,能,这个办法就是重叠.重叠就是将程序按照功能分成一段一段功能相对完整的单元,一个单元执行完成后,再执行下一个单元,而一旦执行到下一个单元,就不会再执行前面的单元.所以我们把后面的程序单元覆盖到当前的程序单元上.这样就可以执行一个比物理内存还要大的程序.
- 分页内存管理
空间碎片化的根源是每个程序的大小不一样,这样在空间分配时不存在一致性.解决的办法自然是将空间按照某种规定的大小进行分配.只要将虚拟内存与物理内存都分成大小一样的部分,我们称之为页,然后按页进行内存分配,这样就可以克服外部碎片问题.
分页系统的核心就是将虚拟内存空间和物理内存空间皆划分为大小相同的页面,比如4KB,8KB或者16KB,并以页面作为内存空间的最小分配单位,一个程序的一个页面可以存放在任意一个物理页面里.在分页系统下,一个程序发出的虚拟地址由两部分组成:页面号和业内偏移:
举个例子:对于32位寻址的系统,如果页面大小为4kb,则页面号占20位,页内偏移值占12位.
从上面分析可以看出,分页系统要能够工作的前提是:对于任何一个虚拟页面,系统知道该页面是否在物理内存中,如果在的话,其对应的物理页面是哪个;如果不在的话,则产生一个系统中断(缺页中断),并将该虚页从磁盘转到内存,然后将分配给它的物理页面号返回.
1 if (虚拟页面非法, 不在内存或者被保护)2 {3 陷入到操作系统错误服务程序4 }5 else6 {7 将虚拟页面号转换为物理页面号8 根据物理页面号产生最终物理地址9 }
因此,分页系统的核心是页面的翻译,即从虚拟页面到物理页面的映射.二这个翻译过程由内存管理单元(MMU)完成.MMU接受CPU发出的虚拟地址,将其翻译为物理地址后发送给内存.内存单元按照该物理地址进行相应的访问后读出或者写入相关数据.
那么内存管理是通过什么手段完成这种翻译的呢,当然是查页表对于每个程序,内存管理单元都为其保存一个页表,该页表放到就是虚拟页面到物理页面的映射.
- 页表
内存管理单元如何知道一个物理页面是否有效,是否被保护,是否在物理内存呢?这个简单,将这些信息储存在页表里面即可.这样页表不只是用来进行翻译,还用来进行页面的各种状态判断.页表的根本功能是提供从虚拟页面到物理页面的映射,内存管理单元以来页表来进行一切与页面有关的管理活动.这些活动包括判断某一页面是否在内存里,页面是否受到保护,页面手否非法空间等.因此,页表页表提空虚拟页面到物理页面的映射外还记录这些相关信息.记录如下:
由于页表的特殊地位,所以它由硬件直接提供支持,即页表是一个硬件数据结构.下图是一个简化的虚拟页面与物理页面的映射,页面大小为16k
页表里面X表示该虚拟页面不在内存里.如果访问页面不在内存,那么将产生缺页中断.缺页中断服务程序将负责在磁盘上找到需要的虚拟页面,并在物理内存里面寻找一个闲置的页面来存放该虚拟页面,然后更新页表.之后,对该虚拟页面的访问就可以正常运行了.
- 页面翻译过程
优点:碎片得到很大程度缓解
缺点:每次访问内存需要翻译
- 多级页表
顶级页表里面存放的是一级页表的信息,一级页表里面存放的是二级页表信息,以此类推,到最后一级页表存放的才是虚拟页面到物理页面的映射.一个程序在运行时其顶级页表常驻内存,而次级页表则按需要决定是否存放在物理内存.