三、内存管理 (二)虚拟存储器

news2024/12/27 13:31:32

目录

2.1虚拟内存的基本概念

2.2内存分配策略

2.2.1驻留集大小

2.2.2固定分配局部置换

2.2.3可变分配全局置换

2.2.4可变分配局部置换

2.3地址变换机构 

2.3.1页表机制

2.3.2预调页策略和请求调页策略 

2.3.3缺页中断机构

2.3.4对换区与文件区

2.3.5页面置换算法

2.3.5.1最佳(OPT)置换算法

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

2.3.5.3最近最久未使用置换算法

2.3.5.4时钟(CLOCK)置换算法

2.3.5.5改进型CLOCK置换算法

2.3.6抖动和工作集


2.1虚拟内存的基本概念

前面介绍的连续分配管理方式、基本分页(分段、段页)管理方式等传统内存管理策略具有以下两个特征:

  • 一次性。作业必须一次性全部装入内存后,才能开始运行。
  • 驻留性。作业被装入内存后,就一直驻留在内存中。

虚拟内存技术实际上是建立了“内存——外存”的两级存储结构,为了解决内存容量小的问题。而“cache——内存”层是为了解决CPU和主存速度不一致的问题。两者在问题与解决方法上有许多共同点。

系统好像为用户提供了一个比实际内存容量大得多的存储器,称为虚拟存储器

虚拟内存技术具有以下特征:

  • 多次性是指无须在作业运行时一次性全部装入内存,只需将当前要运行的那部分程序和数据装入内存即可开始运行。以后每当要运行到尚未调入的那部分程序,再将它调入。是虚拟存储器最重要的特征。
  • 对换性。是指无须在作业运行时一直常驻内存,在进程运行期间,允许将那些暂时不使用的程序和数据从内存调至外存的对换区(换出),待以后需要时再将它们从外存调至内存(换进)。正是由于对换性,虚拟存储器才得以正常运行。

实现上述特征之后,虚拟存储器就有了虚拟性,即用户看到的内存容量远大于实际的内存容量。

我们应该以之前小节讨论的传统存储器管理方式为基础来增加虚拟性的特点,很明显连续分配方式每个分区空间过大,无法从逻辑上扩大内存容量。因此主要有请求分页存储管理请求分段存储管理请求段页存储管理三种方式。

不管哪种方式都需要有一定的硬件支持,这也是下面讨论的重点方面:

  • 一定容量的内存和外存
  • 页表机制、段表机制(应该增加一些功能来实现虚拟性)
  • 中断机构。当用户程序要访问的部分尚未调入内存时,则产生中断。
  • 地址变换机构(虚实地址的转变即逻辑地址到物理地址)

进而有以下问题:

  • 2.2新的页框分配策略(传统方式因为要全部放入内存基本和进程大小一致)
  • 2.3地址变换机构(为了实现虚拟内存需要增加什么功能)
  • 2.3.1页表机制(页表需要增加什么字段)
  • 2.3.2调入页面的时机(要确定系统将进程运行时所缺的页面调入内存的时机)
  • 2.3.3缺页中断机构(发生缺页时的处理)
  • 2.3.4从何处调入页面(磁盘I/O操作的处理也会影响虚拟存储器的性能)
  • 2.3.5页面置换算法(内存已无空闲空间时选择调出页面的算法)

2.2内存分配策略

2.2.1驻留集大小

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

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

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

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

全局置换:可以将操作系统保留的空闲物理块分配给缺页进程,也可以将别的进程持有的物理块置换到外存,再分配给缺页进程。

没有固定分配全局置换这种方式,因为这种方式进行全局置换时必定会破坏驻留集大小不变这个特点,产生矛盾。

2.2.2固定分配局部置换

采用固定分配局部置换策略时可以采用以下的物理块调入算法:

  • 平均分配算法。平均分配给每一个进程。
  • 按比例分配算法。根据进程的大小按比例分配物理块。
  • 优先权分配算法。为重要和紧迫的进程分配较多物理块。通常也可以采用部分按比例分配,部分按优先权分配的策略。 

