操作系统【六】虚拟内存

传统存储管理方式的不足

  • 一次性:作业必须一次性全部装入内存后才能开始运行。这会造成:当作也很大时不能全部装入内存;当大量作业要求运行时,由于内存无法容纳所有作业,因此只有少量作业能够运行,导致多道程序并发度下降
  • 驻留性:一旦作业被装入内存,就会一直留驻在内存中,直至作业运行结束。导致内存中驻留大量的、暂时用不到的数据,浪费了宝贵的内存资源。

局部性原理

  • 时间局部性:如果执行了程序中的某条指令,那么不久后这条指令很可能再次执行;如果某个数据被访问过,那么这个数据很可能再次被访问
  • 空间局部性:一旦程序访问了某个存储单元,在不久之后,其附近的存储单元也很有可能被访问。

高速缓冲技术的思想:将近期会频繁访问到的数据放到更告诉的存储器中,暂时用不到的数据放在更低速存储器中。
在这里插入图片描述
快表机构就是将近期长访问的页表项副本放到更高速的联想寄存器中。

虚拟内存

由于局部性原理,在程序装入时,可以将程序中很快用到的部分装入内存,暂时用不到的部分留在外存,就可以让程序开始执行。在程序执行过程中,当访问的信息不在内存时,由操作系统负责将所需信息从外存调入内存,然后继续执行程序。若内存空间不够,由操作系统负责将内存中暂时用不到的信息换出外存。

在操作系统的管理下,在用户看来似乎有一个比实际内存大得多的内存,这就是虚拟内存。(操作系统虚拟性的体现)

虚拟内存的最大容量是由计算机的地址结构(CPU寻址范围)确定的
虚拟内存的实际容量=min(内存和外存容量之和,CPU寻址范围)

主要特征:

  • 多次性:允许多次装入
  • 对换性:允许作业运行过程中将作业换入换出
  • 虚拟性:使得用户看到的内存容量大于实际容量

在这里插入图片描述

