清华大学操作系统公开课(四)虚拟内存概念

1.虚拟内存起因


  虚拟内存的起因说白了就是内存不够用,程序规模的增长速度远远大于存储容量的增长速度,我们要尽可能想办法扩大内存。

  我们理想中想要的存储器,是容量更大、速度更快、价格更便宜的非易失性存储器,但这样的存储器是不存在的,所以有了现在这种层次结构的存储器。

  这种“金字塔”型存储器把速度快、造价昂贵的存储单元放在CPU附近,加快访问速度。现在存储器是越来越快,但是每次存储器性能的提升速度赶不上软件需求性能的提升,另一种办法是花钱购买昂贵的存储器,代价也是比较大的,我们需要想别的办法解决内存不够的问题。

  有没有比内存更便宜、容量更大的存储器? ——硬盘,但硬盘的访问速度远远慢于内存,这就是为什么不能把程序放进硬盘执行。

  我们可以把常用的数据放在内存中,把不常用的数据保存在硬盘上,用时再加载进内存,这样实现一种虚拟的大内存。这件事需要CPU的MMU(内存管理单元)与操作系统的内核结合在一起才能完成。

  虚拟内存诞生的历史

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

  在八十、九十年代,那时候计算机系统的内存还比较小,如果是程序太大,超过了内存的容量,程序员智能采用手动的覆盖(overlay)技术,只把需要的指令和数据保存在内存中。

  后来内存大了一点,如果内存太多还是有可能超过内存的容量,可以采用自动的交换(swapping)技术,把暂时不执行的程序送到外存中,但是这种交换技术的粒度是以一个程序为粒度的,换入换出的开销很大。

  到了现在有了分段和分页技术的支持,如果想要在有限容量的内存中,以更小的页粒度为单位装入更多更大的程序,可以采用自动的虚拟内存技术。

2.覆盖(overlay)技术


目标

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

原理

  把程序按照其自身逻辑结构,划分为若干个功能上相对独立的程序模块,那些不会同时执行的模块共享同一块内存区域,按时间先后来运行。

  •   必要部分(常用功能)的代码和数据常驻内存。
  •   可选部分(不常用功能)在其他程序模块中实现,平时存放在外存中,在需要用到时才装入内存。
  •   不存在调用关系的模块不必同时装入到内存,从而可以相互覆盖,即这些模块共用一个分区。

示例

 

缺点

  由程序员来把一个大的程序划分为若干个小的功能模块,并确定各个模块之间的覆盖关系,费时费力,增加了变成的复杂度。

  覆盖模块从外存装入内存,实际上是以时间延长来换取空间节省。

3.交换技术


目标

  交换技术的目标是,多道程序在内存中时,让正在运行的程序或需要运行的程序获得更多的内存资源,

原理

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

示例

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

  交换时机的确定:何时需要发生交换?只当内存空间不够或有不够的危险时换出。

  交换区的大小:必须足够大以存放所有用户进程的所有内存映像的拷贝;必须能对这些内存映像进行直接存取。

  程序换入时的重定位:换出后再换入的内存位置不一定在原来的位置上,需要采用动态地址映射的方法。

覆盖与交换的比较

  覆盖是针对一个运行的程序之内不同模块。覆盖只能发生在那些相互之间没有调用关系的程序模块之间,因此程序员必须给出程序内的各个模块之间的逻辑覆盖结构。

  交换发生在程序之间。交换技术是以在内存中的程序大小为单位来进行的,它不需要程序员给出各个模块之间的逻辑覆盖结构。换言之,交换发生在内存中程序与管理程序或操作系统之间,而覆盖发生在运行程序的内部。

5.虚拟存储技术


目标

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

  覆盖技术:需要程序员自己把整个程序划分为若干个小的功能模块,并确定各个模块之间的覆盖关系,增加了程序员的负担。

  交换技术:以进程作为交换的单位,需要把进程的整个地址空间都换进换出,增加了处理器的开销。

  这时一种更好的内存管理方法是虚拟存储技术。

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

虚拟存储技术——程序的局部性原理

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

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

  程序的局部性原理表明,从理论上来说,虚拟存储技术是能够实现的,而且在实现了以后应该是能够取得一个满意的效果。因为虚拟存储一次会加载进来一段数据,如果程序编写的局部性完成的比较好,会大大减少缺页或者缺段的次数。

  由图中例子可以看出,不同程序编写方法的局部特征是不同的,产生的缺页中断也是不同的。

基本概念

  虚拟存储技术可以在页式或段式内存管理的基础上实现。

  大部分虚拟存储系统都采用虚拟页式存储技术,即在页式存储管理的基础上,增加请求调页和页面置换功能。

  基本思路:

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

基本特征

  大的用户空间:通过把物理内存与外存相结合,提供给用户的虚拟内存空间通常大于实际的物理内存,即实现了两者的分离。如32位虚拟地址理论上可以访问4GB,而可能计算机上仅有256M的物理内存,但硬盘容量大于4GB。

  •   部分交换:与交换技术相比较,虚拟存储的调入和调出是对部分虚拟空间进行的。
  •   不连续性:物理内存分配的不连续,虚拟地址空间使用的不连续。

虚拟存储技术——虚拟页式内存管理

  •   驻留位:表示该页是在内存还是在外存。如果该位等于1,表示该页位于内存当中,即该页表项是有效的,可以使用;如果该位等于0,表示该页当前还在外存当中,如果访问该页表项,将导致缺页中断。
  •   保护位:表示允许对该页做何种类型的访问。如只读、可读写、可执行等。
  •   修改位:表明此页在内存中是否被修改过。当系统回声该物理页面时,如果此位为1,把它的内容写回外存,如果此位为0,直接回收物理空间。
  •   访问位:如果该页面被访问过(包括读操作或写操作),则设置此位,用于页面置换算法。

  这几个bit会有效帮助我们做后面页的置换。

  接下来介绍一下整个缺页中断的流程。

虚拟内存中的外存管理

  虚拟存储技术的实现使大量的数据放在外存中,那么这些数据有什么特征或者存储形式?这些数据在外存中以文件的形式存储,我们称之为后备存储Backing Store。

  存储的形式主要有以下几种:

  数据:一个虚拟地址空间的页面可以被映射到一个文件(在二级存储中)中的某个位置。

  代码段:程序执行的代码也是数据,映射到可执行二进制文件。

  动态加载的共享库程序段:映射到动态调用的库文件。

  其他段:程序运行时产生的、没有与外存中文件对应的数据会被映射到外存中一块叫做交换文件(swap file)的区域。

虚拟内存性能

  上述例子中计算的内存访问时间解释如下:没有缺页异常的访问概率是(1-p),每次访问内存的时间开销是10ns,这部分的访问时间消耗为10(1-p);访问一次外存花费的时间为5ms == 5000000ns,缺页异常的访问概率是p,缺页时如果当前要被置换的页被修改过要写回外存,那么这部分总体开销就是5000000 * p * (1+q)。

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值