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

news2024/11/15 11:02:30

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

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

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

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

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


内存管理 目录

  • 第三章 内存管理
  • 课程链接:
  • 一、内存使用与分段
    • 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.coloradmin.cn/o/498452.html

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

相关文章

《机器学习算法竞赛实战》-chapter6模型融合

模型融合 模型融合常常是竞赛取得胜利的关键&#xff01; 具有差异性的模型融合往往能给结果带来很大的提升。虽然并不是每次使用模型融合都能起到很大的作用&#xff0c;但是就平常的竞赛经验而言&#xff0c;尤其是在最终成绩相差不大的情况下&#xff0c;模型融合的方法往往…

法规标准-GB/T 39265标准解读(2020版)

GB/T 39265是做什么的&#xff1f; GB/T 39265全名为道路车辆 盲区检测系统性能要求及试验方法&#xff0c;其中主要是对BSD系统的性能要求及测试步骤进行了介绍。本文仅解读M1、N1类车辆相关内容。 一般要求 系统开启与关闭 1.BSD系统应具备手动开启和关闭的功能 2.手动关…

巧用 exports 和 typeVersions 提升 npm 包用户使用体验

默认导出 对于开发一个 JavaScript 三方库供外部使用而言&#xff0c;package.json是其中不可缺少的一部分 一般而言&#xff0c;对于库开发者来说&#xff0c;我们会在package.json中指定我们的导出入口。一般而言会涉及两个字段main和export&#xff0c;它们会涉及到当前模…

开关电源基础03:正激和反激开关电源拓扑(2)-半桥和全桥拓扑

说在开头&#xff1a;关于薛定谔的波动方程&#xff08;3&#xff09; 波动方程在矩阵派的内部也大受欢迎&#xff0c;首先是海森堡的老师索末菲&#xff0c;然后是建立矩阵力学的核心人物之一的另一位老师&#xff1a;马克思.玻恩。玻恩在薛定谔方程刚出来时就赞扬了他的成就…

宕机了?!DolphinScheduler 高可用和 Failover 机制关键时刻保命

点击蓝字 关注我们 高可用性是 Apache DolphinScheduler 的特性之一。它通过冗余来避免单点问题&#xff0c;所有组件天然支持横向扩容&#xff1b;但仅仅保证了冗余还不够&#xff0c;当系统中有节点宕机时&#xff0c;还需要有故障转移机制能够自动将宕机节点正在处理的工作转…

【react 全家桶】高级指引(上)

本人大二学生一枚&#xff0c;热爱前端&#xff0c;欢迎来交流学习哦&#xff0c;一起来学习吧。 <专栏推荐> &#x1f525;&#xff1a;js专栏 &#x1f525;&#xff1a;vue专栏 &#x1f525;&#xff1a;react专栏 文章目录 12 【react高级指引&#xff08;上&…

I.MX6Q-SDB开发板移植ubuntu

I.MX6Q-SDB开发板移植ubuntu 0.前言一、准备工作二、ubuntu移植1.下载ubuntu发布的根文件系统2.根文件系统的简单修改3.板卡适配设置4.打包根文件系统 三、烧写镜像1.dd命令2.uuu工具3.mfgtool工具4.i.mx6q-sdb的拨码设置&#xff1a; 四、大无语事件 0.前言 这两天收拾杂货堆&…

密码学【java】初探究加密方式之数字签名

文章目录 前言1 数字签名简介2 基本原理3 数字证书4 网页加密5 edge的网站连接图标6 代码实现7 keytool工具使用7.1 常用命令&#xff1a;7.2 生成私钥公钥[未实践成功]7.3 导出公钥 前言 有关keytool的使用部分&#xff0c;未实现&#xff0c;先记录下来&#xff01;&#xf…

『python爬虫』12. 模拟登陆之cookie的使用(保姆级图文)

目录 session1. 模拟登陆取得cookie2. 在登录的情况下继续取得书架上的数据3. 在已经有cookie的情况下直接请求总结 欢迎关注 『python爬虫』 专栏&#xff0c;持续更新中 欢迎关注 『python爬虫』 专栏&#xff0c;持续更新中 session session和我们之前用的request十分相似&…

AWS Lambda - 同步/异步调用,事件源,目标

