【操作系统OS】学习笔记第三章 内存管理【哈工大李治军老师】

基于本人观看学习 哈工大李治军老师主讲的操作系统课程 所做的笔记,仅进行交流分享。

特此鸣谢李治军老师,操作系统的神作!

如果本篇笔记帮助到了你,还请点赞 关注 支持一下 ♡>𖥦<)!!

主页专栏有更多,如有疑问欢迎大家指正讨论,共同进步!

给大家跳段街舞感谢支持!ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ


内存管理 目录

  • 第三章 内存管理
  • 课程链接:
  • 一、内存使用与分段
    • 1.重定位
    • 进程交换
    • 2.分段
  • 二、内存分区与分页
    • 1.内存如何分区?
    • 2.分页
  • 三、多级页表与快表
    • 1.多级页表
  • 四、段页结合的实际内存管理
    • 段 面向用户,页 面向硬件
    • 段、页同时存在的重定位(地址翻译)
    • 代码实现:
  • 五、内存换入—请求调页
    • 代码实现
  • 六、内存换出
    • 1.FIFO页面置换
    • 2.MIN页面置换
    • 3.LRU页面置换
      • 代码实现:
    • 内存换入和换出总结


第三章 内存管理

更多操作系统笔记:【哈工大李治军老师】操作系统

课程链接:

b站: 【哈工大】操作系统 李治军(全32讲)

大学MOOC:大学慕课—操作系统—主讲:哈工大李治军


一、内存使用与分段

程序进入内存,main函数的40地址必须放在物理内存地址

call40要求main放在真实的物理地址:40,程序从0地址开始,让PC等于0开始取指执行

image-20230505104255246

如果另一个程序要运行,也从0地址开始,就会和上面的程序冲突

因此程序应该放在内存中空闲的单元

image-20230505104448778

此时40(逻辑地址)需要修改到1040(物理地址)处,否则内存无法使用

1.重定位

重定位:修改程序中的地址(相对地址)

image-20230505104654262

什么时候进行重定位?

编译时

编译时内存重定位是程序代码在编译为目标代码的过程中,跳转地址被绑定到一个固定的地址上。因此,生成的目标文件可以直接载入内存中执行,不需要进行额外的重定位。

编译时内存重定位适合静态编译的程序 编译时重定位的程序只能放在内存固定位置

载入时

载入时内存重定位是程序在载入内存后,操作系统会将程序的可执行代码、全局变量、动态链接库等资源加载到内存中,并进行地址的映射和调整。在编译期间无需考虑代码的实际内存布局,程序非常灵活

载入时内存重定位适合动态链接的程序,载入时重定位的程序一旦载入内存就不能动了

进程交换

当物理内存不足以满足当前所有正在运行的进程的需求时,操作系统就会将一些运行态进程暂停并将其内存交换到磁盘上,释放出一部分空间来容纳新的进程

image-20230505105529520

重定位最合适的时机:运行时重定位

无论程序放在哪里,在程序运行时,都可以根据逻辑地址40通过地址翻译算出物理地址。

image-20230505105851331

base放在PCB中,执行指令时第一步先从PCB中取出这个基地址

真实物理地址=基地址(起始地址)+偏移(逻辑地址)

进程切换时根据PCB切换一起切换这个基地址

image-20230505110722264

2.分段

程序由代码段组成:

image-20230505120450163

符合用户观点:用户可独立考虑每个段 (分治)

怎么定位具体指令(数据): <段号,段内偏移> 如mov [es:bx],ax

程序的各段分别放入内存:

image-20230505121115510

现在的PCB需要放每个段的基址

image-20230505121059867

GDT是操作系统的段表 每个进程有自己的LDT表

image-20230505121326914

二、内存分区与分页

程序分段->找空闲分区->通过映射表读写

1.内存如何分区?

固定分区 与 可变分区

image-20230505125751704

image-20230505125859303

image-20230505125921227

又一个段提出内存请求:reqSize=40K,怎么办?

目前的空闲分区:

image-20230505130010611

首先适配:选择第一个大小足够的空闲区域进行分配 (350,150)

首先适配简单快速,但会留下许多无法使用的小碎片

最佳适配:选择尺寸最小、且足够容纳当前申请内存的空闲区域进行分配 (200,50)

最佳适配可以避免产生过多的碎片,但需要搜索所有空闲区域,效率相对较低

最差适配:选择尺寸最大、且足够容纳当前申请内存的空闲区域进行分配 (350,150)

差适配可以减少碎片的数量,但占用大内存空间,浪费大量空间

