3-2内存管理-虚拟内存

news2024/11/19 12:39:39

文章目录

  • 一.虚拟内存的基本概念
  • 二.请求分页管理方式
    • (一)页表机制
    • (二)缺页中断机构
    • (三)地址变换机构
  • 三.页面置换算法
    • (一)最佳置换算法OPT
    • (二)先进先出页面置换算法FIFO
    • (三)最近最久未使用置换算法LRU
    • (四)时钟置换算法CLOCK / 最近未用算法NRU
    • (五)改进型时钟置换算法
  • 四.页面分配策略
    • (一)驻留集
      • 1.页面分配策略
      • 2.页面置换策略
      • 3.固定分配局部置换
      • 4.可变分配全局置换
      • 5.可变分配局部置换
    • (二)调入页面时机
    • (三)从何处调入页面
  • 五.抖动/颠簸
  • 六.工作集
  • 七.内存映射文件

一.虚拟内存的基本概念

1.虚拟存储器的特征
(1)多次性
无须在作业运行时一次全部装入内存,而允许被分成多次调入内存运行
(2)对换性
无须在作业运行时一直常驻内存,而允许在作业运行过程中,进行换进和换出
(3)虚拟性
从逻辑上扩充内存的容量,使用户所看到的内存容量远大于实际的内存容量

2.为什么要引入虚拟内存?
多道程序并发执行不仅使进程之间共享了处理器,而且同时共享了主存。然而随着对处理器需求的增长,进程的执行速度会以某种合理平滑的方式慢下来。但是,若同时运行的进程太多,则需要很多的内存,当一个程序没有内存空间可用时,那么它甚至无法运行。所以,在物理上扩展内存相对有限的条件下,应尝试一些其他可行的方式在逻辑上扩充内存。

3.虚拟内存是怎么解决问题的?会带来什么问题?
虚拟内存使用外存上的空间来辅助扩充内存空间,通过一定的换入/换出,使得整个系统在逻辑上能够使用一个远远超出其物理内存大小的内存容量。因为虚拟内存技术调换页面时需要访问外存,会导致平均访存时间增加,若使用了不合适的替换算法,则会大大降低系统性能

4.覆盖技术与虚拟存储技术有何本质上的不同?交换技术与虚拟存储技术中使用的调入/调出技术有何相同和不同之处?
①覆盖技术段的最大长度要受内存容量大小的限制,而虚拟存储器中程序的最大长度不受内存容量的限制,只受计算机地址结构的限制。此外,覆盖技术中覆盖段由程序员设计,且要求覆盖段中的某个覆盖具有相对独立性,不存在直接联系或相互交叉访问;而虚拟存储技术对用户的程序段没有这种要求
②交换技术就是把暂时不用的某个程序及数据从内存移到外存中,以便腾出必要的内存空间,或把指定的程序或数据从外存读到内存的一种内存扩充技术。

  • 相同点:都要在内存与外存之间交换信息
  • 区别:交换技术调入/调出整个进程,因此一个进程的大小要受内存容量大小的限制;而虚存中使用的调入/调出技术在内存和外存之间来回传递的是页面或分段,而不是整个进程,从而使得进程的地址映射具有更大的灵活性,且允许进程的大小比可用的内存空间大

二.请求分页管理方式

(一)页表机制

当内存空间不够时,要实现“页面置换”,操作系统需要通过某些指标来决定到底换出哪个页面。有的页面没有被修改过,就不用写回外存。有的页面修改过,就需要将外存中的旧数据覆盖。只有“写指令”才需要修改“修改位”。(读指令不需要)

在这里插入图片描述

