操作系统存储管理之虚拟存储与分页式虚拟存储系统

操作系统存储管理之虚拟存储与分页式虚拟存储系统虚拟存储实现思路在实际运行过程,把有关作业的全部信息都装入主存储器后,作业执行时实际上不是同时使用全部信息的,有些部分运行一遍便再也不用,甚至有些部分在作业执行的整个过程中都不会被使用到(如错误处理部分)。进程在运行时不用的,或暂时不用的,或某种条件下才用的程序和数据,全部驻留于内存中是对宝贵的主存资源的一种浪费,大大降低了主存利用率。于是,提出了这样的问题:作业提交时,先全部进入辅助存储器,作

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

虚拟存储实现思路

在实际运行过程,把有关作业的全部信息都装入主存储器后,作业执行时实际上不是同时使用全部信息的,有些部分运行一遍便再也不用,甚至有些部分在作业执行的整个过程中都不会被使用到(如错误处理部分)。进程在运行时不用的,或暂时不用的,或某种条件下才用的程序和数据,全部驻留于内存中是对宝贵的主存资源的一种浪费,大大降低了主存利用率。
于是,提出了这样的问题:作业提交时,先全部进入辅助存储器,作业投入运行时,能否不把作业的全部信息同时装入主存储器,而是将其中当前使用部分先装入主存储器,其余暂时不用的部分先存放在作为主存扩充的辅助存储器中,待用到这些信息时,再由系统自动把它们装入到主存储器中,这就是虚拟存储器的基本思路。

虚拟存储器定义

具有部分装入和部分对换功能,能从逻辑上对内存容量进行大幅度扩充,使用方便的一种存储器系统。
虚拟存储器是基于程序局部性原理上的一种假想的而不是物理存在的存储器,允许用户程序以逻辑地址来寻址,而不必考虑物理上可获得的内存大小,这种将物理空间和逻辑空间分开编址但又统一管理和使用的技术为用户编程提供了极大方便。此时,用户作业空间称虚拟地址空间,其中的地址称虚地址

分页式虚拟存储系统

基本原理

分页式虚拟存储系统是将作业信息的副本存放在磁盘这一类辅助存储器中,当作业被调度投入运行时,并不把作业的程序和数据全部装入主存,而仅仅装入立即使用的那些页面,至少要将作业的第一页信息装入主存,在执行过程中访问到不在主存的页面时,再把它们动态地装入。用得较多的分页式虚拟存储管理是请页式(demand Paging),当需要执行某条指令或使用某个数据,而发现它们并不在主存时,产生一个缺页中断,系统从辅存中把该指令或数据所在的页面调入内存。
请页式虚拟存储在执行过程中,必然会发生某些页面不在内存中的情况,针对这种情况,处理方法是扩充页表的内容,增加驻留标志位和页面辅存的地址等信息,扩充后的页表如下所示:
这里写图片描述

  • 驻留标志位(又称中断位)用来指出对应页是否已经装入主存,如果某页所对应栏的驻留标志位为1,则表示该页已经在主存;若驻留标志位为 0,此时产生一个缺页中断信号,可以根据辅存地址知道该页在辅助存储器中的位址,将这个页面调入主存。
    在作业执行中访问某页时,硬件的地址转换机构查页表:
    1. 若该页对应驻留标志为1,则按分页实存管理给出的办法进行地址转换,得到绝对地址。
    2. 若该页驻留标志为0,则由硬件发出一个缺页中断,表示该页不在主存。操作系统必须处理这个缺页中断针对缺页中断的具体处理方法是先查看主存是否有空闲块,若有则按该页在辅助存储器中的地址将这个页面找出且装入主存,在页表中填上它占用的块号且修改标志位。若主存已没有空闲块,则必须先淘汰已在主存中的某一页,再将所需的页面装入,对页表和主存分配表作相应的修改
  • 为了提高系统效率,可在页表中增加标志位,其它标志包括修改位(Modified )、引用 位( Renferenced )、禁止缓存位和访问位,用来跟踪页的使用情况。当一个页被修改后,硬件自动设置修改位,一旦修改位被设置,当该页被调出主存时必须重新被写回辅存;若一页在执行过程中没有被修改过,那么不必重新写回到存储器中。引用位则在该页被引用时设置,无论是读或写,它的值被用来帮助操作系统进行页面淘汰。禁止缓存位可以禁止该页被缓存,这一特性对于那些正在与外设进行数据交换的页面时非常重要。访问位则限定了该页允许什么样的访问权限如可读、可写和可执

