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

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



🌄1 两级页表

🏙️1.1 知识总览

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

🚂1.2.1 假设

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

🚂1.2.2 结论

🏙️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 如何进行寻址

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

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

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

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

1. 各级页表的大小不可以超过一个页面。如果分为两级页表后,各级页表还是超过一个页面,则应该采用更多的顶级页表。

TIPS:如果一个页表分为了好几页,那么不同页中可能页号有重叠,可能会照成无法区分顶级页表的后果。

例子:

业内偏移量位数实质上就是需要用几位二进制位来表示页面大小。这里4kb = 2^12,因此需要12位。每个页面包含的页表项个数位4kb/4b = 2^10个,因此一个页面最多可以包含10个二进制位。

由于页内偏移量为12位,因此页号位数为28位,而每级页表最多表示10位,因此此题需要分三级页表,分别占:8、10、10。逻辑结构如图:

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

🏙️1.6 总结

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

🎡2.1 总览

🎡2.2 分段的基本概念

🚂2.2.1 定义

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

🚂2.2.2 特点

(1)当采用分段存储时,各段可以离散的存储,但是一个特定的段占据连续的内存空间。

(2)由于是按照逻辑功能划分模块,用户的编程更加方便,程序的可读性更加高。

(3)在编译程序时,系统会将段名转换为段号。

🚂2.2.3 实例

🚂2.2.4 逻辑地址结构

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

🎡2.3 段表的基本概念

🚃2.2.1 示意图

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

🚃2.3.2 段表的特点

(1)与页表类似,由于段在逻辑上在连续存储的,所以段号实际上是不需要被保存的。

只需记录段长以及各段的长度(基址)

(2)段表项的长度是固定的。如果段的逻辑结构中段内地址为16位,系统使用16个二进

制位就可以表示最大段长;而系统的物理地址肯定也对应一个最大字节长度(假设为4GB,

对应32位);段号无须存储。因此可以让每个段表项占16+32=48位,即6个字节。

🎡2.4 地址的变换过程

1. 进程在发生切换时,其PCB会被放入段表寄存器。系统在得到逻辑地址后,将其分解为段号S、段内地址W。

2. 首先检查段号是否合法(段号是否越界)。假如S是否>=段表长度M(从段表寄存器中读取),那么段号越界,系统发生越界中断。注意此处因为段表长度至少为1,而段号从0开始,所以当S=M时也相当于越界。

3. 将段号在段表中进行匹配,并得到段长C,此时如果W>=C,那么段长越界,发生越界中断。注意当采用页表时此处无须比较,因为页表的各页表项的长度是固定的,但是段表的段长是不固定的。假如没有越界,那么就取出基址,将基址与段内地址相加得到最后的物理地址。

4. 示意图如下所示:

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

🚃2.5.1 存储逻辑的区别

🚃2.5.2 分段的优点

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

(1)信息的共享

假设计算机采用分段管理,且有这样一段代码空间

其中1号段是A、B号进程都想访问的,那么只需让各进程的段表项指向同一个段即可实现共享

而假如计算机采用分页管理,那么上述的代码空间应变为:

页面不是按照逻辑模块划分的,此时就很难实现信息的共享

(2)信息的保护

与信息共享类似,假如进程A不允许某个进程访问某个空间,只需将这段置标记为不可访问即可。而分页管理就很难实现

🚃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 地址转换过程

首先,进程被调度时,其PCB中的段表起始地址F与段表长度M都会被复制放入操作系统的段表寄存器中;

接着读出逻辑地址中的段号S,并与段表长度进行比较,假如S>=M,(这里的=与前面的段式管理类似)说明越界,产生越界中断。

段号合法后,操作系统根据段表起始地址F查询到该进程对应的段表,根据段号查询到对应的段表项,

操作系统从逻辑地址读出页号P,并于段表项中的页表长度L进行对比,假如P>L,说明页号越界,产生越界中断。

页号合法后,操作系统从段表项中读出页表起始地址,根据页号查询页表得到内存块号,并结合逻辑地址中的业内偏移量得到最终的物理地址并访问。

具体过程示意图如下:

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

🎢3.7 总结

🕮 4 总结

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

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

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

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

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