(二)缺页中断机构

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

  • 缺页中断
    在请求分页系统中,每当所要访问的页面不在内存中时,便产生一个缺页中断,请求操作系统将所缺的页调入内存。此时应将缺页的进程阻塞,若内存中有空闲块,则为进程分配一个空闲块,将要调入的页装入该块,并修改页表中相应页表项;若此时内存中没有空闲块,则由页面置换算法选择一个页面淘汰。若该页面在内存期间被修改过,则要将其写回外存。未修改过的页面不用写回外存。
  • 特点:
    ①在指令执行期间而非一条指令执行完后产生和处理中断信号,属于内部中断
    ②一条指令在执行期间,可以产生多次缺页中断

(三)地址变换机构

请求分页管理方式相比于基本分页管理方式新增内容:
①请求调页(找到对应页表项后,若对应页面未调入内存,则产生缺页中断,之后由操作系统的缺页中断处理程序进行处理)
②页面置换(需要调入页面,但没有空闲内存块时进行)
③需要修改请求页表中新增的表项

快表中有的页面一定是在内存中的。若某个页面被换出外存,则快表中的相应表项也要删除,否则可能访问错误的页面。在访问某个页面之后,一般来说只需修改快表中的数据,只有要将快表项删除时才需要写回内存中的慢表。这样可以减少访存次数。
在这里插入图片描述

三.页面置换算法

(一)最佳置换算法OPT

最佳置换算法选择的被淘汰页面是以后永不使用的页面或是在长时间内不再被访问的页面,以保证获得最低的缺页率,但无法实现。(往后找)

在这里插入图片描述
整个过程缺页中断发生了9次,页面置换发生了6次。因此,缺页时未必发生页面置换。若还有可用的空闲内存块,就不用进行页面置换。

缺页率=缺页中断次数/总访问页面次数

(二)先进先出页面置换算法FIFO

优先淘汰最早进入内存的页面,即在内存中驻留时间最久的页面。
特点:实现简单,但性能差,可能出现Belady异常(当为进程分配的物理块数增大时,缺页次数不减反增的异常现象。)

三个内存块,缺页次数9次

在这里插入图片描述
四个内存块,缺页次数10次

在这里插入图片描述

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

优先淘汰最近最久没访问的页面(往前找)
特点:性能较好,但需要硬件支持,实现困难,开销大

在这里插入图片描述

(四)时钟置换算法CLOCK / 最近未用算法NRU

简单的CLOCK算法给每帧关联一个附加位,称为使用位。为每个页面设置一个访问位,再将内存中的页面都通过链接指针链接成一个循环队列。当某页首次装入主存时,将该帧的使用位设置为1;当该页随后再被访问到时,其使用位也被置为1。(访问位为1,表示最近访问过;访问位为0,表示最近没访问过)

特点:实现简单,算法开销小,但未考虑页面是否被修改过

对于页替换算法,用于替换的候选帧集合可视为一个循环缓冲区(循环队列),并有一个指针与之相关联。当某一页被替换时,该指针被设置成指向缓冲区的下一帧。【不替换时指针不动】

当需要替换一页时,操作系统扫描缓冲区查找使用位
①使用位被置为0的帧则换出
②使用位为1的帧时,操作系统将该位置0
③若在这个过程开始时,缓冲区中所有帧的使用位均为0,则选择遇到的第一个帧替换
④若所有帧的使用位均为1,则指针在缓冲区中完整地循环一周,把所有的情况都置为0,并停留在最初的位置上,替换该帧中的页

因此简单的CLOCK算法选择一个淘汰页面最多会经过两轮扫描

[例] 假设系统为某进程分配了五个内存块,并考虑到有以下页面号引用串:1, 3, 4, 2, 5, 6, 3, 4, 7

在这里插入图片描述
访问6号页时,转一圈,1改0,6放入1号页,并将使用位置1,该指针被设置成指向缓冲区的下一帧
在这里插入图片描述
继续访问3号页、4号页,使用位改1,指针不动
在这里插入图片描述
继续访问7号页,从3开始找,3、4号页的使用位改0,淘汰2号页,7号放入,使用位写1。该指针被设置成指向缓冲区的下一帧。