页面装入策略

 请页式调度

请页式调度是仅当需要访问程序和数据时,才把所在页面装入主存。那么当某个进程第一次执行时,开始会有许多缺页中断,随着越来越多的页面装入主存,根据局部性原理,大多数未来访问的程序和数据都在最近被装入主存的页面中,一段时间之后,缺页中断就会下降到很低的水平,程序进入相对平稳阶段。这种策略的主要缺点是处理缺页中断和调页的系统开销较大,由于每次仅调一页 ,增加了磁盘 I/O 次数。

预调式调度

预调式调度由操作系统预测进程将要使用的那些页面,在使用入之前预先调入主存,每次调入若干个页面,而不是像请页式那样仅调一个页面。由于进程的页面大多数连续存放在辅存储中器,一次调入多个页面能减少磁盘I/O启动次数,节省了寻道和搜索时间。但是如果调入的一批页面中多数未被使用,则效率就很低了,可见预调页要建立在预测的基础上,目前所用预调页的成功率在 50%左右。

页面清除策略

清除策略是与装入策略相对的,它要考虑何时把一个修改过的页面写回辅存储器。

请页式清除

请页式清除是仅当一页选中被替换,且之前它又被修改过,才把这个页面写回辅助存储器

预清除

预清除方法对更改过的页面,在需要之前就把它们都放回辅助存储器,因此可以成批进行。

页面分配策略

分页式虚拟存储系统排除了主存储器实际容量的约束,能使更多的作业同时多道运行,从而提高了系统的效率,但缺页中断的处理要付出相当的代价,由于页面的调入、调出要增加I/O的负担而且影响系统效率,因此应尽可能的减少缺页中断的次数
在请页式系统中,可采用两种策略分配页框给进程:固定分配和可变分配

固定分配

如果进程生命周期中,保持页框数固定不变,称页面分配为固定分配;通常在进程创建时,根据进程类型和程序员的要求决定页框数,只要有一个缺页中断产生,进程就会有一页被替换。

可变分配

如果进程生命周期中,分得的页框数可变,称页面分配为可变分配;当进程执行的某一阶段缺页率较高,说明进程程序目前的局部性较差,系统可多分些页框以降低缺页率,反之说明进程程序目前的局部性较好,可以减少分给进程的页框数。

对比

固定分配策略缺少灵活性,而可变分配的性能会更好些,被许多操作系统所采用。采用可变分配策略的困难在于操作系统要经常监视活动进程的行为和进程缺页中断率的情况,这会增加操作系统的开销。

页面替换策略

实现虚拟存储器能给用户提供一个容量很大的存储器,但当主存空间已装满而又要装入新页时,必须按一定的算法把已在主存的一些页调出去,这个工作称页面替换

如果页面替换算法的作用范围是整个系统,称为全局页面替换算法,它可以在可运行进程之间动态地分配页框。如果页面替换算法的作用范围局限于本进程,称为局部页面替换算法,它实际上需要为每个进程分配固定的页框。

淘汰算法

用来确定应该淘汰哪页的算法,称淘汰算法。

算法的选择是很重要的,选用了一个不适合的算法,就会出现这样的现象:
刚被淘汰的页面又立即要用,因而又要把它调入,而调入不久再被淘汰,淘汰不久再被调入。如此反复 ,使得整个系统的页面调度非常频繁以至于大部时间都化在来回调度页面上。这种现象叫做 “抖动”(Thrashing),又称“颠簸”,一个好的调度算法应减少和避免抖动现象。

