【清华大学】操作系统 陈渝——Part5 虚拟存储概念

5.1 虚拟内存的起因

程序在运行时发现,内存越来越不够用,程序规模的增长速度远远大于存储器容量的增长速度。大数据的5G时代,数据爆炸式增长,对存储设备的要求也越来越高。

理想中的存储器
更大,更快,更便宜的 非易失性的存储器

然而实际中,实际中的存储器是有层次结构的
在这里插入图片描述
越靠近CPU的存储器访问速度越快,然而容量越小,越贵。
因为硬盘容量大,和其他层次存储器相比,实现起来代价小一些,想利用操作系统做一些工作,访问虚拟的更大更便宜的地址空间。

未来,会出现更大,更快,更便宜,且掉电不丢失数据的存储器。

在这里插入图片描述
虚拟大内存概念
在操作系统帮助下,利用硬盘提供更大的空间,把常用的数据放在内存中,不常用的放在硬盘中。使得程序员不需要自己管理。
在这里插入图片描述

5.2 覆盖技术

目标:

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

方法

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

覆盖方式 一 :
在这里插入图片描述
A可以调用B,C,D,E,F。B调用D,C调用E和F。B和C之间不存在调用关系,D,E,F之间不存在调用关系。所以A放在常驻内存中,B和C可以相互覆盖(A调用B,把B从硬盘中加载到内存,调用结束后,A调用C,调用之前,把B的代码释放数据放回硬盘,然后把C加载到内存中),D,E,F可以相互覆盖,相互覆盖的共用一个分区。程序总共190K,内存110K,通过程序存在调用,访问内存时间是不一样的,通过覆盖技术解决了内存空间不够,称之为交换技术的虚拟化。

覆盖方式 二:

把不存在调用关系的B,E,F共用一个分区。C和D共用一个分区,这样占用内存的空间为100K,比方式一节省内存。
在这里插入图片描述
覆盖技术缺点:
虽然实现了一个大程序放入小内存中,但是会带来两方面的开销问题。

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

5.3 交换技术

把管理交给操作系统,对程序员来说是透明的,程序员不需要了解何时进行换入换出,操作系统自动实现该功能。

目标

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

方法

  • 可将暂时不能运行的程序送到外存,从而获得空闲内存空间。
  • 操作系统把一个进程的整个地址空间的内容保存在外存中(换出 swap out),而将外存中的的某个进程的地址空间读入到内存中(换入 swap in)。换入换出内容的大小为整个程序的地址空间。换入换出是操作系统管理之一。

操作系统在执行过程中某个时刻认为P1暂时不需要执行,这时空间还很缺,把P1从内存导出去到硬盘中,也就是将P1整个程序的数据写入到硬盘中。操作系统需要P1需要执行时再导回内存中。
在这里插入图片描述

交换技术实现中的几个问题:

  • 交换时机的确定,何时需要发生交换?

    只有当内存空间不够或有不够的危险时换出:因为程序执行过程中频繁的交换,对系统的性能影响是很大的。硬盘和内存访问速度差好多数量级,每一次的硬盘操作,系统不能做其他事,就在等待硬盘,只有在内存确实不够时执行交换操作。尽量减少换入换出的次数。

  • 交换区的大小:需要提供多大的交换空间用来做换入换出?
    必须有足够大以存放所有用户进程的所有内存映像的拷贝:必须对这些内存映像进行直接存取。

  • 程序换入的重定位:换出后再换入的内存位置一定要在原来的位置上吗?
    换出后再换入的地址可以不一样,需要地址映射机制,虚地址一样,物理地址不一样也没关系,只需要建好页表,程序重定位就可以完成。建立地址最好采用动态地址映射的方法。

覆盖与交换的比较

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

5.4 虚存技术-part1

在内存不够用的情形下,可以采用覆盖技术和交换技术,但是:

  • 覆盖技术: 需要程序员自己把整个程序划分为若干个小的功能模块,并确定各个模块之间的覆盖关系,增加了程序员的负担;
  • 交换技术:以进程作为交换的单位,需要把进程的整个地址空间都换进换出,增加了处理器的开销。

目标

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

例如:有四个程序,操作系统有CPU的MMU单元硬件支持以后,有软件分页机制支持,以P3进程为例,只需要想要的两个内存页,其他的数据全都导入到了硬盘中,P3在当前运行时只需要这两个在内存中的数据页,其他的没有用到,就没必要放到内存中去。这就使得程序本来整体运行需要很大的内存空间,但是在某个有限时间内,它只需要一小段内存空间,这是虚存管理想达到的一个理想。这种方法通过操作系统和MMU是可以做到的。
在这里插入图片描述

局部性原理