在这里插入图片描述

(五)改进型时钟置换算法

优先淘汰没有修改过的页面。在使用位的基础上增加一个修改位。修改位=0表示页面没有被修改过,修改位=1表示页面被修改过。用(访问位,修改位)的形式表示各页面状态。将所有可能被置换的页面排成一个循环队列,淘汰(0,0)→淘汰(0,1)并将扫描过的页面访问位置0→淘汰(0,0)→淘汰(0,1)

特点:算法开销较小,性能好。选择淘汰一个页面最多进行四轮扫描。

四.页面分配策略

(一)驻留集

指请求分页存储管理中给进程分配的物理块的集合

若驻留集太小,会导致缺页频繁,系统要花大量的时间来处理缺页,实际用于进程推进的时间很少;驻留集太大,又会导致多道程序并发度下降,资源利用率降低。

1.页面分配策略

(1)固定分配:操作系统为每个进程分配一组固定数目的物理块,在进程运行期间不再改变。即,驻留集大小不变
(2)可变分配:先为每个进程分配一定数目的物理块,在进程运行期间,可根据情况做适当的增加或减少。即,驻留集大小可变

2.页面置换策略

(1)局部置换:要根据发生缺页的频率来动态地增加或减少进程的物理块。发生缺页时只能选进程自己的物理块进行置换
(2)全局置换:只要缺页就给分配新物理块。可以将操作系统保留的空闲物理块分配给缺页进程,也可以将别的进程持有的物理块置换到外存,再分配给缺页进程。

在这里插入图片描述

3.固定分配局部置换

(局部置换:自己解决,没有就换入换出)
系统为每个进程分配一定数量的物理块,在整个运行期间都不改变。若进程在运行中发生缺页,则只能从该进程在内存中的页面中选出一页换出,然后再调入需要的页面。

缺点:很难在刚开始就确定应为每个进程分配多少个物理块才算合理,灵活性较低

4.可变分配全局置换

(全局置换:都排队为你服务,其他人都没了再自己解决,其他人会受影响)
刚开始会为每个进程分配一定数量的物理块。操作系统会保持一个空闲物理块队列。当某进程发生缺页时,从空闲物理块中取出一块分配给该进程;若已无空闲物理块,则可选择一个未锁定的页面换出外存,再将该物理块分配给缺页的进程。

采用这种策略时,只要某进程发生缺页,都将获得新的物理块,仅当空闲物理块用完时,系统才选择一个未锁定的页面调出。被选择调出的页可能是系统中任何一个进程中的页,因此这个被选中的进程拥有的物理块会减少,缺页率会增加。

5.可变分配局部置换

(局部置换:自己解决;但频繁换入换出,会被多分配)
刚开始会为每个进程分配一定数量的物理块。当某进程发生缺页时,只允许从该进程自己的物理块中选出一个进行换出外存。如果进程在运行中频繁地缺页,系统会为该进程多分配几个物理块,直至该进程缺页率趋势适当程度;反之,如果进程在运行中缺页率特别低,则可适当减少分配给该进程的物理块。

[例] 在请求分页系统中,页面分配策略与页面置换策略不能组合使用的是__C___
A.可变分配,全局置换
B.可变分配,局部置换
C.固定分配,全局置换
D.固定分配,局部置换

(二)调入页面时机

1.预调页策略
将预计在不久之后便会被访问的页面预先调入内存。这种策略主要用于进程的首次调入,需要程序员指出,成功率仅50%

2.请求调页策略
进程在运行中需要访问的页面不在内存而提出请求,由系统将所需页面调入内存。由这种策略调入的页一定会被访问,且这种策略比较易于实现,因此在目前的虚拟存储器中大多采用此策略。缺点是每次只调入一页,调入/调出页面数多时会花费过多的I/O开销

(三)从何处调入页面

