操作系统基础:内存管理概述【下】

在这里插入图片描述

在这里插入图片描述

🌈个人主页:godspeed_lucip
🔥 系列专栏:OS从基础到进阶


  • 🌄1 两级页表
    • 🏙️1.1 知识总览
    • 🏙️1.2 单极页表存在的问题
      • 🚂1.2.1 假设
      • 🚂1.2.2 结论
    • 🏙️1.3 对第一个问题的解决
      • 🚂1.3.1 思路
      • 🚂1.3.2 原理
      • 🚂1.3.3 逻辑结构的改变
      • 🚂1.3.4 如何进行寻址
    • 🏙️1.4 对第二个问题的解决
    • 🏙️1.5 其他需要注意的细节
    • 🏙️1.6 总结
  • 🌄2 基本分段存储管理方法
    • 🎡2.1 总览
    • 🎡2.2 分段的基本概念
      • 🚂2.2.1 定义
      • 🚂2.2.2 特点
      • 🚂2.2.3 实例
      • 🚂2.2.4 逻辑地址结构
    • 🎡2.3 段表的基本概念
      • 🚃2.2.1 示意图
      • 🚃2.3.2 段表的特点
    • 🎡2.4 地址的变换过程
    • 🎡2.5 分段、分页管理的区别
      • 🚃2.5.1 存储逻辑的区别
      • 🚃2.5.2 分段的优点
      • 🚃2.5.3 访问一个逻辑单元的访存次数
    • 🎡2.6 总结
  • 🌄3 段页式管理方法
    • 🎢3.1 总览
    • 🎢3.2 分段、分页的优缺点
    • 🎢3.3 段页式管理的基本概念
    • 🎢3.4 段页式管理的逻辑地址结构
      • 🚉3.4.1 结构划分
      • 🚉3.4.2 解释
      • 🚉3.4.3 注意
    • 🎢3.5 段页式管理中的段表和页表
      • 🚃3.5.1 段表
      • 🚃3.5.2 页表
      • 🚃3.5.3 总结
      • 🚃3.5.4 示意图
    • 🎢3.6 地址转换过程
    • 🎢3.7 总结
  • 🕮 4 总结


🌄1 两级页表

🏙️1.1 知识总览

image1

🏙️1.2 单极页表存在的问题

🚂1.2.1 假设

image2
页面大小为4KB,即212的字节,因此需要12个二进制位来存储,该计算机就支持32位,因此有20个二进制位表示页号,即可以表示220个页面,每个页面在页表中都必须对应一个页表项,因此页表中的页表项最多可以有220个,所以一个页表需要的最大空间为220*4 = 222B,而为了存储页表必须需要(222)/(2^12) = 2^10个连续的页框(页表必须连续存放)。
image3

🚂1.2.2 结论

image4

🏙️1.3 对第一个问题的解决

🚂1.3.1 思路

为了解决单极页表存在的几个问题,可以考虑将页表也进行分页并离散存储(单击页表中是将进程的页面离散存储)。

🚂1.3.2 原理

对于给定的计算机配置信息(按字节寻址,支持32位,页面大小为4kb,页表项长度为4b),一个进程最多有220个页面,而每个页框可以存储的页表项个数为4kb/4b=210 = 1024个页表项。由此,可以将页表的2^20拆分成1024组,每组有1024个页表项,用一个二级页表存储单级页表,

🚂1.3.3 逻辑结构的改变

32位二进制位中,前10位用来表示二级页表,后10位用来表示每个二级页表包含的单极页表,最后12位表示页面偏移量。

🚂1.3.4 如何进行寻址

简单来说就是逐个寻找,先找一级地址,再在一级地址内找二级地址,最后根据页面偏移量找到对应的物理地址
image5

🏙️1.4 对第二个问题的解决

image6
当需要的页面不在内存中时会发生缺页中断(这是一个内中断),接着将目标页面从外存调入内存。

🏙️1.5 其他需要注意的细节

1. 各级页表的大小不可以超过一个页面。如果分为两级页表后,各级页表还是超过一个页面,则应该采用更多的顶级页表。
TIPS:如果一个页表分为了好几页,那么不同页中可能页号有重叠,可能会照成无法区分顶级页表的后果。

例子:
image7
业内偏移量位数实质上就是需要用几位二进制位来表示页面大小。这里4kb = 2^12,因此需要12位。每个页面包含的页表项个数位4kb/4b = 2^10个,因此一个页面最多可以包含10个二进制位。
由于页内偏移量为12位,因此页号位数为28位,而每级页表最多表示10位,因此此题需要分三级页表,分别占:8、10、10。逻辑结构如图:
image8

2. 假如没有快表结构,那么N级页表访问一个逻辑地址需要经历N+1次访存,其中,依次访问各级页需要N次,最后得到了逻辑地址对应的物理地址后还需1次访存。

🏙️1.6 总结

image9

🌄2 基本分段存储管理方法

🎡2.1 总览

image1

🎡2.2 分段的基本概念

🚂2.2.1 定义