主要区别:如果访问的信息不再内存时,有操作系统将所需信息从外存调入内存(请求调页/段
如果内存空间不够,由操作系统负责将内存中暂时用不到的信息换到外存(页面/段置换

请求分页管理方式

请求调页:操作系统需要知道每个页面是否已经调入内存;如果没有调入,需要知道该页面在外存存放的位置
页面置换:根据某些指标来决定换出哪些页面,有的页面没有被修改过,就不用再浪费时间写回外存。有的页面修改过,就需要将外存中就数据覆盖,因此操作系统需要记录各个页面是否被修改的信息。
在这里插入图片描述

缺页中断机构

在请求分页系统中,每当要访问的页面不再内存时,便产生一个缺页中断,然后由操作系统的缺页中断处理程序处理中断。此时缺页的进程阻塞,放入阻塞队列,调页完成后再将其唤醒,放回就绪队列。

如果内存中有空闲块,则为进程分配一个空闲块,将所缺页面装入该块,并修改页表中相应的页表项。
如果内存中没有空闲块,则由页面置换算法选择一个页面淘汰,若该页面在内存期间被修改过,则要将其写回外存。未修改过的页面不用写回外存。

缺页中断是因为当前执行的指令想要访问的目标页面未调入内存而产生的,因此属于内中断。
一条指令在执行期间可能产生多次缺页中断
在这里插入图片描述

地址变换

请求分页存储管理与基本分页存储管理的区别:
新增步骤1:请求调页(查到页表项时进行判断)
新增步骤2:页面置换(需要调入页面,但没有空闲内存块时)
新增步骤3:需要修改请求页表中新增的表项

在这里插入图片描述在这里插入图片描述

  • 只有写指令才需要修改修改位。并且,一般来说只需要修改快表中的数据,只有要将快表想删除时才需要写回内存中的慢表,这样就可以减少访存次数。
  • 和普通的中断处理一样,却也中断处理依然需要保留CPU现场
  • 页面换入/换出都要启动慢速的I/O操作
  • 页面调入内存后,需要修改慢表,同时也需要将表项复制到快表中

页面置换算法

最佳置换算法(OPT)

每次选择淘汰的页面将时以后永不使用或者在最长时间内不再被访问的页面,这样可以保证最低的缺页率。
注意:缺页时未必发生页面置换,若还有可用的空闲内存块,就不用进行页面置换
缺页率=缺页中断次数/页面访问次数
只有没有空闲内存块的缺页中断才需要页面置换
理想化算法,实际无法实现

先进先出置换算法(FIFO)

每次选择淘汰的页面是最早进入内存的页面
把调入内存的页面根据调入的先后顺序排成一个队列,需要换出页面时选择队头,将新页面放入队尾
Belady异常:当为进程分配的物理块数增大时,缺页次数不减反增的异常现象。
只有FIFO算法会产生Belady异常

最近最久未使用置换算法(LRU)

每次淘汰的页面是最近最久未使用的页面
实现方法:在每个页面对应的页表项中,用访问字段记录该页面自从上次被访问以来经历的时间t,当需要 淘汰一个页面时,选择现有页面中t中最大的,即最近最久未使用的页面

算法性能好,实现困难,开销大
性能最接近OPT

时钟置换算法(CLOCK)

是一种性能和开销较均衡的算法,又称作CLOCK算法,或最近未使用算法(NRU not recently used)

简单CLOCK算法实现:为每个页面设置一个访问位(1,表示最近访问,0,表示最近没有访问),再讲内存中的页面都通过链接指针链接成一个循环队列。当某页被访问时,其访问位置为1。当需要淘汰一个页面时,只需要检查页的访问位,如果时0,就将该页换出;如果是1,则将它置为0,暂不换出,继续检查下一个页面。若第一轮扫面中所有页面都是1,则将这些页面的访问位依次置为0后再进行第二次扫描。

简单CLOCK算法选择一个淘汰页面最多会经过两次扫描。

改进型的时钟置换算法:简单时钟置换算法仅仅考虑一个页面最近是否被访问,事实上,如果被淘汰的页面没有被修改过,就不需要执行I/O操作写回外存。只有被淘汰的页面被修改过时才需要写回外存。
因此考虑一个页面最近有没有被访问过之外,操作系统还应该考虑页面有没有被修改过。在其他条件都相同时,应优先淘汰没有修改过的页面,避免I/O操作。
实现:设置修改位,0表示没有被修改,1表示被修改。
(访问位,修改位)
算法规则:
将所有可能被置换的页面排成一个循环队列

  1. 从当前位置开始扫描第一个(0,0)的帧用于替换,不修改任何标志位
  2. 如果第一轮扫描失败,则重新扫描。查找第一个(0,1)的帧用于替换,本轮将所有扫描过的帧访问位设为0
  3. 如果第二轮扫描失败,则重新扫描,查找第一个(0,0)的帧用于替换,本轮扫描不修改任何标志位
  4. 若第三轮扫描失败,则重新扫描,找到第一个(0,1)的帧用于替换。

由于第二轮已经将所有帧的访问位设置为0,因此经过第三轮第四轮扫描一定会有一个帧被选中,因此改进型CLOCK置换算法选择一个淘汰页面最多会进行四次扫描

在这里插入图片描述
在这里插入图片描述

页面分配置换策略

驻留集:请求分页管理中给进程分配的物理块的集合
在采用了虚拟存储的系统中,驻留集大小一般小于进程的总大小
如果驻留集太小,则会频繁缺页,系统要花大量的时间处理缺页,实际用于进程推进的时间很少
驻留集太大,会导致多道程序并发度下降,资源利用率降低。

  • 固定分配:操作系统为每个进程分配一组固定数目的物理块,在进程运行期间不再改变。

  • 可变分配:纤维每个进程分配一定数目的物理块,在进程运行期间可根据情况做适当的增加或者减少,即,驻留集大小可变

  • 局部置换:发生缺页时只能选进程自己的物理块进行置换

  • 全局置换:可以将操作系统保留的空闲物理块分配给却也进程,也可以将别的进程持有的物理块置换到外存,再分缺页进程。
    在这里插入图片描述

  • 固定分配局部置换:缺点:很难在刚开始就确定为每个进程分配多少个物理块才算合适。采用这种策略的系统一般会根据一定的参数确定内存块

  • 可变分配全局置换:只要某进程发生缺页,都能获得新的物理块,仅当空闲物理块用完时,系统才选择一个未锁定的页面调出。被选择调出的页面可能是系统中任何一个进程中的页,因此这个被选中的进程拥有的物理块会减少,缺页率会增加。
    系统会锁定一些页面,这些页面中的内容不能置换出去。

  • 可变分配局部置换:如果进程在运行中频繁地换页,系统回味该进程多分配几个物理块,直至该进程缺页率趋势适当程度。反之,如果进程在运行时缺页率特别低,可适当减少分配给该进程的内存块。

可变分配全局置换:只要就分配新物理块
可变分配局部置换:根据缺页率动态增加或者减少物理块

调入页面

时间

  • 预调页策略:根据局部性原理,一次调入若干个相邻的页面可能比一次调入一个页面更加高效。预测不久之后可能要访问的页面,将他们预先调入内存。预测成功率只有50%。这种策略主要用于进程的首次进入
  • 请求调页策略:进程在运行期间发现缺页才将所缺页面调入内存。这种策略调入的页面一定会被访问到。但是每次都只能调入一页,而每次调页都要磁盘I/O操作,因此I/O开销较大

地点

在这里插入图片描述

  • 如果系统拥有足够的调换去空间,页面的调入调出都是内存与对换区之间进行的,这样可以保证页面的调入调出速度很快。在进程运行前,需要讲进程相关的数据从内存区复制到对换区。
  • 如果系统缺少足够的对换区空间:凡是不会被修改的数据都直接从文件区调入,由于这些页面不会被修改,因此换出时不需要写回磁盘,下次需要时再从文件区调入即可。对于可能被修改的部分,换出时需要写回磁盘对换区,下次需要时再从对换区调入。
  • UNIX:运行之前进程有关的数据全部放在文件区,故未使用过的页面都可以从文件区调入。若被使用过的页面需要换出,则写回对换区,下次需要时再从对换区调入。

抖动(颠簸)现象

抖动现象是指在更换页面时,如果被更换的页面是一个很快再次访问的页面,则会频繁地发生页面调度,以至于调度页面所需时间过长,系统效率急剧下降的现象。

解决策略:

  • 有针对性地选择更优秀的页面置换算法以减少页面替换策略失误
  • 挂起低优先级的进程,减少多道程序数量使得能够增大驻留集,让进程拥有更多的内存块
  • 给进程分配合适大小的内存块。为了解决给进程分配多少个内存块比较合适,可以使用Denning提出的 “工作集”的概念进行解决。首先操作系统根据窗口尺寸统计工作集的大小,然后让驻留集的大小大于等于工作集的大小即可。与之相关的我们可以每次选择一个不再工作集中的页面进行淘汰。
  • 使用L=S准则调节缺页率,让程序最大可能地并发处理,提高磁盘和处理机的利用率。

工作集

工作集:在某段时间间隔内,进程实际访问页面的集合
驻留集:请求分页存储管理中给进程分配的内存块的集合

在这里插入图片描述
一般来说驻留集的大小不能小于工作集的大小,否则进程运行过程中将会频繁缺页

拓展:基于局部性原理可知,进程在一段时间内访问的页面与不久之后访问的页面是有相关性的。因此可以根据近期访问的页面集合来设计页面置换算法:选择一个不再工作集中的页面进行淘汰

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/383639.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SQL Server【一】简介和基本概念和命令

数据结构和数据库的区别 数据库是应用软件级别研究数据的存储和操作(主要针对磁盘上的数据) 数据结构是在系统软件级别研究数据的存储和操作(主要是针对内存中的数据) 对硬盘数操作是数据库的强项,是数据库研究的核心…

Linux下网络socket编程——实现服务器(select)与多个客户端通信

一、关于socket通信 服务器端工作流程: 调用 socket() 函数创建套接字 用 bind() 函数将创建的套接字与服务端IP地址绑定调用listen()函数监听socket() 函数创建的套接字,等待客户端连接 当客户端请求到来之后调用 accept()函数接受连接请求&#xff0c…

SQL Server【四】

identity 主键自动增长,用户不需要为identity修饰的主键赋值 create table student (std_id int primary key identity(10,5),--(10,5)可以省略,默认为(1,1)std_name nvarchar(200) not null ) select * from student insert into student values (张三…

计算机网络【4】传输层

概述 传输层是只有主机才有的层次 传输层的功能: 传输层提供进程和进程之间的逻辑通信(网络层提供主机与主机之间的逻辑通信)复用和分用传输层对收到的报文进行差错检测 传输层有两个协议: 面向连接的传输层控制协议TCP&…

计算机网络【0】概述

计算机网络概念和功能 概念 是一个将分散的、具有独立功能的计算机系统,通过通信设备与线路连接起来,由功能完善的软件实现资源共享和信息传递的系统。 计算机网络是互连的、自治(无主从关系)的计算机集合。 功能 数据通信&am…

计算机网络【1】物理层

物理层解决如何在连接各种计算机的传输媒体上传输数据比特流,而不是指具体的传输媒体。 确定与传输媒体接口有关的特性 机械特性:定义物理连接的特性,如规格、接口形状、引线数目、引脚数目、排列电气特性:规定传输二进制位时的电…

计算机网路【2】数据链路层

结点:主机、路由器 链路:两个节点的物理通道 数据链路:逻辑通道,把实现 控制数据传输协议的硬件和软件加到链路上就构成数据链路 帧:链路层的协议数据单元,封装网络层数据报 数据链路层在物理层提供服务的…

计算机网络【5】应用层

应用层对应用程序的通信提供服务 应用层协议定义: 应用层的功能: 文件传输、访问和管理电子邮件虚拟终端查询服务和远程作业登录 重要协议:FTP、SMTP、POP3、HTTP、DNS 网络应用模型 客户/服务器模型(Client/Server&#x…

操作系统【八】文件管理

文件:一组有意义的信息/数据集合 文件的属性: 文件名:由创建文件的用户决定文件名,主要是为了方便用户找到文件。同一个目录下不允许有重名文件标识符:一个系统内的个文件标识符唯一,对用户来说毫无可读性…

数据库原理及应用【六】数据库设计

数据依赖 函数依赖FD:一个属性或者一组属性的值可以决定另一个属性的值 多值依赖MVD:一个属性或者一组属性的值可以决定另一个属性的值的集合。FD是MVD的特例 符号表示:Name->->Course,课程多值依赖于姓名 连接依赖&#x…

数据库原理及应用【二】数据模型

层次模型 tree Record and fieldParent-Child relationship(PCR) 每个记录类型只有一个父节点 无法表达多对多信息 采用虚记录解决多对多 网状数据模型 系:主记录->属记录 主记录和属记录都可以有好多个 关系模型 表:table/relation 拥有更高的…

数据可视化【二】HTML+CSS+SVG+D3

HTML、CSS和SVG学习实现代码&#xff1a;https://vizhub.com/Edward-Elric233/89185eb96bc64a9d81777873a0ccd0b9 index.html <!DOCTYPE html> <html><head><title>Shapes with SVG and CSS</title><link rel"stylesheet" href&qu…

数据可视化【三】基本概念

Visualization is suitable when there is a need to augment human capabilities rather than replace people with computational decision-making methods. 当可以信赖的智能化的解决方案存在的时候&#xff0c;可视化是不必要的。 当不知道需要分析的问题是什么的时候&…

数据可视化【四】Bar Chart

Make a Bar Chart Representing a data table in JavaScriptCreating rectangles for each rowUsing linear and band scalesThe margin conventionAdding axes 以下学习内容参考博客&#xff1a;传送门 select()选择所有指定元素的第一个 selectAll()选择指定元素的全部 上…

数据库原理及应用【三】DBMS+SQL

DBMS Query LanguagesInterface and maintaining tools(GUI)APIsClass Library QL 不是图灵完备的&#xff0c;不是一种编程语言。 QL SQL是一种非过程化的查询语言。 DDL数据定义语言&#xff1a;表&#xff0c;视图QL 查询语言DML 数据操纵语言DCL 数据控制语言 Base t…

数据可视化【五】 Scatter Plot

Scatter Plot vizhub上实现的代码&#xff1a; https://vizhub.com/Edward-Elric233/53807a1b35d94329b3689081cd2ea945 https://vizhub.com/Edward-Elric233/b9647d50899a4a0e8e917f913cd0a53a https://vizhub.com/Edward-Elric233/8c6b50cd81a04f048f490f48e4fe6264 由前…

数据可视化【六】Line Chart Area Chart

Line Chart vizhub代码&#xff1a; https://vizhub.com/Edward-Elric233/094396fc7a164c828a4a8c2e13045308 实现效果&#xff1a; 这里先使用d3.line()设置每个点的x坐标和y坐标&#xff0c;然后再用这个东西设置path的d属性&#xff0c;就可以得到曲线。 const lineGen…

数据可视化【七】 更新模式

Enter 以下面这个简单的代码进行分析 const svg d3.select(svg); // svg.style(background-color, red); testconst height svg.attr(height); // equals paresFloat() const width svg.attr(width);const makeFruit type >( {type} ); //这种写法好像能够直接得到一个…

数据可视化【八】根据数据类型选择可视化方式

Marks:Rows PointsLinesAreas Channels:Columns PositionColorShape

数据可视化【九】单向数据流交互

我们使用一下上上篇博客的代码。 例如我们想要当鼠标点击水果的时候会出现黑色的框&#xff0c;再点击一下黑色的框就会消失。 首先&#xff0c;我们应该给组件添加点击事件&#xff1a; fruitBowl.js gruopAll.on(click, d > onClick(d.id));这个on函数第一个参数是事件…