1.系统拥有足够的对换区空间:页面的调入、调出都是在内存与对换区之间进行,这样可以保证页面的调入、调出速度很快。在进程运行前,需将进程相关的数据从文件区复制到对换区。
在这里插入图片描述

2.系统缺少足够的对换区空间:凡是不会被修改的数据都直接从文件区调入,由于这些页面不会被修改,因此换出时不必写回磁盘,下次需要时再从文件区调入即可。对于可能被修改的部分,换出时需写回磁盘对换区,下次需要时再从对换区调入。

在这里插入图片描述
3.UNIX方式:运行之前进程有关的数据全部放在文件区,故未使用过的页面,都可从文件区调入。若被使用过的页面需要换出,则写回对换区,下次需要时从对换区调入。

在这里插入图片描述

五.抖动/颠簸

刚刚换出的页面马上又要换入内存,刚刚换入的页面马上又要换出外存,这种频繁的页面调度行为称为抖动,或颠簸。

产生抖动的主要原因是进程频繁访问的页面数目高于可用的物理块数(分配给进程的物理块不够)

六.工作集

指在某段时间间隔里,进程实际访问页面的集合

在这里插入图片描述

工作集大小可能小于窗口尺寸。实际应用中,操作系统可以统计进程的工作集大小,根据工作集大小给进程分配若干内存块。如:窗口尺寸为5,经过一段时间的监测发现某进程的工作集最大为3,那么说明该进程有很好的局部性,可以给这个进程分配3个以上的内存块即可满足进程的运行需要。

因此,可以根据工作集的大小确定驻留集的大小,一般来说驻留集大小不能小于工作集大小,否则进程运行过程中将频繁缺页。

七.内存映射文件

内存映射文件:操作系统向上层程序员提供的功能(系统调用)。

通过内存映射文件,方便程序员访问文件数据,方便多个进程共享同一个文件。

1.方便程序员访问文件数据
(1)传统文件访问方式
进程使用open系统调用打开文件,使用seek系统调用来指明读取文件的哪部分数据,进程使用read系统调用,指明从当前位置往后读入多少字节的数据。操作系统将该块数据读入内存,进程访问内存中的数据,也可修改数据。保存时使用write系统调用将内存的数据写回磁盘。

在这里插入图片描述
(2)内存映射文件
使用open系统调用指明打开一个文件,使用mmap系统调用,让操作系统把文件映射到进程的虚拟地址空间中。该系统调用给程序员返回一个指针,该指针指向映射区域的起始地址。接下来就可以用访问内存的方式来访问文件数据(指针+地址偏移量来访问某些区域)。

在这里插入图片描述
mmap系统调用建立了文件数据和内存直接的映射关系,并没有把文件数据读入内存。若此时访问的数据在2号块,操作系统将2号块的数据读入主存,而不需要程序员通过read系统调用完成。

进程关闭文件时,使用close系统调用关闭文件,系统自动把文件中被修改的数据写回磁盘。

采用内存映射文件,程序员只需要知道文件在内存中的起始地址,然后即可按照访问内存的方式来访问数据。文件数据的读入和写出都是操作系统自动完成,系统也可通过一些策略来优化I/O效率(如预读入、缓写出策略)。不需要程序员使用read和write系统调用,使得程序员更方便的使用文件数据。

2.方便多个进程共享同一个文件
多个进程可以使用系统调用的方式映射到自己的虚拟地址空间里。这些进程的虚拟地址空间是独立的,操作系统会把这些虚拟地址空间映射到相同的物理内存上(修改进程页表,将页面映射到相同的物理页框上)

在这里插入图片描述

当某进程修改文件数据后,另一个进程也可及时的看到文件数据的改变。因此多个进程可以共享同一个文件的数据。

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

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

相关文章

flowable 简介