image2
类比于程序,其中的main函数是一段,而定义在main函数之外的其他函数也是一段。

🚂2.2.2 特点

(1)当采用分段存储时,各段可以离散的存储,但是一个特定的段占据连续的内存空间。
(2)由于是按照逻辑功能划分模块,用户的编程更加方便,程序的可读性更加高。
(3)在编译程序时,系统会将段名转换为段号。

🚂2.2.3 实例

image3

🚂2.2.4 逻辑地址结构

image4
实例:对于编译后的机器汇编语言:
image5

🎡2.3 段表的基本概念

🚃2.2.1 示意图

image6
段表的作用类似于页表,记录各段的物理存储位置

🚃2.3.2 段表的特点

(1)与页表类似,由于段在逻辑上在连续存储的,所以段号实际上是不需要被保存的。
只需记录段长以及各段的长度(基址)
image7

(2)段表项的长度是固定的。如果段的逻辑结构中段内地址为16位,系统使用16个二进
制位就可以表示最大段长;而系统的物理地址肯定也对应一个最大字节长度(假设为4GB,
对应32位);段号无须存储。因此可以让每个段表项占16+32=48位,即6个字节。
image8

🎡2.4 地址的变换过程

1. 进程在发生切换时,其PCB会被放入段表寄存器。系统在得到逻辑地址后,将其分解为段号S、段内地址W。
2. 首先检查段号是否合法(段号是否越界)。假如S是否>=段表长度M(从段表寄存器中读取),那么段号越界,系统发生越界中断。注意此处因为段表长度至少为1,而段号从0开始,所以当S=M时也相当于越界。
3. 将段号在段表中进行匹配,并得到段长C,此时如果W>=C,那么段长越界,发生越界中断。注意当采用页表时此处无须比较,因为页表的各页表项的长度是固定的,但是段表的段长是不固定的。假如没有越界,那么就取出基址,将基址与段内地址相加得到最后的物理地址。
4. 示意图如下所示:
image9

🎡2.5 分段、分页管理的区别

🚃2.5.1 存储逻辑的区别

image10

🚃2.5.2 分段的优点

分段比分页更容易实现信息的共享和保护

(1)信息的共享
假设计算机采用分段管理,且有这样一段代码空间
image11
其中1号段是A、B号进程都想访问的,那么只需让各进程的段表项指向同一个段即可实现共享
而假如计算机采用分页管理,那么上述的代码空间应变为:
image12
页面不是按照逻辑模块划分的,此时就很难实现信息的共享
(2)信息的保护
与信息共享类似,假如进程A不允许某个进程访问某个空间,只需将这段置标记为不可访问即可。而分页管理就很难实现

🚃2.5.3 访问一个逻辑单元的访存次数

image13

🎡2.6 总结

image14
image15

🌄3 段页式管理方法

🎢3.1 总览

image1

🎢3.2 分段、分页的优缺点

image2
image3

🎢3.3 段页式管理的基本概念

image4
比如说:
image5

🎢3.4 段页式管理的逻辑地址结构

🚉3.4.1 结构划分

image6

🚉3.4.2 解释

image7

🚉3.4.3 注意

image8

🎢3.5 段页式管理中的段表和页表

🚃3.5.1 段表

基本结构:
image9
由于各段被分为几页是不确定的,因此需要记录页表的长度,同时为了确定物理地址,还需要存放页表的起始地址(页表存放块号)。每一个段需要对应一个页表。
从图中可以看出,每个段表项的长度是相同的(只需记录页表长度即起始块号),因此段号是可以隐藏的。

🚃3.5.2 页表

基本结构
image10
页面的大小都是相同的,因此页号是隐藏的。只需记录各页号对应的内存块号即可。
image11

🚃3.5.3 总结

一个进程会被划分为多个段,所有的段构成一段表。而每一个段会被划分为多个页面,因此一个段对应一个页表。
总结:一个进程对应一个段表,但对应多个页表。

🚃3.5.4 示意图

image12

🎢3.6 地址转换过程

首先,进程被调度时,其PCB中的段表起始地址F与段表长度M都会被复制放入操作系统的段表寄存器中;
接着读出逻辑地址中的段号S,并与段表长度进行比较,假如S>=M,(这里的=与前面的段式管理类似)说明越界,产生越界中断。
段号合法后,操作系统根据段表起始地址F查询到该进程对应的段表,根据段号查询到对应的段表项,
操作系统从逻辑地址读出页号P,并于段表项中的页表长度L进行对比,假如P>L,说明页号越界,产生越界中断。
页号合法后,操作系统从段表项中读出页表起始地址,根据页号查询页表得到内存块号,并结合逻辑地址中的业内偏移量得到最终的物理地址并访问。
具体过程示意图如下:

image13

访存过程中,操作系统共需要访问三次内存。第一次是查询段表,第二次是查询页表,第三次是访问目标地址。我们也可以引入快表,以段号和页号作为关键字。

🎢3.7 总结

image14

🕮 4 总结

操作系统,如默默守护的守夜者,无声地管理硬件与软件的交流,为计算机创造和谐秩序。