缺页中断率

假定作业 p 共计n页,而系统分配给它的主存块只有 m 块(m,n均为正整数,且1≤m≤n),即最多主存中只能容纳该作业的m页。如果作业p在运行中成功的访问次数为s(即所访问的页在主存中), 不成功的访问次数为F(即缺页中断次数),则总的访问次数A为:
A = S + F
又定义:
f = F / A
则称 f 为缺页中断率。影响缺页中断率 f 的因素有:
1. 主存页框数。作业分得的主存块数多,则缺页中断率就低,反之,缺页中断率就高。
2. 页面大小。如果划分的页面大,则缺页中断率就低,否则缺页中断率就高
3. 页面替换算法。
4. 程序特性。程序编制的方法不同,对缺页中断的次数有很大影响,程序的局部性要好

页面替换算法

一个理想的替换算法是:当要调入一页而必须淘汰一个旧页时,所淘汰的页应该是以后不再访问的页或距现在最长时间后再访问的页。这样的调度算法使缺页中断率为最低。然而这样的算法是无法实现的因为在程序运行中无法对以后要使用的页面作出精确的断言。不过,这个理论上的算法可以用来作为衡量各种具体算法的标准。

下面介绍几种实用的页面调度算法:

随机页面替换算法

要淘汰的页面是由一个随机数产生程序所产生的随机数来确定,选择一个不常使用的页面会使系统性能较好,但这种调度算法做不到这一点,虽很简单但效率却低,一般不采用。

先进先出页面替换算法( FIFO )

先进先出调度算法是一种低开销的页面替换算法,基于程序总是按线性顺序来访问物理空间这一假设。这种算法总是淘汰最先调入主存的那一页,或者说在主存中驻留时间最长的那一页(常驻的除外)
这种算法较易实现,但效率不高,因为在主存中驻留时间最长的页面未必是最长时间以后才使用的
页面。也就是说,如果某一个页面要不断地和经常地被使用,采用FIFO算法,在一定的时间以后就会变成驻留时间最长的页,这时若把它淘汰了,可能立即又要用,必须重新调入

最近最少用页面替换算法( LRU,least Recently used )

最近最少用调度算法是一种通用的有效算法,被操作系统、数据库管理系统和专用文件系统广泛采用。该算法淘汰的页面是在最近一段时间里较久未被访问的那一页。它是根据程序执行时所具有的局部性来考虑的,即那些刚被使用过的页面,可能马上还要被使用,而那些在较长时间里未被使用的页面,一般说可能不会马上使用到。

第二次机会页面替换算法

FIFO 算法可能会把经常使用的页面淘汰掉,可以对 FIFO 算法进行改进,把FIFO算法与页表中的”引用位”结合起来使用,算法可实现如下:
首先检查FIFO中的队首页面(这是最早进入主存的页面),如果它的”引用位”是0,那么这个页面既老又没有用,选择该页面淘汰;如果它的”引用位”是 1,说明虽然它进入主存较早,但最近仍在使用。于是把它的”引用位”清成0,并把这个页面移到队尾,把它看作是一个新调入的页。这一算法称为第二次机会(second chance)算法,其含义是最先进入主存的页面,如果最近还在被使用的话,仍然有机会作为像一个新调入页面一样留在主存中。

时钟页面替换算法 (Clock Policy)

如果利用标准队列机制构造FIFO队列,第二次机会页面调度算法将可能产生频繁地出队入队,实现代价较大。因此,往往采用循环队列机制构造页面队列,这样就形成了一个类似于钟表面的环形表,队列指针则相当于钟表面上的表针,指向要淘汰的页面,这就是时钟页面替换算法的得名
算法的实现要点:
1. 一个页面首次装入主存时,其”引用位”置 0。
2. 在主存中的任何一个页面被访问时, 其”引用位”置 1。
3. 淘汰页面时,存储管理从指针当前指向的页面开始扫描循环队列,把所迁到的”引用位”是 1 的页面的”引用位”清成 0,并跳过这个页面; 把所迁到的”引用位”是0的页面淘汰掉,指针推进一步。