flowable 简介目录概述需求:设计思路实现思路分析1.管理2.二、初识Flowable五大引擎3.2.通过编写程序的方式来构造ProcessEngineConfiguration对象4.流程引擎API架构图5.flowable 表结构说明参考资料和推荐阅读Survive by day and develop by night. talk for impor…

Leetcode_单周赛_327

6283. 正整数和负整数的最大计数 代码 直接遍历统计即可 class Solution {public int maximumCount(int[] nums) {int a 0, b 0;for (int i 0; i < nums.length; i) {if (nums[i] > 0) a;else if (nums[i] < 0) b;}return Math.max(a, b);} }6285. 执行 K 次操作…

Python代码实现:坐标轮换法求解多维最优化问题

文章目录多维最优化问题坐标轮换法原理代码实现坐标轮换法坐标轮换法优缺点多维最优化问题 此前介绍的黄金分割法和切线法都是针对一维最优化问题的解决方案。本文开始&#xff0c;我们将最优化问题从一维扩展到多维&#xff0c;暂时仍考虑无约束的优化场景。 坐标轮换法原理…

ArrayList | 简单的洗牌算法

一个洗牌程序需要包含&#xff1a; 创建一副扑克牌&#xff08;除去大小王剩下52张&#xff0c;每种花色13张&#xff09;。洗牌&#xff0c;打乱牌的顺序。揭牌&#xff0c;每位玩家轮流揭牌&#xff0c;从洗完后的牌组中获得自己的牌。因此&#xff0c;我们可以依照以下思路来…

R 语言 4.2.2安装 WGCNA

文章目录1 WGCNA库介绍2 安装踩坑还得是官方文档这样安装我出现的问题参考AppendixA. 安装RB. 配置环境C. 修改镜像1 WGCNA库介绍 WGCNA是用于加权相关网络分析的R包&#xff0c; 相关网络越来越多地用于生物信息学应用 加权基因共表达网络分析是一种系统生物学方法&#xff0…

按键控制电源通断,实现各种设备/电脑开关机低功耗IC

前言 今天记录一下一些硬件开关电的低功耗控制ic&#xff0c;代替物理机械开关&#xff0c;后续有新的更好用的芯片会继续更新此博。 环境 every machine 参考文档 正文 一版我们选择ic&#xff0c;除了功能之外还要看一些性能&#xff0c;这里我暂时录入的功能就是一个按…

SpringCloud从入门到精通(九)

bus bus-概述 • Spring Cloud Bus 是用轻量的消息中间件将分布式的节点连接起来&#xff0c;可以用于广播配置文件的更改或 者服务的监控管理。关键的思想就是&#xff0c;消息总线可以为微服务做监控&#xff0c;也可以实现应用程序之间相通信。 • Spring Cloud Bus 可选的…

【MySQL】为什么使用B+树做索引

【MySQL】为什么使用B树做索引? 索引这个词&#xff0c;相信大多数人已经相当熟悉了&#xff0c;很多人都知道MySQL的索引主要以B树为主&#xff0c;但是要问到为什么用B树&#xff0c;恐怕很少有人能把前因后果讲述的很完整。本文就来从头到尾介绍下数据库的索引。 索引是一…

linux系统中QT控件的操作的基本方法

大家好&#xff0c;今天主要和大家聊一聊&#xff0c;如何学习QT中的控件使用方法。 目录 第一&#xff1a;QT控件基本简介 第二&#xff1a;QPushButton使用方法 第三&#xff1a;QTableWidget简介 第四&#xff1a;最终运行效果 第一&#xff1a;QT控件基本简介 老子曾说…

Rad Studio 11.2 安装 OrangeUI 组件教程

官方文档&#xff1a;http://www.orangeui.cn/components/install 本文参考官方文档进行 11 版本的安装 开始 打开 Rad Studio 11&#xff0c;点击 FIle–Open Project… 找到解压的目录下的 .groupproj 文件 出现移动端提示弹窗&#xff0c;关掉 即可 右键 点击右侧第一个程序…