虚存技术–程序的局部性原理

程序的局部性原理(principle of locality) :指程序在执行过程中的一个较短时期,所执行的指
令地址和指令的操作数据地址,分别局限于一定区域。

  • 时间局部性:一条指令的一次执行和下次执行,一个数据的一次访问和下一次访问都集中在一个较短时期内;
  • 空间局部性:当前指令和邻近的几条指令,当前访问的数据和邻近的几个数据都集中在一个较小区域内。

程序的局部性原理表明,从理论上来说,虚拟存储技术是能够实现的,而且在实现了以后应该是能够取得一个满意的效果的。

实例
对二维整型数组赋值,占据 1024 * 1024 * 4Byte = 4MB内存空间,而物理内存只有4KB,按对列或行单独访问占据1024 * 4 Byte = 4KB才能满足内存要求。
按如下两个程序循环方式跑:
左边程序内循环为按行访问,循环每一列的行
右边程序内循环为按列访问,循环每一行的列
在这里插入图片描述

外循环是列访问过程:
第一个语句程序执行完,占了一个页,数组的数据第一次访问时数据a[0][0] 在硬盘中,不在内存中,产生1次缺页异常,便会产生中断,操作系统会把4K数据块放在内存中来,程序第二次访问 a[1][0] 也在硬盘中,不在内存中,a[0][0] 和 a[1][0] 相差4K,在很短的时间内,访问的两个数据相隔很远,不具备时间局部性和空间局部性,使得操作系统不得不把另一个4K数据块导入在内存中,产生中断。一共产生了1024(内) * 1024(外) 次中断,产生一次中断就会有外存到内存的读写过程,产生的开销会很大。

外循环是行访问过程
第一个语句程序执行完,占了一个页,数组的数据第一次访问时数据在硬盘中,不在内存中,产生1次缺页异常,操作系统会把4K数据块放在内存中来。第二次访问数据a[0][1]时,和a[1][0] 不同,它的位置是紧接着a[0][0] 的,具有很好的时间局部性和空间局部性,那么直到访问到a[0][1023]都不会产生中断,整个一行的4K页都不会产生中断,一次内循环访问都不会产生中断,一共产生了 1(内) * 1024(外) 次中断,远远小于第一个开销。

因此,好好的利用程序局部性原理,操作系统可以建立高效的虚存管理系统。根据当前正在访问的代码或者数据,在很短的时间内,它旁边的数据和代码都会被访问,以此来选择把哪些数据和代码放在内存中去。
在这里插入图片描述

虚拟存储基本概念

可以在页式或段式硬件内存管理方式的基础上实现

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

如图:在内存中,存在很多不同的的程序段
在这里插入图片描述

虚拟存储基本特征

  • 大的用户空间:通过把物理内存与外存相结合,提供给用户的虚拟内存空间通常大于实际的物理内存,即实现了这两者的分离。如32位机器的虚拟地址理论上可以访问4GB,程序执行需要4GB,而可能计算机上仅有256M的物理内存,但硬盘容量可以很大,大于4GB,硬盘的补充可以实现在内存中跑多个程序,而且每个程序认为自己占据4GB的空间。操作系统会根据判断把某些程序用到的数据和代码放在有限的内存空间中。其中,操作系统内核常驻内存,用户程序不需要常驻内存。
  • 部分交换:与交换技术相比较,虚拟存储的调入调出是对部分虚拟地址空间进行的,粒度更小。
  • 不连续性:物理内存分配的不连续,虚拟地址空间使用的不连续,本来所有的数据要连续放在虚拟空间(逻辑空间)但是由于部分交换导致虚拟地址空间不连续,因此出现缺页中断,访问异常。

5.4 虚存技术-part2

虚拟存储技术实现