最不常用页面替换算法(LFU :Least Erequently used )

如果对应每一页设置一个计数器,每当访问一页时,就使它对应的计数器加1。过一定时间 t 后 ,将所有计数器全部清0。当发生缺页中断时,可选择计数值最小的对应页面淘汰,显然它是在最近一段时间里最不常用的页面。这种算法实现不难,但代价太高而且选择多大的 t 最适宜也是个难题。

下面是针对几个页面替换算法的效率对比图:
这里写图片描述

写时复制(copy-on-write)

写时复制(copy-on-write)是存储管理用来节省物理内存(页框)的一种页面级优化技术,已被unix 和 Windows等许多操作系统所采用,它能减少主存页面内容的复制操作,减少相同内容页面在主存的副本数目。

当两个进程(如父子进程)共享一个页面时,并不是立即为每个进程各建一个页面副本,而是把该页面定义为只读方式,让诸进程共享。当其中某个进程要修改页面内容执行写操作时,会产生一个”写时复制”中断,操作系统处理这个中断信号,为该进程分配一个空闲页框,复制页面的一个副本,且修改相应的页表项,当进程重新执行写页面操作时指令被顺利执行。

下图是写时复制前的示意图
这里写图片描述
当进行写时复制操作时,示意图如下所示:
这里写图片描述

可见操作系统采用写时复制技术后,就可以延迟到修改时才对共享页面做出副本,从而.节省了大量页面复制操作和副本占用空间。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/189262.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • MATLAB画图使用不同的颜色

    MATLAB画图使用不同的颜色1.自动使用不同的颜色plot(x1,y2,x2,y2,x3,y3,…);此方法比较简单,能满足一般需要。但默认只能在7种颜色之间循环,具体的颜色可通过以下命令查看get(gca,’ColorOrder’)具体实例:x1=linspace(1,10,100);y1=sin(x1);y2=cos(x1);y3=1./(x1);plot…

  • SpringBoot集成Quartz动态定时任务「建议收藏」

    SpringBoot自带schedule沿用的springboot少xml配置的优良传统,本身支持表达式等多种定时任务注意在程序启动的时候加上@EnableScheduling@Scheduled(cron="0/5****?")publicvoidjob(){System.out.println("每五秒执行一次");}…

  • 退出卸载360、QAX 天擎,无需密码

    退出卸载360、QAX 天擎,无需密码退出卸载360、QAX天擎,无需密码天擎企业版,退出和卸载是需要管理员密码进入360天擎,点击设置=>防护中心=>自我保护功能,去掉勾选,确认\360Safe\EntClient\conf\EntBase.dat目录目录查找:在桌面右下角找到天擎应用程序右键,进入程序安装位置,即可进入安装目录EntBase.dat文件删除uipassqtpass两行=后面的两个字符串即可关闭退出卸载密码。这里如果没有权限无法修改,先将EntBase.dat复制到其他文件夹(

  • FastJson对BigDecimal保留两位小数(valueFilter)「建议收藏」

    FastJson对BigDecimal保留两位小数(valueFilter)「建议收藏」2019独角兽企业重金招聘Python工程师标准>>>…

  • spring和springboot常用注解_Java常用注解

    spring和springboot常用注解_Java常用注解一、Spring常用注解Spring常用注解(绝对经典)二、Jpa1、@Entity,@Table(name=””)表明这是一个实体类,一般用于jpa,这两个注解一块使用,但是如果表名和实体类名相同的话,@Table可以省略。2、@MappedSuperClass基于代码复用和模型分离的思想,在项目开发中使用jpa的@MappedSuperClass注解,将实体类的多个属性分别封装到不同的非实体类中。例如,数据库表中都需要id来表示编号,id是这些映射实体类的通用属性,交给jpa统

  • JAVA生成XML文件

    JAVA生成XML文件

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号