读书笔记-现代操作系统-3储存管理-3.3虚拟内存

来源:互联网 发布:pp助手软件源 编辑:程序博客网 时间:2024/04/29 07:49

3.3 虚拟内存

虚拟内存的基本思想:
每个程序拥有自己的地址空间,这个空间被分割成多个块。每一块 称作一页或页面(page)。每一页有连续的地址空间。这些页被映射到物理内存,但并不是所有的页都必须在内存中才能运行。当程序引用到一部分在物理内存中地址空间时,由硬件立刻执行必要的映射,当程序引用一部分不在物理内存中的地址空间时,由操作系统负责将缺失的部分装入物理内存并重新执行失败的指令。

3.3.1 分页

由程序产生的地址称为虚拟地址(virtual address)。他们构成了一个虚拟地址空间(virtual address space)
在没有虚拟地址的计算机上,进系统直接将虚拟地址送到内存总线上,读写操作使用具有相同地址的物理内存字,
在有虚拟地址的计算机上,而是被送到内存管理单元(Memory management Unit),MMU把虚拟地址映射到为物理内存地址。
虚拟地址空间按照固定大小划分称为页面的若干单元。在物理内存中对应的单元称为页框(page frame)。页面和页框的大小通常一样。RAM和硬盘之间的交互总是以整个页面为单位进行的。

  • 缺页中断如果
    MMU注意到该页面没有被映射,于是CPU陷入到操作系统,这个陷阱称为缺页中断。操作系统找到一个很少使用的页框将其内容写入到磁盘上,随后需要访问的页面读到刚才回收的页框中,修改映射关系,然后重新启动陷阱中的指令。

  • 页表
    可用页号作为页表(page table) 的索引号,以得出对应于该虚拟页面的页框号, 如果该为为0则不再内存中。

3.3.2 页表

虚拟地址被分成虚拟页号(高位)和偏移量(低位部分)两部分。虚拟页号也可用页表的索引,已找到该虚拟页面对应的页表项

  • 页表项
    1. 页框号——用来寻找虚拟地址对应的页表页框
    2. 在不在位——用来确定是否是字内存中还是在硬盘中
    3. 保护位——是只读还是可以写可读
    4. 修改位——是否已经修改该位,如果已经修改则需要写会内存,如果未修改则不需要修改内存
    5. 访问位——用来判断是否是淘汰页面,当有硬盘中的虚拟地址需要换到内存时,这个标志位用来判断哪些页面可以淘汰掉。
    6. 高速缓存禁止位——对哪些映射到设备寄存而不是常规内存的页面而言的,具有独立IO空间而不是映射到内存的设备不需要这一位。

3.3.3 加速分页过程

两个主要的问题:

  • 虚拟地址到物理地址的映射必须非常快
  • 如果虚拟地址空很大,页表也会很大

如果全部用寄存器实现虽然速度很快,但是成本太高,而且每次上下问切换需要重新载入副本到寄存器。
如果全部用内存实现,每次执行指令都需要访问内存多次效率很低。
基于大多数程序总是对少数页面进行多次的访问的原理。
通常采用折中的转换检测缓冲区(Translation Lookaside Buffer ,TLB)或者相联储存器(associate momery),小型的硬件设备将虚拟地址直接映射到物理地址。而不必再访问页表。

在现代的操作系统中,对TLB的管理通常都是在软件中实现的。这些机器上,TLB表项被显示地装载。当发生TLB访问失效的时候不再是MMU到页表中查找并取出数据,而是生成一个TLB失效并将问题提交给操作系统解决。TLB失效比缺页中断更频繁。

  • 如果TLB大则可有效的减少失效情况。
  • 软失效/硬失效,软失效是TLB失效去内存找,硬失效是内存也没有需要去硬盘找。

3.3.4 针对大内存的页表

  1. 多级页表
    比如32位的地址,分为10+10+12,三级地址。
  2. 倒排页表
    对于64如果还用多级页表,需要的页表空间太大。实际中内存每个页框有一个表项,而不是每个虚拟页表有一个表项。
    不过这样从虚拟地址到物理地址的转换会变的困难,需要遍历查找,所以需要TLB将频繁使用的页面记录下来。
1 0