【操作系统】第四章:非连续内存分配(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应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
目录
相关文章
|
2月前
|
存储 Linux 调度
深入理解操作系统:从进程管理到内存分配
【8月更文挑战第44天】本文将带你深入操作系统的核心,探索其背后的原理和机制。我们将从进程管理开始,理解如何创建、调度和管理进程。然后,我们将探讨内存分配,了解操作系统如何管理计算机的内存资源。最后,我们将通过一些代码示例,展示这些概念是如何在实际操作系统中实现的。无论你是初学者还是有经验的开发者,这篇文章都将为你提供新的视角和深入的理解。
|
4月前
|
存储 算法 调度
深入理解操作系统:从进程管理到内存分配
本文将探讨操作系统的核心概念,包括进程管理、内存分配以及文件系统等。我们将通过具体的案例和数据来分析这些概念的工作原理,以及它们如何影响计算机的性能和稳定性。文章将提供对操作系统内部机制的深入理解,帮助读者更好地理解和使用计算机。
93 0
|
4月前
|
存储 算法 定位技术
深入理解操作系统:从进程管理到内存分配
【7月更文挑战第27天】本文旨在为读者提供一个全面而深入的视角,以理解操作系统的核心概念和机制。我们将通过探讨进程管理、内存分配等关键主题,揭示这些复杂系统如何协同工作以确保计算环境的稳定和高效。文章将采用比喻和实例来阐释抽象的概念,使技术内容更加贴近生活,易于理解。
|
1月前
|
编译器 C语言 C++
【C语言】精妙运用内存函数:深入底层逻辑的探索
【C语言】精妙运用内存函数:深入底层逻辑的探索
|
2月前
|
Linux Shell 虚拟化
使用LiME收集主机物理内存的内容时发生宕机
使用LiME收集主机物理内存的内容时发生宕机
|
2月前
crash —— 获取物理内存布局信息
crash —— 获取物理内存布局信息
|
3月前
|
Linux 调度 C语言
深入理解操作系统:从进程管理到内存分配
【8月更文挑战第31天】在数字世界的每一次点击和滑动背后,都隐藏着一个复杂而精妙的世界——操作系统。它如同一座无形的桥梁,连接着人类与机器的沟通。本文将带你一探究竟,从进程的生命周期到内存的精细管理,我们将一起解码操作系统的核心机制。通过直观的代码示例,你将看到理论与实践的结合如何让冷冰冰的机器生动起来。准备好了吗?让我们开始这段探索之旅,揭开操作系统神秘的面纱。
|
4月前
|
开发者 Java
JVM内存问题之top命令的物理内存信息中,'used'和'free','avail Mem'分别表示什么
JVM内存问题之top命令的物理内存信息中,'used'和'free','avail Mem'分别表示什么
|
4月前
|
缓存 NoSQL Redis
Redis性能优化问题之当Redis内存达到maxmemory后,淘汰数据的逻辑是怎样的
Redis性能优化问题之当Redis内存达到maxmemory后,淘汰数据的逻辑是怎样的
|
4月前
|
存储 安全 Linux
深入理解操作系统:从进程管理到内存分配
【6月更文挑战第30天】在数字时代的心脏,操作系统是现代计算不可或缺的组成部分。本文将深入探讨操作系统的核心功能,包括进程管理、内存分配以及文件系统管理。我们将通过实际案例分析,揭示这些机制如何在提高计算机性能的同时保证资源的有效利用。文章旨在为读者提供对操作系统工作原理的深刻理解,并展示其在现代技术中的应用价值。
下一篇
无影云桌面