OS复习笔记ch8-虚拟存储

news2024/10/6 8:23:00

接着我们之前学的页式管理和段式管理等传统的存储管理,我们接下来讲一下虚拟存储。

概念引入

image.png
如图所示,传统的存储管理存在一次性和驻留性,浪费了大量的内存空间,使得应用的并发度很低。

问题本质就是已有的内存容量不满足应用程序对于内存的需求。
当然,升级内存是一个很好的办法,不过也不现实,毕竟应用程序的大小从几个KB到几百GB不等,你内存再大也不可能都满足,而且内存条的成本也好高。

无法向内寻求突破,这个时候就要向外看——我们把一部分的外存视为“内存”,称之为虚拟内存。
英语一般称虚拟内存Virtual Memory,而真实内存为Real memory,狭义上也就是RAM。

image.png

既然我们选定了一部分外存当做虚拟内存,那么应该把什么样的数据放到外存呢?


这个问题根据局部性原理很好解答
image.png
局部性原理(principle of locality):程序在执行过程中的一个较短时期,所执行的指令地址和指令的操作数地址,分别局限于一定区域。

  • 时间局部性:一条指令的一次执行和下次执行,一个数据的一次访问和下次访问都集中在一个较短时期内;
  • 空间局部性:当前指令和邻近的几条指令,当前访问的数据和邻近的数据都集中在一个较小区域内。

根据局部性原理,我们把最常用的,最近可能访问到的部分装入内存,其余部分有需要的时候调入内存。因此,虚拟内存就有了“多次性”,“对换性”,“虚拟性”的三个特点。

  • 多次性:无需在作业运行时一次性全部装入内存,而是允许被分成多次调入内存。
  • 对换性:无需在作业运行时一直常驻内存,而是允许在作业运行过程中,作业换入、换出。
  • 虚拟性:从适辑上扩充了内存的容量,使用户看到的内存容量,远大于实际的容量。

从哲学的角度就是“立足当下,抓住主要矛盾”。本质上以CPU时间和外存空间换取内存空间,这是操作系统中的资源转换技术。

具体实现
主要有三种方式

  • 请求分页存储管理
  • 请求分段存储管理
  • 请求段页式存储管理

请求分页存储管理

请求分页存储管理是在传统的页式管理的基础上加上了以下部分:

  1. 如果当前需要访问的页面不在内存中,需要请求OS从外存调入内存
  2. 如果内存空间不够用的时候,OS负责把暂时用不到的页面放入外存
    一句话概括,就是”请进来,送出去“。而OS中专门负责这一工作的就是缺页中断机构。

缺页中断是因为当前执行的指令想要访问的目标页面未调入内存而产生的,因此属于内中断
一条指令在执行期间,可能产生多次缺页中断。(如copy A to B,即将逻辑地址A中的数据复制到逻辑地址B,而A、B属于不同的页面,则有可能产生两次中断)

第一种情况,如果访问的页面不在内存,发生缺页中断
image.png
缺页中断实际上是内中断,每次需要将缺页的进程阻塞,然后去外存调页,调页完成后唤醒缺页进程。其中,调页还要考虑内存中有没有空闲块,如果有就分配一个,没有就需要调用页面置换算法淘汰其中一个,将调入页面装入。

而想要实现上述过程又需要一些辅助信息,比如如何知道内存中有无空闲块,需要淘汰哪个页面,淘汰的页面是否需要写回外存,如何记录和利用这些信息呢?


此时,我们就可以利用原先的页表,在其基础上加入三个字段:一个是状态位,记录当前内存块是否在内存中;访问字段可记录最近被访问过几次,或记录上次访问的时间,供置换算法选择换出页面时参考;修改位记录内存块是否修改过。

对比我们的基本分页管理,请求分页新增了三步
image.png

  1. 请求调页(查到页表项时根据状态位进行判断)
  2. 页面置换(需要调入页面,但没有空闲内存块时进行)
  3. 需要修改请求页表中新增的表项