它是无形的引导者,让复杂的任务变得井然有序,为用户提供无忧体验。

操作系统的巧妙设计,让计算机变得更加智能高效,让人与科技之间的交流更加顺畅。

在每一次启动中,它如信任的伙伴,带领我们进入数字世界的奇妙旅程。

渴望挑战操作系统的学习路径和掌握进阶技术?不妨点击下方链接,一同探讨更多操作系统的奇迹吧。我们推出了引领趋势的💻OS专栏:《OS从基础到进阶》 ,旨在深度探索OS的实际应用和创新。🌐🔍

在这里插入图片描述

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[office] excel计算客户名单的人数 COUNTA 函数:“销售额”不仅是金额的总和 #知识分享#职场发展#知识分享

excel计算客户名单的人数 COUNTA 函数:“销售额”不仅是金额的总和 前文中介绍的 SUM 函数,是在日常工作中使用频率最高的函数之一。但是,在实际操作时也会出现问题。比如在计算销售额总和时,SUM 函数得出的结果为金额总和。但是…

大模型ReAct智能体开发实战

哆啦A梦是很多人都熟悉的角色,包括我自己。 在成长过程中,我常常对他口袋里的许多小玩意感到惊讶,而且他知道何时使用它们。 随着大型语言模型 (LLM) 的发展趋势,你也可以构建一个具有相同行为方式的模型! 我们将构建…

【zip密码】zip压缩包的打开密码忘了,怎么办?

Zip压缩包设置了密码,解压的时候就需要输入正确对密码才能顺利解压出文件,正常当我们解压文件或者删除密码的时候,虽然方法多,但是都需要输入正确的密码才能完成。忘记密码就无法进行操作。 那么,忘记了zip压缩包的密…

Python爬虫的基本原理

我们可以把互联网比作一张大网,而爬虫(即网络爬虫)便是在网上爬行的蜘蛛。把网的节点比作一个个网页,爬虫爬到这就相当于访问了该页面,获取了其信息。可以把节点间的连线比作网页与网页之间的链接关系,这样…

【三】【C++】类与对象(二)

类的六个默认成员函数 在C中,有六个默认成员函数,它们是编译器在需要的情况下自动生成的成员函数,如果你不显式地定义它们,编译器会自动提供默认实现。这些默认成员函数包括: 默认构造函数 (Default Constructor)&…

安全通信设置:使用 OpenSSL 为 Logstash 和 Filebeat 提供 SSL 证书

在为 Elasticsearch 采集数据时,我们经常使用到 Filebeat 及 Logstash。在我们之前的很多教程中,我们通常不为 Filebeat 和 Logstash 之前的通信做安全配置。 如何为 Filebeat 及 Logstash 直接建立安全的链接?这个在很多的情况下是非常有用的…

cnpm : 无法加载文件 C:\Users\xxx\AppData\Roaming\npm\cnpm.ps1

cnpm命令被禁止使用 我已经安装cnpm ,但是使用不了,重新安装也没用。 报错如下图: cnpm无法使用报错 解决问题 1、打开系统Windows PowerShell,使用管理员身份运行。 打开Windows PowerShell 2、输入set-ExecutionPolicy RemoteSigned&a…

python打造光斑处理系统6:高斯拟合

文章目录 构建拟合函数数据获取打印信息 光斑处理:python处理高斯光束的图像 光斑处理系统: 程序框架🌟打开图像🌟参数对话框/伪彩映射🌟裁切ROI光强分布 构建拟合函数 scipy中提供了非线性最小二乘回归算法&#x…

颐和园龙纹珍宝展亮相,文物预防保护科技护航

在皇家园林颐和园的深处,一场独特的文化盛宴正静静上演。2月1日,“祥龙贺岁—颐和园藏龙纹题材文物特展”在德和园华丽揭幕。此次特展汇聚了66件珍贵文物,包括玉器、瓷器、书画、珐琅、家具等,每一件都是颐和园园藏的瑰宝。这些文…

Javascript | JS如何断点测试(WebStorm)

JavaScript的断点与之前所学到的Java和python在jetbrain系列编辑器中的断点debug不太一样,往常我们在编写python的时候用pycharm的时候是直接断点进入debug的,就像下面这样 只要直接在代码中断点,然后运行debug功能即可 但是在WebStorm中不是…

Linux 多线程 | 线程的互斥

在前面的文章中我们讲述了多线程的一些基本的概念以及相关的操作,那么在本章中我们就将继续讲述与多线程相关的同步与互斥之间的问题。 首先我们使用一个例子引出我们的问题,又一个全局的变量g_val 100,这个变量是被所有的执行流所共享的&a…

通过 ChatGPT 的 Function Call 查询数据库

用 Function Calling 的方式实现手机流量包智能客服的例子。 def get_sql_completion(messages, model"gpt-3.5-turbo"):response client.chat.completions.create(modelmodel,messagesmessages,temperature0,tools[{ # 摘自 OpenAI 官方示例 https://github.com/…