相关文章
|
8天前
|
存储 Linux 调度
深入理解操作系统:从进程管理到内存分配
【8月更文挑战第44天】本文将带你深入操作系统的核心,探索其背后的原理和机制。我们将从进程管理开始,理解如何创建、调度和管理进程。然后,我们将探讨内存分配,了解操作系统如何管理计算机的内存资源。最后,我们将通过一些代码示例,展示这些概念是如何在实际操作系统中实现的。无论你是初学者还是有经验的开发者,这篇文章都将为你提供新的视角和深入的理解。
|
29天前
|
安全 索引
操作系统中的内存管理策略
【8月更文挑战第23天】
53 1
|
1月前
|
算法 安全 UED
探索操作系统的内核空间:虚拟内存管理
【7月更文挑战第50天】 在现代操作系统中,虚拟内存管理是核心功能之一,它允许操作系统高效地使用物理内存,并为应用程序提供独立的地址空间。本文将深入探讨操作系统虚拟内存管理的机制,包括分页、分段以及内存交换等关键技术,并分析它们如何共同作用以实现内存的有效管理和保护。通过理解这些原理,读者可以更好地把握操作系统的内部工作原理及其对应用程序性能的影响。
|
1月前
|
存储 算法 安全
深入剖析操作系统的内存管理机制
在数字世界的构建中,操作系统扮演着至关重要的角色。本文将探讨操作系统中的内存管理机制,揭示其背后的技术原理和设计哲学。从内存分配策略到虚拟内存的实现,再到内存保护和回收机制,我们将一探究竟,解析操作系统如何高效、安全地管理宝贵的内存资源。
|
21天前
|
开发者
探索操作系统核心:一个简单的内存管理模拟
【8月更文挑战第31天】在数字世界的构建中,操作系统扮演着基石的角色。它不仅仅是软件与硬件之间的桥梁,更是维持计算机系统有序运行的心脏。本文将带您一探操作系统的核心奥秘——内存管理,通过一个简化的模型和代码示例,揭示内存分配、回收及优化的内在机制。无论您是编程新手还是资深开发者,这篇文章都将为您打开一扇理解计算机深层工作原理的大门。
|
21天前
|
Linux 调度 C语言
深入理解操作系统:从进程管理到内存分配
【8月更文挑战第31天】在数字世界的每一次点击和滑动背后,都隐藏着一个复杂而精妙的世界——操作系统。它如同一座无形的桥梁,连接着人类与机器的沟通。本文将带你一探究竟,从进程的生命周期到内存的精细管理,我们将一起解码操作系统的核心机制。通过直观的代码示例,你将看到理论与实践的结合如何让冷冰冰的机器生动起来。准备好了吗?让我们开始这段探索之旅,揭开操作系统神秘的面纱。
|
23天前
|
存储 算法 调度
深入理解操作系统:从进程管理到内存优化
【8月更文挑战第29天】在数字世界的心脏跳动着的,是无数行代码构成的操作系统。本文将带领读者穿梭于操作系统的两大核心领域——进程管理和内存优化,揭示它们如何协同工作以确保计算机系统的高效运行。通过实际代码示例,我们将探索进程的生命周期、调度策略以及内存分配和回收机制。加入我们,一起解锁操作系统的秘密,理解其背后的逻辑与哲学。
|
1月前
|
算法 程序员
理解操作系统内存管理:页面置换算法全解析
大家好,我是小米,热爱分享技术的大哥哥!今天聊的是操作系统中的页面置换算法。它解决的是内存满载时,如何选择合适的页面移出以腾出空间的问题。主要有三种算法:FIFO(先进先出),简单但性能不佳;LRU(最近最久未使用),考虑时间局部性,性能较好但实现较复杂;OPT(最佳置换),理论上最优但无法实际应用。这些算法各有千秋,在实际应用中需根据场景选择最合适的方案。希望这能帮大家更好地理解内存管理的核心机制!
72 2
|
1月前
|
分布式计算 算法 内存技术
深入理解操作系统的内存管理机制
【7月更文挑战第32天】 在现代计算机系统中,操作系统扮演着至关重要的角色,它负责协调和管理整个系统的资源。其中,内存管理作为操作系统的核心功能之一,其效率和稳定性直接影响到系统的整体性能。本文旨在探讨操作系统中内存管理的基本原理、关键技术以及面临的挑战,为读者提供一个全面了解内存管理机制的视角。通过分析不同的内存分配策略、分页与分段机制以及虚拟内存技术,我们揭示了操作系统如何优化内存使用,保证多任务环境下的数据完整性和安全性。
|
2月前
|
Cloud Native Devops 数据库
云原生架构:未来软件开发的引擎深入理解操作系统的虚拟内存管理
【7月更文挑战第30天】在这篇文章中,我们将深入探讨云原生架构的概念,以及它如何改变软件开发的世界。我们将从云原生的基本概念开始,然后深入到它的关键技术和实践,最后讨论它对软件开发的未来影响。无论你是软件开发者,还是IT专业人士,这篇文章都将为你提供深入理解和掌握云原生架构的重要信息。 【7月更文挑战第30天】在数字世界的构建中,虚拟内存是操作系统不可或缺的一环。本文将探索虚拟内存的核心概念、工作机制及其对现代计算环境的重要性,同时揭示其背后的技术细节和面临的挑战。
27 3