大数取余公式

ab)modP[(amodP)(bmodP)]modP (ab)modP[(amodP)(bmodP)]modP欢迎使用Markdown编辑器 你好&#xff01; 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章&#xff0c;了解一下Markdown的基本语法知识。 新的改变 …

数据结构-随机化快速排序

一、概念及其介绍 快速排序由 C. A. R. Hoare 在 1960 年提出。 随机化快速排序基本思想&#xff1a;通过一趟排序将要排序的数据分割成独立的两部分&#xff0c;其中一部分的所有数据都比另外一部分的所有数据都要小&#xff0c;然后再按此方法对这两部分数据分别进行快速排…

Jenkins凭证/凭据管理详解

文章目录一、Jenkins中的凭证凭证类型凭证范围系统全局用户凭证域凭证提供者系统凭证提供者 &#xff08;Jenkins 凭证提供者&#xff0c;常用&#xff09;用户凭证提供者文件夹凭证提供者BlueOcean 凭证插件凭证存储二、管理凭证选择凭证提供者选择凭证类型通过提供者指定凭证…

JavaScript---DOM---DOM重点核心---1.8

关于DOM操作&#xff0c;我们主要针对于元素的操作。主要有创建、增、删、改、查、属性操作、事件操作。 创建 document.writeinnerHTMLcreateElement 增 appendChildinsertBefore 删 removeChild 改 主要修改dom的元素属性&#xff0c;dom元素的内容、属性、表单的值等 …

websocket的实现

websocket的实现 本文的websocket实现基于单线程Reactor网络模型的代码实现 初步了解websocket&#xff08;必读&#xff09;:参考连接 websocekt的实现基于http&#xff0c;数据传输与处理过程也很类似&#xff1a;基于reactor的http服务器 websocket握手 websocket基于T…

Python-123练习-02数值运算

文章目录1. 整数四则运算2. 除法运算3. 计算矩形面积4. 计算矩形面积结果保留两位小数5. 计算存款利息6. 计算多个垫片面积的和7. 换披萨8. 表达式求值9. 三角函数计算10. 三角形周长及面积1. 整数四则运算 描述 编写程序&#xff0c;计算2个正整数的和、差、积、商并输出。题…

2023春节祝福系列第一弹(放飞孔明灯,祝福大家身体健康)

2023年春节祝福第一弹 放飞孔明灯&#xff0c;祝福大家身体健康&#xff01; 目录 一、前言 二、一片星光闪烁的旋转星空 &#xff08;1&#xff09;、效果展示&#xff1a; &#xff08;2&#xff09;、相关源代码 &#xff08;3&#xff09;、语法解释 &#xff08;3.…

[ 数据结构 ] 堆排序--------思路、图解、代码

0 基本介绍 堆定义:首先是完全二叉树,分为大顶堆和小顶堆大顶堆:顾名思义,如果将父子节点看成一个堆(三个节点的组合),那么顶的值需要大于其两个子节点的值,即顶大;小顶堆即顶小升序排序使用大顶堆,降序使用小顶堆回顾顺序存储二叉树中,父子节点的关系为:下标为n的节点,它的左…

Java开发 - Spring框架初体验

目录 前言 了解框架的概念 Spring框架 关于Spring 在Maven中使用Spring Spring怎么管理对象 spring怎么创建对象 通过Bean注解创建对象 通过组件扫描创建对象 关于ComponentScan("xxxxxx") Spring Bean的作用域 自动装配技术 什么是自动装配 补充 Io…

MATLAB循环码编译码实验

标题循环码编译码实验一、实验目的1、掌握循环码编码原理和译码原理2、练习使用Matlab编程实现循环码编码和译码二、实验原理伴随式译码捕错译码三、实验要求1、编程实现码长n15的各种循环码的编码、译码&#xff0c;给出相应的码生成多项式、&#xff08;典型&#xff09;监督…