操作系统-虚拟内存005

一、虚拟内存的起因

虚存之前两种技术:覆盖和交换。
虚存产生之后,可以有效的内存管理,给应用程序提供更大的空间

1、为什么要有虚拟内存

程序规模的增值速度远远大于存储器容量的增长速度。那么需要让更多的程序跑在有限的内存当中。
理想中的存储器:更大、快、便宜的非易失性存储器(掉电后依旧保存)
硬盘速度远慢与内存速度,我们不能把程序放到硬盘,只能放到内存中执行。那么我们能不能把硬盘也用上??
比如说操作系统做一些工作,使得程序员可以实现一个更完美的存储空间。
将常用的代码放到内存,不常用的放到硬盘中——覆盖技术。
在这里插入图片描述

二、覆盖技术

上个世纪八十年代产生的技术,相对来说,就是想:在较小的可用内存中运行较大的程序。

1、覆盖技术的解说

注意的几点:

  1. 一定有常驻内存的代码和数据,负责管理在某一个时间段将相应的数据导入内存或者导出内存。
  2. 不常用的数据或者功能 是放在硬盘上的。只是需要的时候放到内存当中。
    在这里插入图片描述

2、覆盖技术的例子:

A~F为五个函数,每个函数占用一块空间。进行分类,需要把不具有调用关系的函数或者模块,分成一个分区。1.A是常驻内存,自己为一个模块。2.BC是对等的,都被A所调用,相互不会调用。将BC放到一个区。3.DEF放到一个区。
程序总能够190K,而内存总共110K。这样剩下了空间。

1、覆盖技术例子的解刨:

  1. 将相互没有调用关系的模块,放在一个分区。因为访问时间是不一样的,比如A先调用B,在调用C。那么先调用的B,那么就可以把50K的空间放到内存中,当A调用完后,就会将B从内存放到硬盘中。当执行调用C,就会将C模块从硬盘放到内存中。B和C没有调用关系,所以可以放到一个分区里面。那么只需要B和C最大的一个容量够,就可以了。
  2. 当C执行完B之后,C就会调用E的时候,那么DF 是不会被执行的。那么DF就没有必要放到内存当中的,只需要将E20K放到覆盖区40K当中就可以了。
  3. 虽然DEF都是有可能占中覆盖区40K的空间,那么他们占用的时间是不一样的。
  4. 当C调用完E后,就会紧接着调用F,首先将E数据进行释放,把F从硬盘调用到覆盖区当中,这样就可以正常执行了。
  • 既然是逻辑对应关系,那么就可以找出多种的覆盖分区的关系。程序员会根据具体情况分析出最佳的情况,从而实现覆盖管理。

3、覆盖技术缺点

在早期内存很小的时候,这样就可以让小内存运行大程序的实现。

  1. 增加程序员的精力
  2. 时间换空间
    在这里插入图片描述

三、交换技术

1、交换技术的解释

  • 覆盖技术是程序员进行管理,后期发展有Unix系统后,系统进行管理。因为操作系统可以管理现在哪种程序在内存中运行
  • 操作系统完成交换技术:在内存中有多个程序,将一些当前没有正在跑的程序,以程序为单位,暂时换到硬盘中。就可以把内存空出来,就使得当前正在运行的程序,从而有更大的内存去使用。
  • CPU有个内存管理单元,在他的帮助下,在某个时刻,会把进程整个地址空间,从内存导入到硬盘当中。叫做换出。将硬盘中导入到内存,叫做换入。
  • 导入导出的过程,操作系统的内存管理的组成部分。导入导出的整个力度是整个程序。力度都至少大于一个页,导入导出开销是很大的。
    交换的代价:每一次都是把整个程序从导出内存放到硬盘,下次还有将程序从硬盘导出到内存中。
  • 如果程序很大,那么开销还是挺大的。那么可以将一部分数据进行导入导出呢?
  • 就是后面学的续存技术。
    在这里插入图片描述
    在这里插入图片描述

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

  1. 程序执行中,频繁出现交换数据,那么对系统的性能影响还是很大的,硬盘和内存访问速度是很大的。意味着,每一次硬盘操作,会使整个系统只能等待硬盘了。确实内存不够时,才会出现交换操作,尽量减少交换
  2. 交换区的大小多大合适呢? 比如说十个程序在一个交换区里面,那么需要将九个程序放到交换区中。可能出现内存不够放交互区的空间。
  3. 硬盘和内存之间数据交换,可能出现地址变化。所以最好采用动态地址映射方法。
    在这里插入图片描述

