【操作系统】第四章:非连续内存分配(Part1:基于分页-分段的物理/逻辑地址转换)

本文涉及的产品
公网NAT网关,每月750个小时 15CU
简介: 【操作系统】第四章:非连续内存分配(Part1:基于分页-分段的物理/逻辑地址转换)

目录


  • 非连续内存的管理方式
  • 分段机制
  • 分页机制
  • 页帧Frame
  • 页Page


正文


非连续内存的管理方式


引言:连续内存分配的缺点:

1.分配给一个程序的物理地址是连续的

2.内存利用率低

3.有内碎片、外碎片问题

且不论何种适配方式,都不能完全杜绝碎片问题

引入非连续内存分配方法

0dabc39418f7ef2293426d225f18ce0c_watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0NoYWhvdA==,size_16,color_FFFFFF,t_70.png

非连续内存分配方法:解决碎片问题,同时令运行的程序能够有效地隔离和内存资源管理,还可以支持共享数据和代码,类似共享库。

潜在问题:管理开销本身

如何建立虚拟地址和物理地址之间的转化(软件方案/硬件方案)

软件方案:开销非常大

硬件方案:开销相对小,这里主要介绍分段分页机制


分段机制


784399c37c619b19401f119aa872f63e_watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0NoYWhvdA==,size_16,color_FFFFFF,t_70.png

不同段之间有不同的属性,我们需要一个方法有效隔离这些不同的断的话,则有助于我们更好地去管理地址空间。

15c3461280a46ff18398a4eba6ad4991_watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0NoYWhvdA==,size_16,color_FFFFFF,t_70.png

从应用程序的编写和运行来说, 他虚拟的逻辑地址空间是一个连续的地址空间。但是虽连续,通过分段后也可以有效的隔离开来。如图所示,可以把不同的数据、库、代码段等相应的分离出来。放在某一个特定的地址用一个特定的管理权限管理起来。分离出来后,可以相互共享或访问;也可以令一些数据相对隔离,部分只读部分读写。有效地进行管理分配,有效地实现保护机制。

左边是连续的虚拟地址,右边是不连续的物理地址,那么中间就需要一个映射机制来确定相互间的联系。

645a6d8456eb1ccc5c869c4b74945380_watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0NoYWhvdA==,size_16,color_FFFFFF,t_70.png

我们把执行程序运行的逻辑地址空间看作一个连续的一维线性数组,通过映射关系,将不同的内存块(数据、代码、堆、栈等)分别映射到不同的内存的段中。映射之后,他们大小不同,位置不同。这之间的关系就是通过段管理机制实现的。这种机制也可以用软件实现,但是开销会非常大,所以我们尽可能想要用硬件支持。

这里就需要怎么通过硬件机制来支持分段的寻址。

5242e88341e9cce81f92cddbc46ccd4e_watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0NoYWhvdA==,size_16,color_FFFFFF,t_70.png

d9d2fdd62172706bd1352f29910f950a_watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0NoYWhvdA==,size_16,color_FFFFFF,t_70.png

一个一维的逻辑地址其实是不同的段组成的,这个段可以不连续。那么首先,一维地址分成两块,一块是段的寻址和段内的偏移寻址。s和addr放在一起,就形成了以段机制来管理的寻址方式。如果段号s和addr是分开的,那么是段寄存器+地址寄存器实现方式,x86是典例。另一种是把段和段内偏移合在一起形成一个完整地址,没有段寄存器来把段的编号单独管理起来,这是单一地址管理方式。

9d8da45adeabda8d611dc291a9cd2ba8_watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0NoYWhvdA==,size_16,color_FFFFFF,t_70.png

从一维线性逻辑地址空间映射到不同的物理空间去,而这个物理空间是由不同的段组成的。

详细过程:

程序通过CPU执行某条指令。CPU就需要去寻址(找数据、代码在什么地方),那么OS会把这个逻辑地址分成两块(段号/段内偏移),通过段号希望找到所在物理内存的起始地址;段表会存着逻辑地址和物理地址之间的映射关系,又因为每一个段的大小不同,所以段表也会存这些信息,也就说段表会放段的起始地址和段的长度限制这两种信息。段表的索引就是段号,段号决定了在段表中的每一项的位置。有了这些信息,CPU就会通过段表找到对应的段在物理内存中的起始地址。然后CPU会去做一个比对,大小是否满足限制,满足则合法,否则将因非法访问异常,OS将处理。

寻址之前,段表就由OS建立了。

收费员公司法.gif


分页机制


分页和分段类似,也有页号,页内偏移;区别在于,段的尺寸是可变的,而页的大小是固定不变的。

划分物理内存至固定大小的帧,大小是2的幂。逻辑的页和物理的页都是一样的,物理的页帧是8K那么逻辑的页帧也是8K。Frame(帧)代表的是物理页,Page(页)代表的是逻辑页。OS需要建立的是逻辑页地址和物理页地址的映射关系。其中用到的有快表(TLB)和内存管理单元(MMU)。


页帧Frame