image-20230505130529109

2.分页

内存分区会产生内存碎片 导致有内存使用不了

image-20230505130643040

将空闲分区合并,需要移动1个段(复制内容):内存紧缩 花费时间长

从连续到离散…

不用进行内存紧缩,内存浪费少

image-20230505130943036

页表重定位:

将所有指向旧物理地址的虚拟页面地址替换为对应的新物理页面地址,这样虚拟地址就能够正确映射到新的物理页面上

image-20230505131212638

三、多级页表与快表

分页如果过大会造成浪费,为了提高内存空间利用率,页应该小

但是页小了页表就大了

image-20230506162413853

大部分逻辑地址用不到,我们可以将他从页表中删除,只存放用到的页

image-20230506162444647

但是这种方法,会导致页表中的页号不连续

执行指令进入页表查找,额外访问内存,速度会慢

因此页表一定要连续(通过偏移直接查找),大页表占用内存,造成浪费

如何做到既连续,又要让页表占用内存少?

1.多级页表

用书的章目录和节目录来类比思考:先找章、再找节

多级页表,即页目录表(章)+页表 (节)

image-20230506163707415

2^10个目录项 * 4字节地址 =4K,总共需要16K远远小于4M

多级页表提高了空间效率,但在时间上又出现问题:每增加一级就要多访问一次内存

类比看书的书签,最近看到了哪里,使用快表来弥补:

image-20230506164434802

将最近访问的物理页放在快表中。

快表和多级页表组合在一起的结构保证了多级页表的连续,查找起来也比较快

image-20230506164736819

关键:增大快表 提高命中率

TLB有效的原因: 程序的地址访问具有局部性:

image-20230506164818849

四、段页结合的实际内存管理

将段和页结合在一起
在这里插入图片描述
段页结合的虚拟内存管理方式是将物理内存划分为大小相等的页框,并将逻辑地址划分为段和页两部分

段号用来确定逻辑地址所在的段,页号用于确定段中具体某一页。
通过段号查找符号表可以得到该段的基地址,加上页号后即可找到该页在物理内存中的对应位置,从而完成地址映射。

段 面向用户,页 面向硬件

在这里插入图片描述
虚拟内存:应用程序运行所需要的内存量大于物理内存容量,实现了内存的动态扩展与管理。虚拟内存将进程中的地址空间分为若干个虚拟页面,每个页都可以被映射到物理内存上的一个对应的物理页面

段、页同时存在的重定位(地址翻译)

从逻辑地址到虚拟地址,再从虚拟地址到物理地址

先根据段表的基址加偏移得到虚拟地址
再根据页号加偏移得到物理地址

在这里插入图片描述

代码实现:

分配段、建段表;分配页、建页表
进程带动内存使用的图谱
从进程fork中的内存分配开始…
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
经过两大项工作后,父进程和子进程都创建了自己的段表、虚拟内存、页表。一个程序就被放在了内存中:
在这里插入图片描述

五、内存换入—请求调页

为了实现虚拟内存,引出了换入换出机制

用户眼中的内存:
4GB(大且规整)的“内存”,可供用户使用,如char*p,p=3G,实际上就是用地址

用户可随意使用该“内存”,就象单独拥有4G内存

在这里插入图片描述
这个“内存”怎么映射到物理内存,用户全然不知

在这里插入图片描述
由于程序的不连续,读取哪一段数据,哪一段就换入cpu中,用完了从cpu换出

请求的时候才映射!

在这里插入图片描述
如果出现缺页,就会产生中断,进行中断处理程序

PC指针不动,映射之后在执行本条指令
在这里插入图片描述

代码实现

在这里插入图片描述
处理中断page fault:

在这里插入图片描述
do_no_page:

在这里插入图片描述
put_page:

在这里插入图片描述

六、内存换出

并不能总是获得新的页,内存是有限的

需要选择一页淘汰,换出到磁盘,选择哪一页?

在这里插入图片描述

1.FIFO页面置换

一实例:分配了3个页框(frame),页面引用序列为

A B C A B D A D B C B

当D到达,页框没有位置了,A最先换入,第一个换出
在这里插入图片描述
以此类推:

在这里插入图片描述
评价准则:缺页次数:本实例,FIFO导致7次缺页

A刚换出下一次又被换入,C用的最少,换出C最合适

2.MIN页面置换

在这里插入图片描述
理论上本算法合适,但是无法预测将来的事

3.LRU页面置换

用过去的历史预测将来 局部性