image.png
王道课堂上还提供了一个图具体地阐述两者的流程和区别,右侧的细节部分说的很清楚了。
这里依然要强调两点:

  • 缺页中断的英文是(page fault),是一种可以恢复的中断。实际上fault中文翻译成中断/异常/故障都可以,因为学术界对概念并没有很好的统一。可以恢复是说缺页中断是可以被缺页中断机构解决,而有些中断是不可恢复的,比如除0,此时程序就会终止(abort)。
  • 请求调页和页面置换涉及到换入/换出页面,如果频繁操作系统开销会很大,本质上虚拟存储的思想是通过时间来换取空间,利用虚拟存储机制来换取更大内存容量。

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

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

相关文章

Redis使用中的性能优化——搭建Redis的监测服务

大纲 环境安装配置Redis安装 安装配置redis_exporter编译运行 安装启动Prometheus创建用户下载并解压修改配置启动 安装启动grafana安装启动 测试参考资料 抛开场景和数据,谈论性能优化,就是纸上谈兵。这个系列我们将通过相关数据来展现常见的Mysql优化前…

vue3设置全局变量并获取 全局响应式变量 窗口大小

设置 js文件统一管理全局变量 方法1 app provide() 全局提供变量 通过inject()使用 方法2 app实例配置全局变量 获取 通过 getCurrentInstance.appContext.config.globalProperties.$innerWidth访问到 code import { ref } from vue export const useGlobalState () > {c…

uni-app预览pdf(适配多端)

前言 今天有个功能要在当前页面预览pdf,并且适配多端,研究了好久,也踩了好多坑,写个文章记一下,也给各位避避坑~ uni-app预览pdf 1.下载pdf.js 官方下载地址(有坑!待会儿说) 外部…

《编译原理》期末考试复习手写笔记+真题(一)第一、二、三章

目录 第一章 第二章考试题型: 第三章考试题型【词法分析】: 不会DFA-最小化分割法的看这里!!! 学习完前三章后,期末考试的前面两道大题可以做啦(除去第四章消除左递归※)&#…

20240606在RK3588的Android12下使用adb pull出现权限问题Permission denied

adb root adb remount 20240606在RK3588的Android12下使用adb pull出现权限问题Permission denied 2024/6/6 11:48 缘起:想从Toybrick的TB-RK3588的Android12开发板上通过adb pull获取刚刚生成的edid.bin,老是报告权限问题。 百度:adb: error…

course-nlp——7-seq2seq-translation

本文参考自https://github.com/fastai/course-nlp。 使用 RNN 进行翻译 此笔记本是根据 Sylvain Gugger 创建的笔记本修改而来的。 今天我们将处理翻译任务。我们将从法语翻译成英语,为了使任务规模保持在可控的范围内,我们将仅限于翻译问题。 此任务…

[线程与网络] 网络编程与通信原理(五): 深入理解网络层IP协议与数据链路层以太网协议

🌸个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 🏵️热门专栏:🍕 Collection与数据结构 (92平均质量分)https://blog.csdn.net/2301_80050796/category_12621348.html?spm1001.2014.3001.5482 🧀Java …

1-Maven-settings配置

1-Maven-settings配置 整理下Maven工具的使用。 【本地仓库、私服、镜像仓库、远程仓库、中央仓库】 本文基于阅读其他博客和对公司Maven配置的学习整理出来的。希望通过本此学习能对Maven有个整体性的掌控。 顺序:profile.repository > pom文件中的repository &…

小程序 UI 风格,独具匠心

小程序 UI 风格,独具匠心

iOS 之homebrew ruby cocoapods 安装

cocoapods安装需要ruby,更新ruby需要rvm,下载rvm需要gpg,下载gpg需要homebrew,所以安装顺序是homebrew->gpg->rvm->ruby-cocoapods Rvm 官网: RVM: Ruby Version Manager - RVM Ruby Version Manager - Docum…

04-240606Spark笔记

04-240606Spark笔记 1.行动算子-2 save相关算子: 格式: def saveAsTextFile(path: String): Unit def saveAsObjectFile(path: String): Unit def saveAsSequenceFile(path: String,codec: Option[Class[_ <: CompressionCodec]] None): Unit 例子: val rdd sc.makeR…

Next.js Tailwind CSS UI组件

摘要&#xff1a; 官网 今天公司使用到一个前端ui框架——Next.js Tailwind CSS UI组件&#xff01;这从头构建一个AI驱动的前端UI组件生成器&#xff0c;生成Next.js Tailwind CSS UI组件&#xff1a; 1、用Next.js、ts和Tailwind CSS构建UI组件生成器Web应用程序。 2、用Copi…

【MySQL】聊聊order by 是如何排序的

CREATE TABLE t (id int(11) NOT NULL,city varchar(16) NOT NULL,name varchar(16) NOT NULL,age int(11) NOT NULL,addr varchar(128) DEFAULT NULL,PRIMARY KEY (id),KEY city (city) ) ENGINEInnoDB;构建一个表结构&#xff0c;以及数据。 本篇主要来分析下order by是如何进…

前端 JS 经典:图片裁剪上传原理

前言&#xff1a;图片裁剪一般都是用户选择头像时用到&#xff0c;现在很多插件都可以满足这个功能&#xff0c;但是我们不仅要会用插件&#xff0c;还要自己懂的裁剪原理。 1. 流程 流程分为&#xff1a;1. 预览本地图片 2. 选择裁剪区域 3. 上传裁剪图像 2. 如何预览图片 …

作业06 递推算法1

作业&#xff1a; #include <iostream> using namespace std; int main(){long long a[110];short n;cin>>n;a[0]1;a[1]1;for(int i2;i<n;i){a[i]a[i-1]a[i-2];}cout<<a[n-1];return 0; } #include <iostream> using namespace std; int main(){lon…

【机器学习】机器学习与大模型在人工智能领域的融合应用与性能优化新探索

文章目录 引言机器学习与大模型的基本概念机器学习概述监督学习无监督学习强化学习 大模型概述GPT-3BERTResNetTransformer 机器学习与大模型的融合应用自然语言处理文本生成文本分类机器翻译 图像识别自动驾驶医学影像分析 语音识别智能助手语音转文字 大模型性能优化的新探索…

41【Aseprite 作图】粉红宫灯——拆解

1 宫灯轮廓 上面三角&#xff0c;下面3 3 3 &#xff08;粉色在后面&#xff0c;做轮廓&#xff09;&#xff0c;棕色在外面&#xff0c;看做是灯骨&#xff08;竖着更长&#xff09;&#xff1b;中间是横着做灯骨 尾部的彩带&#xff0c;下面粉色更浅&#xff0c;上面绿色更浅…

Eclipse添加C和C++编译成汇编文件的选项

在miscellaneous中添加assemble listing选项就可以生成汇编文件了

12_JavaWebAjax

文章目录 Ajax1. 同步请求异步请求2. Ajax实现方式3. 日程管理第四期4. 响应JSON串4.1 响应JSON串格式的一般格式 Appendix Ajax 发送请求的一些方式 1.输入浏览器回车 2.html>head>script/link ​ img标签 3.a标签form表单标签等 用户手动控制提交产生&#xff1b…

【MyBatis】MyBatis操作数据库(二):动态SQL、#{}与${}的区别

目录 一、 动态SQL1.1 \<if>标签1.2 \<trim>标签1.3 \<where>标签1.4 \<set>标签1.5 \<foreach>标签1.6 \<include>标签 二、 #{}与${}的区别2.1 #{}是预编译sql&#xff0c;${}是即时sql2.2 SQL注入2.3 #{}性能高于${}2.4 ${}用于排序功能…