操作系统笔记——第5章 虚拟内存

1、虚拟内存的起因

程序越来越大,对内存要求越来越高。

在计算机系统中,尤其是在多道程序运行的环境下,可能会出现内存不够用的情况,怎么办?

  • 程序太大,超出了内存的容量——手动覆盖(overlay)技术,只需要把需要的指令和数据保存在内存中
  • 程序太多,超出了内存的容量——自动交换(swapping)技术,把暂时不能执行的程序送到外存中
  • 在有限容量的内存中,以更小的页粒度为单位装入更多更大的程序——自动虚拟存储技术。是对上述技术的改进,小粒度操作能更有效地使用有限的物理空间

2、覆盖技术(八九十年代)

目标:

  • 是在较小的可用内存中运行较大的程序。通常使用多道程序系统,与分区存储管理配合使用。

基本原理:

  • 把程序按照其自身逻辑结构划分为若干个功能上相互独立的程序模块,那些不会同时执行的模块共享一块内存存储,按时间先后来运行。
    • 必要部分(常用功能)的代码和数据常驻内存
    • 可选部分(不常用功能)在其他程序模块中实现,平时存放在外存中,在需要用到时才装入内存
    • 不存在调用关系的模块不必同时装入到内存,从而可以相互覆盖,即这些模块共用一个分区

例子:
覆盖技术

  • 物理内存(内存条)大小只有110K。如果A先调用B再调用C,可以先将B导入到内存;接着调用C的时候,将B导回到硬盘中,释放空间;当C调用E的时候,将不执行的DF释放ect.
  • 覆盖技术的粒度是根据程序运行的逻辑调用关系实现的,这也意味着逻辑覆盖方式有多种。不同的覆盖方法使用到的最小区域不同。
    • 如另一种覆盖方法: A+B&E&F+C&D=100K

缺点:

  • 由程序员来把一个大的程序划分为若干个小的功能模块,并确定各个模块之间的覆盖关系,增加了编程的复杂度;
  • 覆盖模块从外存装入内存,实际上是以时间延长来换取空间节省。

3、交换技术

目标:

  • 多道程序在内存中时,让正在运行的程序或需要运行的程序获得更多的内存资源

方法:

  • 可将暂时不能运行的程序送到外存,从而获得空闲内存空间
  • 操作系统把一个进程的整个地址空间的内容保存到外存中(换出swap out),而将外存中的某个进程的地址空间读入到内存中(换入swap in)。换入换出内容的大小为整个程序的地址空间
    • 交换技术的粒度大概从几页到几百页,操作影响比较大

交换技术需要考虑的问题:

  • 交换时机的确定:只当内存空间不够或有不够的危险时换出
  • 交换区的大小:必须足够大以存放所有用户进程的所有内存映像的拷贝;必须能对这些内存映像进行直接存取
  • 程序换入时的重定位:换出后再换入的内存位置一定要再原来的位置上吗?如何在换入之后仍然能正确寻址?最好采用动态地址映射的方法,即建立页表。

注意:

  • 换入换出由操作系统自动完成,不需要程序员定义

覆盖与交换技术的比较

  • 覆盖只能发生在那些相互之间没有调用关系的程序模块之间,因此程序员必须给出程序内的各个模块之间的逻辑覆盖结构
  • 交换技术是以在内存中的程序大小为单位来进行的,它不需要程序员给出各个模块之间的逻辑覆盖结构,但开销比较大。换言之,交换发生在内存中程序与管理程序或操作系统之间,而覆盖则发生在运行程序的内部。

4、虚拟内存管理技术

  • 在内存不够用的情形下,可以采用覆盖技术和交换技术,但是:
    • 覆盖技术:增加程序员负担——负担大
    • 交换技术:以进程为交换单位,需要进程的整个地址空间都换进换出,增加了处理器的开销——粒度大
  • 虚拟内存管理技术对前两种技术进行优化,取长补短

目标:

  • 像覆盖技术一样,不是把程序的所有内容都放在内存中,因而能够运行比当前的空闲内存空间还要大的程序。但做得更好,实现由操作系统自动来完成,无需程序员干涉
  • 像交换技术那样,能够实现进程在内存与外存之间的交换,因而获得更多的空闲内存空间。但做得更好,实现只对进程的部分内容在外存和内存之间进行交换