LRU算法: 选最近最长一段时间没有使用的页淘汰(最近最少使用)。

在这里插入图片描述

代码实现:

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

LRU近似实现一将时间计数变为是和否

每个页加一个引用位(reference bit)

每次访问一页时,硬件自动设置该位
选择淘汰页:扫描该位,是1时清0,并继续扫描;是0时淘汰该页

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

内存换入和换出总结

在这里插入图片描述

更多操作系统笔记:【哈工大李治军老师】操作系统笔记专栏汇总

大家的点赞、收藏、关注将是我更新的最大动力! 欢迎留言或私信建议或问题。
大家的支持和反馈对我来说意义重大,我会继续不断努力提供有价值的内容!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数字化战略,如何解读企业财务报表

01 财务数字化管理 第一&#xff0c;财务基本信息化建设。比如财务系统、财务共享中心等通过数字化的手段提升财务会计核算、财务流程管理效率&#xff0c;解决流程性管理的问题。 第二&#xff0c;利用各类商业智能 BI 分析、数据分析的手段把企业的所有行为都进行量化对比&…

vue 水印组件

效果图展示 Watermark 参数说明类型默认值版本width水印的宽度&#xff0c;content 的默认值为自身的宽度number120height水印的高度&#xff0c;content 的默认值为自身的高度number64rotate水印绘制时&#xff0c;旋转的角度&#xff0c;单位 number-22zIndex追加的水印元素…

【计算机图形学基础教程】MFC基本绘图函数2

MFC基本绘图函数 绘图工具类 CGdiObject类&#xff1a;GDI绘图工具的基类CBitmap类&#xff1a;封装了GDI画刷&#xff0c;可以选作设备上下文的当前画刷&#xff0c;用于填充图形的内部CFont类&#xff1a;封装了GDI字体&#xff0c;可以选作设备上下文的当前字体CPalette类…

selenium——unittest框架

目录 一、unittest框架基本介绍二、unittest框架解析三、unittest框架使用方法1.测试固件2.测试套件3.用例的执行顺序4.忽略测试用例中的方法5.unittest断言6.HTML报告生成 一、unittest框架基本介绍 在进行selenium IDE脚本录制导出的脚本中&#xff0c;我们发现其中多了很多…

基于 EKS Fargate 搭建微服务性能分析系统

背景 近期 Amazon Fargate 在中国区正式落地&#xff0c;因 Fargate 使用 Serverless 架构&#xff0c;更加适合对性能要求不敏感的服务使用&#xff0c;Pyroscope 是一款基于 Golang 开发的应用程序性能分析工具&#xff0c;Pyroscope 的服务端为无状态服务且性能要求不敏感&…

mysql数据迁移与同步常用解决方案总结

目录 一、前言 二、数据迁移场景 2.1 整库迁移 2.2 表数据迁移 2.3 mysql版本变更 2.4 mysql数据迁移至其他存储介质 2.5 自建数据到上云环境 2.6 mysql数据到其他国产数据库 三、数据库物理迁移实施方案 3.1 数据库物理迁移概述 3.1.1 物理迁移适用场景 3.1.2 物理…

TCP三次握手

TCP三次握手 文章目录 TCP三次握手1. TCP三次握手过程和状态变迁1. 准备工作2. 进行连接 2. 能把三次握手改为两次握手吗&#xff1f;3. 改为两次握手会出现什么后果&#xff1f;4. 改为四次握手行不行&#xff1f;5. TCP第三次握手失败了怎么办&#xff1f;6. 三次握手是否可以…

TCP四次挥手

TCP四次挥手详解 文章目录 TCP四次挥手详解1. TCP四次挥手过程和状态变迁2. 为什么挥手需要四次&#xff1f;3. 为什么中间的ACK和FIN不可以像三次握手那样合为一个报文段呢&#xff1f;4. 为什么TIME_WAIT等待的时间是2MSL&#xff1f;5. 等待2MSL的意义5.1 保证客户端最后发送…

Linux网络——Shell编程之数组

Linux网络——Shell编程之数组 一、概念二、数组的定义三、Shell数组操作1. 获取数组的所有元素的列表2. 获取数组的所有元素下标3.取数组的元素个数4. 获取数组的某个元素的值5.删除数组某个元素6.删除数组7.数组切片8.数组字符替换9.数组追加元素 四、数组在函数的传参 一、概…

天猫数据分析:2023年Q1天猫净水器品牌销售TOP10排行榜