虚存技术–虚拟页式内存管理

  • 页式内存管理
    页表page table 完成逻辑页logical pages 到物理页physical frames的映射maps
    在这里插入图片描述
    大部分虚拟存储系统都采用虚拟页式存储管理技术,即在页式存储管理的基础上,增加请求调页和页面置换功能。

  • 基本思路

    • 当一个用户程序要调入内存运行时,不是将程序的所有页面都装入到内存,而是只装入部分的页面,就可启动程序运行。
    • 在运行的过程中,如果发现要运行的程序或要访问的数据不在内存,则向系统发出缺页中断请求,系统在处理这个中断时,将外存中相应的页面调入内存,使得该程序能够继续运行。
  • 页表表项设计

    分页机制中,我们知道在给定的逻辑地址中,最重要的位是物理页帧号,但是为了有效管理,虚存技术需要在页表项中增加一些位,来辅助完成相应的功能:
    在这里插入图片描述

    • 驻留位(存在位): 表示该页在内存还是在外存。
      如果该位等于"1",表示该页位于内存当中,即该页表项是有效的,可以使用;
      如果该位等于"0",表示该页位于外存当中,如果访问该页表项,将导致缺页中断。

    • 保护位:表示允许对该页做何种类型的访问,如只读,可读写,可执行等,如果权限不允许,会产生异常。

    • 修改位:表明此页在内存中是否被修改(写,更新)过。用"0"和“1”表示。

      如果为"1",说明被写过,该页在内存中和之前在外存中是不一致的,此时最新的数据是在内存中的,在做换入换出时,需要把该数据导入到内存中去,保证内存中的数据和外存中的数据是一致的。也就是说当系统回收该物理页面时,根据此位来决定是否把它的内容写回外存。

      如果该位是“0”,表明没有对该页进行修改(写)操作,和当时在外存硬盘中的数据是一致的,不需要进行写回到外存操作,如果要置换掉这个页时,不需要导入到外存,直接释放,下次需要该页数据时,直接从外存导入到内存中即可。通过这个修改位使用,可以有效提高置换的效率。

    • 访问位:如果该页面被访问过(包括读操作或写操作),则设置此位为"1",用于页面置换算法。因为将页面置换出去时,要决定换出哪一页,尽量把当前不经常访问的页面置换出去。如果该页面当前经常被访问,要设置为"1"。

以上的这些位的设计,有效帮助后续页面的置换设计。

实例:
MOV REG, 0 : 把0号虚拟地址的内容赋值给寄存器
查询虚拟的0地址在页表中的对用关系:
首先:虚拟的0地址对应的页表项为2,意味着驻留位为"1",且 物理页帧号为2,2 * 4K = 8192,说明实际物理地址为8192

MOV REG, 32780 : 把32780号虚拟地址的内容赋值给寄存器
查询虚拟的0地址在页表中的对用关系:
首先:虚拟的32780地址对应的逻辑页号为8 (32780/4096),对应的页表项为X,意味着驻留位为"0",没有对应的物理页帧号,访问该页,会产生缺页异常,加下来就需要通知操作系统把相应的页从外存中导入进来。

在这里插入图片描述

虚拟页式内存管理–缺页中断

缺页即为当前CPU加载的指令 i 访问不在内存中,指令 i 被中断,寻求操作系统将需要从内存中把需要访问的程序或者数据导入到内存中。

指令 i 被中断后,内存缺页中断处理过程

1.如果在内存中有空闲的物理页面p,则把它分配一物理页帧f,然后转到第4步,否则转到第2步;

2.采用某种页面置换算法,选择一个将被替换的物理页帧f,它所对应的逻辑页为q。
如果该页在内存期间被修改过(确保该页在内存中和外存中是否一直),则需要把它写回外存;

3.对q所对应的页表项进行修改(这说明修改位为1,下次进行导出内存时,需要写回到外存),把驻留位置为"0"(说明把该页标记为了空闲页,可以把该页分配给一个物理页帧);

4.将需要访问的页p装入到物理页面f当中

5.修改p所对应的页表项的内容,把驻留位设置为"1",把物理页帧号设置为f;

6.重新运行被中断的指令 i ,可以访问到需要的数据。

在这里插入图片描述

后备存储 Backing Store

在何处保存未被映射的页

  • 能够简单地识别在二级存储器中的页
  • 交换空间(磁盘或者文件):特殊格式,用于存储未被映射的页面

概念:后备存储 Backing Store

  • 数据:数据文件
    一个虚拟地址空间的页面可以被映射到一个文件(在二级存储中)中的某个位置
  • 代码段:执行程序
    映射到可执行二进制文件
  • 动态加载的共享库程序段:映射到动态调用的库文件
  • 其它段:可能被映射到交换文件(swap file)

虚拟内存性能

时间开销分析

为了便于理解分页的开销,使用有效存储器访问时间effective memory access time (EAT)计算:
E A T = 访 + ( 访 ) EAT = 访存时间 *页表命中机率 +页缺失处理时间(即外存访问时间)*页缺失机率

实例:

  • 访存时间:10ns
  • 磁盘访问时间:5ms
  • 参数 p = page fault 缺页机率
  • 参数 q = dirty page 脏页机率,产生dirty page即为换出操作
  • E A T = 10 ( 1 p ) + 5 , 000 , 000 p ( 1 + q ) EAT= 10(1-p)+5,000,000p(1+q)

保证上述的p 足够小,即产生缺页的机率小,性能可以得到保证。

发布了45 篇原创文章 · 获赞 4 · 访问量 2518

猜你喜欢

转载自blog.csdn.net/keke_Memory/article/details/105132845