2.2.3可变分配全局置换

 

2.2.4可变分配局部置换

 

  • 可变分配全局置换:只要缺页就给分配新物理块
  • 可变分配局部置换:要根据发生缺页的频率来动态地增加或减少进程的物理块。

2.3地址变换机构 

 

 补充细节:

  1. 只有“写指令”才需要修改“修改位”。并且,一般来说只需修改快表中的数据,只有要将快表项删除时才需要写回内存中的慢表。这样可以减少访存次数。
  2. 和普通的中断处理一样,缺页中断处理仍然需要保留CPU现场。
  3. 需要用某种“页面置换算法”来决定一个换出页面
  4. 换入/换出页面都需要启动慢速的I/O操作,可见如果换入/换出太频繁会有很大开销。
  5. 页面调入内存后,需要修改慢表同时也需要将表项复制到快表中。

2.3.1页表机制

可以与cache块内容进行对比学习cache行位数=标记位(tag)+有效位+替换控制位+修改位+数据位。

状态位有效位功能类似,一个是判断是否调入内容,一个是判断是否调入Cache。

访问字段替换控制位功能类似,一个是用于页面置换算法参考,一个是用于cache替换算法参考。

修改位修改位(脏位)功能类似,一个是判断调入内存后是否修改过,一个是判断调入Cache后是否修改过。

标记位(tag)数据位。标记位的作用是判断是否命中cache,数据位是相应的块的存储信息。

内存块号外存块号。内存块号是用来进行虚实地址转换,外存块号是为了缺页时调入内存。

2.3.2预调页策略和请求调页策略 

 

 预调入实际上就是运行前的调入,请求调页实际上就是运行期间调入。

2.3.3缺页中断机构

缺页中断是因为当前执行的指令想要访问的目标页面未调入内存而产生的,因此属于内中断中的故障(fault)

一条指令在执行期间,可能产生多次缺页中断。(如:copyAtoB,即将逻辑地址A中的数据复制到逻辑地址B,而A、B属于不同的页面,则有可能产生两次中断) 

2.3.4对换区与文件区

2.3.5页面置换算法

2.3.5.1最佳(OPT)置换算法

最佳置换算法(OPT,Optimal):每次选择淘汰的页面将是以后永不使用,或者是最长时间不再被访问的页面,这样可以保存最低的缺页率。 

操作系统无法提前预判页面访问序列,因此这是一种无法实现的算法

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

先进先出置换算法(FIFO,first in first out):每次选择淘汰的页面最早进入内存的页面

实现方法:把调入内存的页面根据调入的先后顺序排成一个队列,需要换出页面时选择队头页面即可,队列的最大长度取决于系统为进程分配了多少个内存块。

2.3.5.3最近最久未使用置换算法

最近最久未使用置换算法(LRU,least recently used):每次淘汰的页面是最近最久未使用的页面。

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

实现起来需要专门的硬件支持,算法开销大。

2.3.5.4时钟(CLOCK)置换算法

时钟置换算法又称CLOCK算法最近未用算法(NRU,not recently used) 

  • 第一轮:扫描整个循环队列,为1的就改为0在继续循环,尝试找到一个访问位为0的置换。
  • 第二轮:由于上一轮全是1才进入了第二轮,那么目前第二轮的第一个必是0。

2.3.5.5改进型CLOCK置换算法

 

  • 按照未访问未修改未访问修改访问未修改访问修改的次序进行。即以简单时钟置换算法为标准(访问位重要)

2.3.6抖动和工作集