Hello大家好&#xff0c;我们今天继续讨论AWS Lambda的内容。 同步调用 Lambda函数有三种调用方式。 第一种方式是同步调用。 当我们使用API、CLI以及API网关等调用函数时&#xff0c;就是同步调用。 当您同步调用函数时&#xff0c;Lambda会运行该函数并等待响应&#xff…

微服务---Redis入门篇-Redis的常见命令和客户端使用

Redis快速入门 Redis的常见命令和客户端使用 1.初识Redis Redis是一种键值型的NoSql数据库&#xff0c;这里有两个关键字&#xff1a; 键值型 NoSql 其中键值型&#xff0c;是指Redis中存储的数据都是以key、value对的形式存储&#xff0c;而value的形式多种多样&#xf…

易视腾iS-E5-NGH_3798MV100_MT7601_卡刷固件包_当贝纯净桌面

易视腾iS-E5-NGH_3798MV100_MT7601_卡刷固件包_当贝纯净桌面 特点&#xff1a; 1、适用于对应型号的电视盒子刷机&#xff1b; 2、开放原厂固件屏蔽的市场安装和u盘安装apk&#xff1b; 3、修改dns&#xff0c;三网通用&#xff1b; 4、大量精简内置的没用的软件&#xff0…

单链表OJ题:LeetCode--206.反转链表

朋友们、伙计们&#xff0c;我们又见面了&#xff0c;今天给大家带来的是LeetCode中206题&#xff1a;反转链表 数 据 结 构&#xff1a;数据结构专栏 作 者&#xff1a;stackY、 C 语 言 &#xff1a;C语言专栏 LeetCode &#xff1a;LeetCode刷题训练营 LeetCod…

TiDB实战篇-数据库热点问题

形成热点的原因 主要是因为数据插入进去的时候是按顺序加数据的。 数据分裂以后还是在一个store上面&#xff0c;就会形成读写热点。 没有走索引全表扫描的情况。 定位热点 如果有热点&#xff0c;那么它的查询语句应该是比较多的&#xff0c;容易在这个地方找到对应的热点问…

Leetcode434. 字符串中的单词数

Every day a leetcode 题目来源&#xff1a;434. 字符串中的单词数 解法1&#xff1a;istringstream 我们知道&#xff0c;C默认通过空格&#xff08;或回车&#xff09;来分割字符串输入&#xff0c;即区分不同的字符串输入。 istringstream类用于执行C风格的串流的输入操…

Flowable入门

Flowable初体验 Flowable是什么 Flowable 是一个使用 Java 编写的轻量级业务流程引擎&#xff0c;常用于需要人工审批相关的业务&#xff0c;比如请假、报销、采购等业务。 为什么要使用工作流呢&#xff1f; 对于复杂的业务流程&#xff0c;通过数据库的状态字段难以控制和…

软考信管高级——质量管理

质量管理内容 质量保证QA(过程符合要求/过程改进&#xff09; (1)按项目计划开展质量活动&#xff0c;使项目过程和产品符合质量要求&#xff0c;即按计划做质量&#xff1b; (2)提高项目干系人对项目将要满足质量要求的信心&#xff1b; (3)按过程改进计划进行过程改进&…

金兰组织 | 2023金兰解决方案集经营管理篇正式发布

为助力企业创新管理、提质增效&#xff0c;人大金仓携手金兰组织成员单位&#xff0c;于近期发布多项经营管理领域的联合解决方案&#xff0c;共享创新应用成果。 /人大金仓高级副总裁宋瑞/ 人大金仓高级副总裁宋瑞在致辞中表示&#xff1a;“联合解决方案创新是指通过把不同领…

利用谷歌云Pub/Sub 实现多任务并行分发处理方案

背景 目前老梁团队负责的Global Data Integration Platform每天有大量文件需要从来自不同地区的上游下载文件并进行处理后再发送到不同下游。老梁的数据集成平台集群有6个服务器节点&#xff0c;老梁希望所有机器的资源都能利用上&#xff0c;提升大量文件并行处理能力&#x…

C# Microsoft.ClearScript.V8脚本使用

1、ClearScript支持的功能和适用场景 微软的.net是非常强大和灵活的&#xff0c;除了C#体系脚本扩展&#xff0c;也支持其他流行的脚本扩展&#xff0c;Microsoft.ClearScript.V8就是一个.NET绑定到Google V8的脚本引擎。它允许.NET应用程序直接从JavaScript代码中调用函数&am…