3、覆盖和交换的比较

  1. 覆盖发生运行程序**之内,**通过没有调用关系的模块,共享一个内存区域,从而使空间充分利用。代价就是:程序员手动去指定关系。
  2. 交换是发生在内存中的程序之间,每次换入换出是程序,所以力度很大。操作系统内部完成,减轻了程序员的负担。

四、虚存技术

1、目标

1.分析覆盖和交换的不足,引出虚存技术

在这里插入图片描述

3.介绍虚存技术-目标

  1. 像覆盖技术一样,将一部分内容进行交换。
  2. 将交换技术一样,实现程序在内存中跑的时候,可以动态的根据具体情况,将某些数据直接导出和导入。
  3. 例子:四个程序,操作系统有CPU的MMU的(分页)支持。P3只放了两个内存页其他的数据都是在硬盘中。在p3的运行时,当前只用了这两个数据页。程序整体是很大的,但是在某个时间内,只需要一小段空间就够了。这样就可以实现有效管理。就是虚存管理。那么通过操作系统和CPU的MMU是可以做到的
    在这里插入图片描述

2、程序局部性原理

  1. 由于整个处理过程,完全自动做的,不需要程序的介入,但是提出要求就是局部性
  2. 程序的局部性是指:程序执行的过程中, 在较短的时间内所需要的数据和操作的指令,分别局限在一定的区域,这样就可以实现高效的执行。
  3. 时间局部性:
  4. 空间局部性:
  5. 有了时间和空间局部性后,就可以说程序的局部性很好,意味着执行效率很高,前面程序设置中, 需要考虑局部性的特征。
    在这里插入图片描述

1.程序局部性的好处

  1. 那么操作系统就可以利用局部性的特点,来实现高效的虚存管理。那么就是:
    1.很小的一部分空间,放到内存,同时效率很高。
    2.使用方便,说明不需要程序员的干预,速度快,基本在内存中访问完全一样。提供一个很大的虚拟空间。
    3.读取硬盘次数很少,从而效率高。

2.程序的局部性原理的例子:

  • 这个例子来说明局部性,会对操作系统产生什么影响。
  • 对一个数组进行赋值,二维数组是1024*1024,每个整形是4个byte。那么就是占4兆的内存空间,但是物理内存只有4K。那么这两个程序放上去跑,有什么现象?

在这里插入图片描述

1.第一个代码分析,不符合时间和空间局部性

对一个是按列来访问,外循环:01,02,03,04,05,06…0,1023
01
02

0,1023
在C语言中,是按着行优先放二维数组。

  1. 当第一次访问的时候,产生了【第一次缺页的异常】,操作系统就会把4K的数据,放到内存中来,这时候访问a00。
  2. 第二次访问的是a10,从位置来说,从a00,差了4K的距离(因为直接就是第二列了)。其实(a10)也在硬盘上,产生第二次缺页中断,从而操作系统把4K数据,放到内存中来。这就说明不具备时间和空间的局部性。也就是说从 a(0,0)到a(1023,0)共中断1024次
  3. 依次推类…一共是1024列*1024=1兆次的缺页中断。 所以说每一次缺页中断,就会完成依次从内存到硬盘读写操作。
  4. 总结第一种代码】由于第一个代码不具备时间和空间的局限性,1兆次缺页中断,1兆次内存和硬盘读写操作。从而开销非常大,运行效率得不到保障。

2.第二个代码分析, 符合时间和空间局部性