刚刚换出的页面马上又要换入内存,刚刚换入的页面马上又要换出外存,这种频繁的页面调度行为称为抖动,或颠簸。产生抖动的主要原因是进程频繁访问的页面数目高于可用的物理块数(分配给进程的物理块不够

 一般来说,驻留集不能小于工作集,否则进程运行过程中将频繁缺页。

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

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

相关文章

搭建springWeb保姆级教程

经过我们对mybatis和spring框架的学习,我们即将要用框架进行前后端数据交互,已经脱离了那种用servlet的方式进行数据传输,今天让我们来搭建最基本的springweb框架!!! 1.创建一个web项目 1. 2. 选择一个we…

自定义线程实现c++代码回调run方法

目录 pthread_create函数介绍 前面写过一篇文章《Thread类的start()方法创建线程的底层分析》,这次来自定义一个线程,并实现在底层创建内核线程来执行用户代码。 pthread_create函数介绍 在这之前,先熟悉下Linux中创建内核线程函数pthread…

【计算机视觉】 摄像机标定

摄像机标定 齐次坐标 齐次坐标,将欧氏空间的无穷远点,与投影空间中有实际意义的消失点,建立起映射关系。 把齐次坐标转化为笛卡尔坐标的方法:是前面n-1个坐标分量分别除以最后一个分量即可 一些解释和性质: 比较好的…

Linux最常用命令用法总结(精选)

1. su 普通用户切换root用户 ubuntuubuntu20:~$ su Password: rootubuntu20:/home/ubuntu# exit exit ubuntuubuntu20:~$ 2. clear 清除当前终端显示的输出快捷键ctrlL键 3. cd 改变目录 ubuntuubuntu20:~/workspace$ cd .. ubuntuubuntu20:~$ cd / ubuntuubuntu20:/$ c…

docker下搭建redis集群

1. 环境准备 准备好Linux系统机器,并安装好docker,阅读这篇文章前请先了解清楚docker的基本知识并且会熟悉运用docker的常用命令。学习docker基础知识可以参考这篇博文 安装好并启动docker后就可以开始搭建redis了 2. docker容器下安装redis 本篇文章…

数据链路层(必备知识)

文章目录1、数据链路层的作用2、认识以太网<1>以太网帧格式<2>认识MAC地址<3>认识MTU<4>查看硬件地址和MTU3、ARP协议<1>什么是ARP协议<2>ARP数据报格式<3>ARP协议的工作机制4、其他重要协议或技术<1> DNS<2>NAT技术1、…

《MySQL实战45讲》——学习笔记19 “SQL查一行执行慢的排查、锁等待/一致性读“【建议收藏】

由于SQL本身的写法问题&#xff08;如join太多表、未走索引/索引失效、一次查太多数据等&#xff09;&#xff0c;或是MySQL节点CPU占用率很高或IO利用率很高&#xff0c;都会导致一条SQL执行的比较慢&#xff1b;但是有时候&#xff0c;"只查一行数据"&#xff0c;也…

内存优化之重新认识内存

我们知道&#xff0c;手机的内存是有限的&#xff0c;如果应用内存占用过大&#xff0c;轻则引起卡顿&#xff0c;重则导致应用崩溃或被系统强制杀掉&#xff0c;更严重的情况下会影响应用的留存率。因此&#xff0c;内存优化是性能优化中非常重要的一部分。但是&#xff0c;很…

深入体会线程状态的切换

✨✨hello&#xff0c;愿意点进来的小伙伴们&#xff0c;你们好呐&#xff01; &#x1f43b;&#x1f43b;系列专栏&#xff1a;【JavaEE初阶】 &#x1f432;&#x1f432;本篇内容&#xff1a;线程状态详解 &#x1f42f;&#x1f42f;作者简介:一名现大二的三非编程小白&am…

微机-------CPU与外设之间的数据传送方式

目录 一、无条件方式二、查询方式三、中断方式四、DMA方式一、无条件方式 外设要求:简单、数据变化缓慢。 外设被认为始终处于就绪状态。始终准备好数据或者始终准备好接收数据。 IN AL,数据端口 数据端口的地址通过CPU的地址总线送到地址译码器进行译码,同时该指令进行的是…

JAVASE(复习)——异常

所有的异常都是在java.lang包中的Throwable类中 一、Exception 和 Error 的区别 exception&#xff1a;程序本身发生的异常&#xff0c;可以捕获抛出异常&#xff0c;一般用try—catch—finally捕获。 error&#xff1a;发生在jvm层面的错误&#xff0c;程序无法处理。 二…

Git 如何调整 commit 的顺序

title: Git 如何调整 commit 的顺序 date: 2022-12-02 23:11 tags: [git] 〇、问题 使用哪条命令调整commit的顺序&#xff1f; git rebase -i 一、前言 今天测试了git hooks&#xff0c;产生了大量的commit&#xff0c;而后又进行了正常的commit&#xff0c;因此在这里是想要…

java——mybatis——Mybatis注解开发——@Update——修改数据

DAO接口&#xff1a; package com.sunxl.dao;import com.sunxl.pojo.User; import org.apache.ibatis.annotations.Insert; import org.apache.ibatis.annotations.Select; import org.apache.ibatis.annotations.SelectKey; import org.apache.ibatis.annotations.Update;impo…

SpringBoot+Thymeleaf上传头像并回显【表单提交】

参考文章&#xff1a;springbootthymeleaf实现图片上传并回显https://www.wanmait.com/note/shaowei/javaee/b3717a24fde24d3e89c47765a1a63214.html 一、新建SpringBoot项目 添加 spring web和 thymeleaf 的依赖 二、在templates新建页面 在页面中添加一个表单和一个文件上传…

8086,8088CPU管脚,奇偶地址体, ready信号,reset复位信号。规则字和非规则字

8086/8088均为40条引线&#xff0c;双列直插式封装&#xff0c;某些引线有多重功能&#xff0c;其功能转换有两种情况&#xff1a;一种是分时复用&#xff0c;一种是按组态定义。 用8088微处理器构成系统时&#xff0c;有两种不同的组态&#xff1a; 最小组态&#xff1a;808…

@AutoWired与@Resource

参考 : Qualifier - 搜索结果 - 知乎 Autowired和Resource的区别是什么&#xff1f; - 知乎 面试突击78&#xff1a;Autowired 和 Resource 有什么区别&#xff1f; - 掘金 目录 同一类型多个Bean报错问题 Resource注解 Resource的查找顺序 Resource注解实现依赖注入 Reso…

网课题库接口调用方法

网课题库接口调用方法 本平台优点&#xff1a; 多题库查题、独立后台、响应速度快、全网平台可查、功能最全&#xff01; 1.想要给自己的公众号获得查题接口&#xff0c;只需要两步&#xff01; 2.题库&#xff1a; 查题校园题库&#xff1a;查题校园题库后台&#xff08;点…

QT对象树机制

Qt提供了对象树机制&#xff0c;能够自动、有效的组织和管理继承自QObject的Qt对象。 每个继承自QObject类的对象通过它的对象链表&#xff08;QObjectList&#xff09;来管理子类对象&#xff0c;当用户创建一个子对象时&#xff0c;其对象链表相应更新子类对象信息&#xff0…

Docker快速入门

容器Docker技术的演进 1.曾经部署应用&#xff0c;使用物理机部署&#xff0c;这可能会因为不同应用所依赖的版本号不同&#xff0c;不得已购买一套全新的机器&#xff0c;所以成本高、部署慢、资源浪费、难以迁移和拓展、可能会被限定硬件厂商。 2.之后引入了VMVare&#xff…

使用JPA和Hibernate查询分页

介绍 受到我最近给出的StackOverflow答案的启发&#xff0c;我决定是时候写一篇关于使用JPA和Hibernate时查询分页的文章了。 在本文中&#xff0c;您将了解如何使用查询分页来限制 JDBC大小并避免获取不必要的数据。ResultSet 如何在#Hibernate中使用查询分页来限制 JDBC 结…