2b1c4d545698b5324e098f9ebcabefbe_watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0NoYWhvdA==,size_16,color_FFFFFF,t_70.png

image.png

例题:

5640a8ac96e39062e7f007c7aa648a2b_watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0NoYWhvdA==,size_16,color_FFFFFF,t_70.png


页Page


一个程序的逻辑空间被划分为大小相等的页。区别于页帧Frame,页号和帧号可能不同,但是页内偏移和帧内偏移是相等的。

935878c24ef80fe3b026ded4f0b5cf4b_watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0NoYWhvdA==,size_16,color_FFFFFF,t_70.png

image.png

b98c07473cbfd195203c69fbe4b8e9bf_watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0NoYWhvdA==,size_16,color_FFFFFF,t_70.png

dd830f405f9a3e5f4cbba02296171635_watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0NoYWhvdA==,size_16,color_FFFFFF,t_70.png


程序运行,CPU(因执行指令或者访问数据)寻址,地址是一个逻辑地址,这个地址分为了p和o,然后将页号p作为索引index去查页表,页表存的是以页号为索引的对应项的帧号(frame number)。这个过程还需要页表基址(逻辑地址从哪开始)。有了这两个信息,就可以查到对应的帧号。我们可以通过页号查到帧号,帧号再加上偏移量,就是物理地址。

页表也是操作系统在操作系统初始化,在使能enable阶段建立好的。


相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
目录
相关文章
|
3月前
|
存储 Linux 调度
深入理解操作系统:从进程管理到内存分配
【8月更文挑战第44天】本文将带你深入操作系统的核心,探索其背后的原理和机制。我们将从进程管理开始,理解如何创建、调度和管理进程。然后,我们将探讨内存分配,了解操作系统如何管理计算机的内存资源。最后,我们将通过一些代码示例,展示这些概念是如何在实际操作系统中实现的。无论你是初学者还是有经验的开发者,这篇文章都将为你提供新的视角和深入的理解。
|
4月前
|
安全 索引
操作系统中的内存管理策略
【8月更文挑战第23天】
96 1
|
2月前
|
分布式计算 算法 大数据
探索操作系统的核心:调度与内存管理机制
【10月更文挑战第11天】 本文深入探讨了操作系统中两大核心功能——调度与内存管理机制。通过分析调度算法、进程状态转换及内存分配策略等关键方面,揭示了它们如何共同维护系统性能和稳定性。旨在为读者提供对操作系统内部运作的深刻理解,同时引起对优化策略的思考。
70 5
|
2月前
|
算法
深入理解操作系统:内存管理机制的探索之旅
【10月更文挑战第2天】在数字世界的浩瀚海洋中,操作系统犹如一艘精密的航船,承载着软件与硬件的和谐共舞。本文将揭开内存管理的神秘面纱,从基础概念到高级策略,引领读者领略操作系统内存分配的智慧。通过深入浅出的解释和生动的比喻,我们一同遨游在内存的江河之中,感受操作系统如何巧妙地协调资源,确保数据的有序流动。让我们跟随内存的脚步,探索那些隐藏在每次点击、每次命令背后的奥秘。
|
2月前
|
监控 开发者
深入理解操作系统:内存管理的艺术
【10月更文挑战第2天】在数字世界的幕后,操作系统扮演着至关重要的角色。本文将深入探索操作系统的心脏——内存管理,揭示它是如何协调和管理计算机的宝贵资源。通过浅显易懂的语言和生活化的比喻,我们将一起走进内存管理的奥秘世界,了解它的原理、机制以及为何对整个系统的性能和稳定性有着不可替代的影响。无论你是技术新手还是资深开发者,这篇文章都将为你打开新的视角,让你对日常使用的设备有更深层次的认识和尊重。
|
2月前
|
缓存 算法 调度
深入浅出操作系统:从进程管理到内存优化
本文旨在为读者提供一次深入浅出的操作系统之旅。我们将从进程管理的基本概念出发,逐步深入到内存管理的复杂世界,最终探索如何通过实践技巧来优化系统性能。文章将结合理论与实践,通过代码示例,帮助读者更好地理解操作系统的核心机制及其在日常技术工作中的重要性。无论你是初学者还是有一定经验的开发者,这篇文章都将为你打开一扇通往操作系统深层次理解的大门。
|
2月前
|
存储 算法 C语言
MacOS环境-手写操作系统-17-内存管理算法实现
MacOS环境-手写操作系统-17-内存管理算法实现
39 0
|
2月前
|
Java C语言 iOS开发
MacOS环境-手写操作系统-16-内存管理 解析内存状态
MacOS环境-手写操作系统-16-内存管理 解析内存状态
41 0
|
2月前
|
存储 算法 C语言
MacOS环境-手写操作系统-15-内核管理 检测可用内存
MacOS环境-手写操作系统-15-内核管理 检测可用内存
45 0
|
2月前
|
编译器 C语言 C++
【C语言】精妙运用内存函数:深入底层逻辑的探索
【C语言】精妙运用内存函数:深入底层逻辑的探索