第二个是按行来访问,外循环:10,20,30,40,50,60…1023,0

  1. 第一次访问a00的时候,还没有在内存在,会产生依次中断,操作系统会把数据从硬盘导入内存中。
  2. 接下里的访问是a01,位置是紧接着a00的(C语言中按着行优先存放二维数组)。具有很好的时间空间局部性。从a(0,0)直到访问到a(0,1023),这一行只中断一次
  3. 一次类推… 这个代码的赋值操作,只会产生1024次缺页中断。远远小于上一个代码的1024*1024=1兆次。
    在这里插入图片描述

3.符合时间空间局部性的好处:

操作系统就是利用程序具有局部性的特点,才能设计出高效的虚存管理系统。正是有了局部性,使得操作系统能在访问的数据和代码,在一个很短的时间内,运到内存的代码,都会被访问,根据这个原理,在硬盘中选择合适的代码放到内存中。

3、虚存技术–基本概念

有了操作系统、内存管理单元、分页分段机制、程序的局部性,那么如何实现虚存技术?
在操作系统有了硬件支持(分段和分页),以页或段为单位的虚存管理。

  1. 装入程序的时候只需要将当前需要执行的一部分代码放到页或段中去,那么就可以使程序执行。那么由于只放进来一部分代码,那么继续运行程序就会产生异常。
  2. 产生缺页异常,那么处理器会通知操作系统(CPU:有一部分需要执行的代码,没有找到怎么办?)操作系统就会去内存看一看,如果内存还有空间,那么就会把需要的代码,从硬盘导入内存中。这条没有访问到的指令,就会重新执行,数据已经在内存当中了,就可以继续执行了。如果内存没有空间,操作系统就会考虑,被占的内存代码,哪些不会用到的,就会把暂时不会用到的代码,导入到硬盘当中。这样就可以空闲空间。放入接下里需要的数据,从而继续执行。
  • 下面这个图表示很清楚:很多程序只有一下部分在内存当中,大部分在硬盘中。这使得本来程序空间很大,但是内存很小的情况下,依然可以执行。

在这里插入图片描述

4、基本特征

把硬盘当成了虚拟空间,整个虚拟空间=物理空间+硬盘。

  1. 大的用户空间:假如CPU是一个32位机器,理论上面可以访问4个GB,其实物理内存只有256M。硬盘有4个G,可以使得在内存中,可以跑多个程序,每个程序认为自己占了4G空间。其实是操作系统根据判断,把用到的代码放到内存中。通过这种情况可以给运行的程序一个很大的虚拟地址空间。
  2. 部分交换:与交换相比,每次换入换出是很规整的,以页和段为单位。而虚拟是部分地址进行交换。
  3. 不连续:物理内存分配是不连续的,虚拟地址空间使用的不连续。

在这里插入图片描述

5、虚拟页式内存管理

  • 以页式内存管理:左侧是逻辑地址空间,右侧是物理地址空间。以页为映射关系,是靠页表来维护。页表项的索引是页号,页表项的内容是页帧号,还有几个bit来表示是否在物理内存中存在。1存在,0不存在。如有一个内存地址访问查找页表,页表项表示0,则虚拟地址空间对应的物理空间 是没有的。那么就是访问异常。
    在这里插入图片描述

1、解释请求调页和页面置换

  • **请求调页:**需要访问该页时,才会把页调到内存中来。当一个用户程序需要从硬盘调入内存时,并不是把所有页都装入内存,而是把需要的页,放到内存。这样就可以启动程序运行。
  • 页面置换:在访问过程中,占用的内存越来越多,可能不够用,那么需要将暂时不用的页换出去,那么将需要用的页,从硬盘放到内存中。
    在这里插入图片描述

2.页表的添加了四个位

  • 为了实现请求调页和页面置换,需要在页表项,添加一些位,进行辅助完成。
  • 本来页表项中存在主要的是页帧号,为了实现虚拟技术,添加了驻留位
  1. 驻留位:表示该页是在内存还是外存,1表示内存,即该页表项是有效的,可以使用;如果改位为0,表示该页是在外存中,如果访问该页表项,将导致缺页中断。
  2. 保护位:表示是否允许对该页做何种类型的访问,如只读、读写、执行等。
  3. 修改位:表名次页在内存中是否修改过。当系统回收该物理页面时,根据此位来决定是否把它的内容写回外存。如果是0,则表明没有被修改过。
  4. 访问位:如果该页面被访问过。用于页面置换算法。如果是0,表示没有被访问过。
    在这里插入图片描述