水质的好坏更是与人们的身体健康密切相关。随着社会经济的发展&#xff0c;居民生活水平提升&#xff0c;人们对饮用水质量、安全性的要求也不断提高&#xff0c;净水器也因此逐渐成为现代生活的必需品。 根据鲸参谋电商数据显示&#xff0c;2023年Q1在天猫平台上&#xff0c;净…

3. SQL底层执行原理详解

一条SQL在MySQL中是如何执行的 1. MySQL的内部组件结构1.1 Server层1.2 Store层 2. 连接器3. 分析器4. 优化器5. 执行器6. bin-log归档 本文是按照自己的理解进行笔记总结&#xff0c;如有不正确的地方&#xff0c;还望大佬多多指点纠正&#xff0c;勿喷。 1. MySQL的内部组件结…

MVC分部视图的使用:Html.Partial/RenderPartial,Html.Action/RenderAction,RenderPage

ASP.NET MVC 里的部分视图&#xff0c;相当于 Web Form 里的 User Control。我们的页面往往会有许多重用的地方&#xff0c;可以进行封装重用。 使用部分视图有以下优点&#xff1a; 1. 可以简写代码。 2. 页面代码更加清晰、更好维护。 在视图里有多种方法可以 加载部分视图&a…

硬盘数据突然消失怎么回事?硬盘数据突然消失怎么找回

硬盘上的数据对每个人都至关重要&#xff0c;它可能是我们的珍贵回忆&#xff0c;多年学习的总结&#xff0c;或者一些不可告人的秘密。而硬盘中的数据可能会在不知情的情况下消失或被删除&#xff0c;这种情况对我们来说十分痛苦和困扰。然而&#xff0c;我们不必担心&#xf…

如何用100天彻底学会Python?

Python 是一门功能强大、易于学习且历史悠久的编程语言。如果你希望在短时间内彻底学会 Python&#xff0c;需要制定一个全面的学习计划&#xff0c;并进行刻意的练习和实践。 以下是一份建议的学习计划&#xff0c;帮助你在 100 天内掌握 Python 技能。 第 1-10 天&#xff…

JavaScript class和继承的原理

&#xff08;对于不屈不挠的人来说&#xff0c;没有失败这回事。——俾斯麦&#xff09; class 相关链接 MDN链接 有关类的详细描述 关于构造函数&#xff0c;原型和原型链的说明 类的概述 类是用于创建对象的模板。他们用代码封装数据以处理该数据。JS 中的类建立在原型上…

【Queue新技法】用双数组实现一个队列 C++

目录 1 常规的队列构建2 加入一些限制2-1形式化说明2-2 优化&#xff1a;平衡队列 附录0 双数组或双链表实现队列1 单链表与循环缓冲区实现队列3 参考资料 1 常规的队列构建 到火车站办理退票&#xff0c;排队的人构成队列。注意到有两个关键动作&#xff1a; 入队&#xff0c…

C++类和对象(上)

目录 一、类 1.1 类的引入 1.2 类的定义 1.3 类的访问限定符及封装 1.3.1 类的访问限定符 1.3.2 封装 1.4 类定义方式 1.4.1 声明和定义都放在类体里 1.4.2 类可以声明和定义分离 1.5 类的作用域 1.6 类的实例化 1.6.1 定义 1.6.2 计算类对象的大小 二、this指针…

华为OD机试真题 Java 实现【猜字谜】【2023Q2】

一、题目描述 小王设计了一人简单的清字谈游戏&#xff0c;游戏的迷面是一人错误的单词&#xff0c;比如nesw&#xff0c;玩家需要猜出谈底库中正确的单词。猜中的要求如 对于某个谜面和谜底单词&#xff0c;满足下面任一条件都表示猜中&#xff1a; 变换顺序以后一样的&…

【MySQL】索引

之前的select所采用的方式是遍历数据表进行查找,这种方式效率是比较低的,尤其是数据表汇总数据量比较大的时候,于是便有了索引,MySQL中的索引的作用就是为了快速获取数据 文章目录 1.索引简介2.索引的数据结构2.1 B-Tree2.2 Hash索引 3.索引的分类4.索引的语法5.SQL性能分析6.…

字节跳动发放年终奖,远超预期~

最近一段时间&#xff0c;国内互联网大厂接连公布年终奖情况&#xff0c;整个后厂村都洋溢在春节般的喜庆气氛里。 虽然由于各种各样的顾虑&#xff08;主要是人员流失问题&#xff09;&#xff0c;大部分公司都将年终奖发放时间调整到了年中&#xff0c;但好饭不怕晚&#xf…
最新文章