程序的局部性原理(principle of locality):

  • 指程序在执行过程中的一个较短时期,所执行的指令地址和指令操作数地址,分别局限于一定区域,实现高效执行。程序的局部性好说明程序执行效率很高
    • 时间局部性:一条指令的一次执行和下次执行,一个数据的一次访问和下次访问都集中在一个较短的时期内
    • 空间局部性:当前指令和邻近的几条指令,当前访问的数据和邻近的几个数据都集中在一个较小区域内
  • 程序的局部性原理表明,在理论上,虚拟存储技术是能够实现的,而且在实现了以后是能够取得一个满意的效果的
  • 例子:页面大小为4K,分配给每一个进程的物理页面数为1。在一个进程中,定义了如下的二维数组int A【1024】【1024】,该数组按行存放在内存中,每一行放在一个页面中。
    • 程序编写方法一:for(i……) for (j……)A[i][j] = 0 //按行进行访问
    • 程序编写方法二:for(j……) for (i……)A[i][j] = 0 //按列进行访问
    • C语言按行访问数组,第一种方法发生1024次缺页中断;方法二发生1024*1024次缺页中断;因此利用程序局部性特点,方法一开销明显比较小

基本概念:

  • 硬件支持:在页式或段式内存管理的基础上实现
  • 在装入程序时,不必将其全部装入到内存,而只需将当前需要执行的部分页面或段装入到内存,就可让程序开始执行;
  • 在程序执行过程中,如果需执行的指令或访问的数据尚未在内存(成为缺页或缺段),则由处理器通知操作系统将相应的页面或段调入到内存,然后继续执行程序
  • 另一方面,操作系统将内存中暂时不使用的页面或段调出保存在外存上,从而腾出更多空闲空间存放将要装入的程序或将要调入的页面或段

基本特征:

  • 大的用户空间:通过把物理内存与外存相结合,提供给用户的虚拟内存空间通常大于实际的物理内存,即实现了这两者的分离。如32位的虚拟地址理论上可以访问4GB,而可能计算机上仅有的256M的物理内存,但硬盘容量大于4GB
  • 部分交换:与交换技术相比,虚拟存储的调入和调出是对部分虚拟地址空间进行的
  • 不连续性:物理内存分配的不连续,虚拟地址空间使用的不连续(本来是连续的,但是操作系统进行换入换出操作之后,将一些代码或数据换出(缺页或缺段),导致不连续;但是操作系统会弥补好使程序能够正常访问)

具体实现:

  • 虚拟页式内存管理
    • 页式内存管理处理流程(回顾):页表page table完成逻辑页logical pages到物理页帧physical frames的映射maps
    • 大部分虚拟存储系统都采用虚拟页式存储管理技术,即在页式存储管理的基础上,增加请求调页和页面置换功能
    • 基本思路
      • 当一个用户程序要调入内存运行时,不是将该程序的所有页面都装入内存,而是只装入部分的页面,就可启动程序运行
      • 在运行过程中,如果发现要运行的程序或要访问的数据不在内存中,则向系统发出缺页中断请求,系统在处理这个中断时,将外存相应的页面调入内存,使得该程序能够继续运行
  • 页表表项:
    页表表项
    • 驻留位:表示该页是在内存还是在外存。如果为1,表示在内存中,即该页表项是有效的,可以使用;如果为0,在外存中,如果访问该页表项,将导致缺页中断
    • 保护位:表示允许对该页做何种类型的访问,如只读、可读写、可执行等
    • 修改位:表明此页在内存中是否被修改过。当系统回收该物理页面时,根据此位来决定谁都把它的内容写回外存(0:未修改)。对修改页的使用,能够有效提高置换效率
    • 访问位:如果该页面被访问过(包括读或写操作),则设置此位1。用于页面置换算法
  • 缺页中断处理过程
    • 如果在内存中有空闲的物理页面,则分配一物理页帧f,然后转第四步;否则转第二步
    • 采用某种页面置换算法,选择一个将被替换的物理页帧f,它所对应的逻辑页为q。如果该页在内存期间被修改过,则需把它写回外存
    • 对q所对应的页表项进行修改,把驻留位置为0
    • 将需要访问的页p装入到物理页面f中
    • 修改p所对应的页表项的内容,把驻留位置为1,把物理页帧号置为f
    • 重新运行被中断的指令

后备存储(Backing Store,或者称为二级存储)

  • 目的:保存未被映射的页,保证虚拟内存管理空间的有效性
  • 具体内容:
    • 一个虚拟地址空间的页面可以被映射到一个文件(在二级存储中)中的某个位置
    • 代码段:映射到可执行二进制文件
    • 动态加载的共享库程序段:映射到动态调用的库文件
    • 其他段:一些没有映射到内存的数据文件,可能被映射到交换文件(swap file)

虚拟内存性能:
为了便于理解分页的开销,使用有效存储器访问时间EAT(effective memory access time)来进行评估

EAT = 访存时间 * 页表命中几率 + page fault 处理时间 * page fault 几率

例子:访存时间=10ns;磁盘访问时间=5ms;参数p=page fault几率(缺页比例);参数q=dirty page几率(对页进行写操作的概率)。 EAT=10(1-p)+5000000p(1+q)

猜你喜欢

转载自blog.csdn.net/MaoziYa/article/details/105270519