3.有了位之后产生的现象,例子进行解析

  • 左边是虚存的映射关系,一共是64K,每一个页表项代表4K的物理页。
  • X带包驻留位为0,没有对应的页帧号,意味着访问会缺页。如果是具体的数,代表驻留位为1.
  1. 这时做一个访问,把虚拟的0地址内容,赋值给寄存器。那么0地址在页表里面,对应的映射关系是什么?为2,代表驻留位为1.且页帧号是2 。所以说2* 4096(页的大小)=8192.那么实际访问的物理地址是8192。
  2. 接下里的操作是,将虚拟地址32789地址的内容,读到寄存器里面去。32780对应的是页表项是第8项(32K~36K),驻留位的设置是X,所以没有对应的页帧号,意味着访问会缺页异常
    在这里插入图片描述

4.上面例子缺页,缺页中断处理过程

如果遇到了缺页,如何从硬盘和内存相互读写过程。

  1. CPU执行一条指令,如果内存地址没有对应的映射关系,也就是说页表为的存在位为0. 从而产生缺页异常,那么将控制器交给操作系统。
  2. 操作系统就会:1内存中是否有空闲的物理页,第一种情况:如果有空闲的物理页,会分配一个空闲的物理页帧,转到第四步,需要以页为单位来从硬盘读到内存中。2.修改页表,那么就把虚拟页表对应的页表项的页帧号写成现在的物理页号,会再一次把存在位设为1,表明存在。在跳回被中断的指令。
  3. 所以这次CPU正确的取到这次访问对应的数据,从而完成后续的执行。
  4. 第二种情况:内存中没有空闲的物理页。那么就会页面置换算法,选择到底把哪一页替换出去或者清空。如果清空如果是修改过的,那么还需要写回硬盘,,如果没有修改则释放。那么就可以使这个页变为空闲状态,在完成第一种情况,从硬盘去把相应的数据读出来,设置页表项,在进行从新执行。

5.后备存储 backing store

大量的数据是放在外存中,需要才会读进来。硬盘存储的数据有好几种形式,放置在内存中所对应的数据和代码。

  1. 数据:访问一个数组,数组是一个大的数据。
  2. 代码:操作系统让程序执行过程中,会去执行每一条指令,指令就是一种数据,放到执行程序中,放在硬盘中。将执行程序的代码当成数据,读到内存中。让CPU去执行,一条条指令。指令不存在的时候,就会进一步执行程序中,数据读到内存中来。
  3. 动态调用库:软件在运行时,需要很多库,库就是放在硬盘中,需要才会读进内存
  4. 以分区的形式存在。程序在运行的过程中,可能产生数据。需要换到硬盘去。操作系统会专门开辟区域(swap) ,里面存放一些没有与文件对应的内容。
  5. 以上四类,形成后备存储。使得虚存管理保证空间的有效性。
    在这里插入图片描述

5.1虚拟内存性能

虚拟内存可以让应用软件感到有更大的内存,更快的访问空间。而内存和硬盘进行读写操作,那么覆盖、交换等技术一样的性能比较大吗?

  • ns是纳秒
  • ms是毫秒
  • p=page fault是缺页的几率。在一段时间内,产生缺页的概率是多大?
  • q=dirty page是对页进行写操作的概率。
  • 10代表的是1次访问内存的时间。
  • (1-p)代表是没有产生缺页的概率是多大
  • 5000000*p代表产生缺页的概率,产生一次缺页,就会进行依次读操作
  • (1+q)把写操作换出去,那么写出去,也会进行依次写硬盘操作。也是5ms
  • 实际硬盘的访问时间是:500000p(1+q)
  • 如果P很大,效率会很差。由于程序由局部性特点,就可以保证缺页数很少,从而p很小。
    在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43989347/article/details/120152137