从操作系统角度了解内存管理

news2024/10/7 10:18:02

一.内存管理

1.主要功能

内存管理的主要功能有:

  • 内存空间的分配与回收。由操作系统完成主存储器空间的分配和管理,使程序员摆脱存储分配的麻烦,提高编程效率。
  • 地址转换。在多道程序环境下,程序中的逻辑地址与内存中的物理地址不可能一致, 因此存储管理必须提供地址变换功能,把逻辑地址转换成相应的物理地址。
  • 内存空间的扩充。利用虚拟存储技术或自动覆盖技术,从逻辑上扩充内存。
  • 内存共享。指允许多个进程访问内存的同一部分。例如,多个合作进程可能需要访问同一块数据,因此必须支持对内存共享区域进行受控访问。
  • 存储保护。保证各道作业在各自的存储空间内运行,互不干扰。

在进行具体的内存管理之前,需要了解进程运行的基本原理和要求。

2.补充

内存管理就是就是围绕这五个方面展开的。

二.程序运行的过程

1.过程

创建进程首先要将程序和数据装入内存。将用户源程序变为可在内存中执行的程序,通常需
要以下几个步骤:
编译。由编译程序将用户源代码编译成若干目标模块。
链接。由链接程序将编译后形成的- -组目标模块及它们所需的库函数链接在- -起,形成一个完整的装入模块。
装入。由装入程序将装入模块装入内存运行。

2.个人理解

  • 编译:把你写的代码各模块编译成对应的机器语言。
  • 链接:把各个模块链接到一起形成一个装入模块,在这个时候形成逻辑地址。
  • 装入:装入模块(可执行文件)进入内存,这个时候逻辑地址变成物理地址。

3.链接方式

程序的链接有三种方式:

  • (1)静态链接:
    在程序运行之前,先将各目标模块及它们所需的库函数链接成-一个完整的装配模块,以后不再拆开。将几个目标模块装配成一个装入模块时,需要解决两个问题:①修改相对地址,编译后的所有目标模块都是从0开始的相对地址,当链接成- -个装入模块时要修改相对地址。②变换外部调用符号,将每个模块中所用的外部调用符号也都变换为相对地址。
  • (2)装入时动态链接:
    将用户源程序编译后所得到的- -组目标模块,在装入内存时,采用边装入边链接的方式。其优点是便于修改和更新,便于实现对目标模块的共享。
  • (3)运行时动态链接:
    对某些目标模块的链接,是在程序执行中需要该目标模块时才进行的。凡在执行过程中未被用到的目标模块,都不会被调入内存和被链接到装入模块上。其优点是能加快程序的装入过程,还可节省大量的内存空间。

4.装入方式

内存的装入模块在装入内存时,同样有以下三种方式:

  • (1)绝对装入
    绝对装入方式只适用于单道程序环境。在编译时,若知道程序将驻留在内存的某个位置,则编译程序将产生绝对地址的目标代码。绝对装入程序按照装入模块中的地址,将程序和数据装入内存。由于程序中的逻辑地址与实际内存地址完全相同,因此不需对程序和数据的地址进行修改。另外,程序中所用的绝对地址,可在编译或汇编时给出,也可由程序员直接赋予。而通常情况下在程序中采用的是符号地址,编译或汇编时再转换为绝对地址。

  • (2)可重定位装入
    在多道程序环境下,多个目标模块的起始地址通常都从0开始,程序中的其他地址都是相对于起始地址的,此时应采用可重定位装入方式。根据内存的当前情况,将装入模块装入内存的适当位置。在装入时对目标程序中指令和数据地址的修改过程称为重定位,又因为地址变换通常是在进程装入时一次完成的,故称为静态重定位

    当一个作业装入内存时,必须给它分配要求的全部内存空间,若没有足够的内存,则无法装
    入。此外,作业一旦进入内存,整个运行期间就不能在内存中移动,也不能再申请内存空间。

  • (3)动态运行时装入
    也称动态重定位。程序在内存中若发生移动,则需要采用动态的装入方式。装入程序把装入模块装入内存后,并不立即把装入模块中的相对地址转换为绝对地址,而是把这种地址转换推迟到程序真正要执行时才进行。因此,装入内存后的所有地址均为相对地址。这种方式需要一个重定位寄存器的支持。

动态重定位的优点:可以将程序分配到不连续的存储区;在程序运行之前可以只装入部分代
码即可投入运行,然后在程序运行期间,根据需要动态申请分配内存;便于程序段的共享。

三.其他功能

1.内存保护

确保每个进程都有一个单独的内存空间。内存分配前,需要保护操作系统不受用户进程的影.响,同时保护用户进程不受其他用户进程的影响。内存保护可采取两种方法: .

  • 1)在CPU中设置一-对上、下限寄存器,存放用户作业在主存中的下限和上限地址,每当
    CPU要访问一个地址时,分别和两个寄存器的值相比,判断有无越界。
  • 2)采用重定位寄存器(又称基地址寄存器)和界地址寄存器(又称限长寄存器)来实现这种保护。重定位寄存器含最小的物理地址值,界地址寄存器含逻辑地址的最大值。内存管理机构动态地将逻辑地址与界地址寄存器进行比较,若未发生地址越界,则加上重定位寄存器的值后映射成物理地址,再送交内存单元。

2.内存共享

并不是所有的进程内存空间都适合共享,只有那些只读的区域才可以共享。可重入代码又称纯代码,是一种允许多个进程同时访问但不允许被任何进程修改的代码。但在实际执行时,也可以为每个进程配以局部数据区,把在执行中可能改变的部分复制到该数据区,这样,程序在执行时只需对该私有数据区中的内存进行修改,并不去改变共享的代码。

3.内存空间的扩充

交换技术主要在不同进程( 或作业)之间进行,而覆盖则用于同一个程序或进程中。对于主.存无法存放用户程序的矛盾,现代操作系统是通过虚拟内存技术来解决的,覆盖技术则已成为历史;而交换技术在现代操作系统中仍具有较强的生命力。

四.内存分配

1.连续分配方式

1.单一连续分配

内存在此方式下分为系统区和用户区,系统区仅供操作系统使用,通常在低地址部分:在用户区内存中,仅有一道用户程序,即整个内存的用户空间由该程序独占。这种方式的优点是简单、无外部碎片,无须进行内存保护,因为内存中永远只有一道程序。缺点是只能用于单用户、单任务的操作系统中,有内部碎片,存储器的利用率极低。

2.固定分区分配

固定分区分配是最简单的一种多道程序存储管理方式,它将用户内存空间划分为若干固定大
小的区域,每个分区只装入一道作业。当有空闲分区时,便可再从外存的后备作业队列中选择适
当大小的作业装入该分区,如此循环。在划分分区时有两种不同的方法。

  • 分区大小相等。程序太小会造成浪费,程序太大又无法装入,缺乏灵活性。
  • 分区大小不等。划分为多个较小的分区、适量的中等分区和少量大分区。

3.动态分区分配

又称可变分区分配,它是在进程装入内存时,根据进程的实际需要,动态地为之分配内存,并使分区的大小正好适合进程的需要。因此,系统中分区的大小和数目是可变的。

在进程装入或换入主存时,若内存中有多个足够大的空闲块,则操作系统必须确定分配哪个
内存块给进程使用,这就是动态分区的分配策略。考虑以下几种算法:

  • 1)首次适应(First Fit) 算法。空闲分区以地址递增的次序链接。分配内存时,从链首开始
    顺序查找,找到大小能满足要求的第一-个空闲分区分配给作业。
  • 2)邻近适应(NextFit) 算法。又称循环首次适应算法,由首次适应算法演变而成。不同之
    处是,分配内存时从上次查找结束的位置开始继续查找。
  • 3)最佳适应(Best Fit)算法。空闲分区按容量递增的次序形成空闲分区链,找到第-一个能
    满足要求且最小的空闲分区分配给作业,避免“大材小用”。
  • 4)最坏适应(Worst Fit) 算法。空闲分区以容量递减的次序链接,找到第- -个能满足要求的,
    即最大的分区,从中分割一部分 存储空间给作业。

首次适应算法最简单,通常也是最好和最快的。不过,首次适应算法会使得内存的低地址部分出现很多小的空闲分区,而每次分配查找时都要经过这些分区,因此增加了开销。

邻近适应算法试图解决这个问题。但它常常导致在内存空间的尾部(因为在- -遍扫描中,内存前面部分使用后再释放时,不会参与分配)分裂成小碎片。通常比首次适应算法要差。

最佳适应算法虽然称为“最佳”,但是性能通常很差,因为每次最佳的分配会留下很小的难以利用的内存块,会产生最多的外部碎片。

最坏适应算法与最佳适应算法相反,它选择最大的可用块,这看起来最不容易产生碎片,但是却把最大的连续内存划分开,会很快导致没有可用的大内存块,因此性能也非常差。

2.非连续分配方式

非连续分配方式根据分区的大小是否固定,分为分页存储管理和分段存储管理。在分页存储管理中,又根据运行作业时是否要把作业的所有页面都装入内存才能运行,分为基本分页存储管理和请求分页存储管理。

1.基本分页存储管理

基本分页存储管理是指将主存和辅存分成若干个大小相等的页,以页为单位进行数据的读写和存储。在基本分页存储管理中,每个进程都有自己的页表,用于记录该进程的逻辑地址与物理地址之间的映射关系。

当进程需要访问某个逻辑地址时,首先通过页表将逻辑地址转换成物理地址,并判断该物理地址是否已经在主存中。如果该物理地址所对应的页不在主存中,则发生缺页中断,操作系统负责将该页从辅存中调入主存,更新页表,并重新执行该指令。如果该物理地址所对应的页已经在主存中,则直接访问该页并执行相应的操作。

基本分页存储管理可以提高内存的利用率,使得多个进程可以同时共享主存。但是在实现过程中,需要考虑到页面置换算法、页表的管理以及缺页中断的处理等问题。

2.基本分段存储管理

基本分段存储管理是指将主存和辅存分成若干个大小不等的段,以段为单位进行数据的读写和存储。在基本分段存储管理中,每个进程都有自己的段表,用于记录该进程的逻辑地址与物理地址之间的映射关系。

当进程需要访问某个逻辑地址时,首先根据该地址所属的段,在段表中查找该段的物理地址,并计算出物理地址偏移量。然后将物理地址偏移量加上段的物理地址,得到最终的物理地址,并执行相应的操作。

在基本分段存储管理中,不同的进程可以共享相同的段,从而减少了内存的浪费。但是在实现过程中,需要考虑到段的分配、段的保护、段表的管理以及地址转换等问题。同时,由于段的大小不同,因此还需要考虑段的碎片化问题。

3.基本段页式存储管理

基本段页式存储管理是指将主存和辅存分成若干个大小不等的段和页,以段和页为单位进行数据的读写和存储。在基本段页式存储管理中,每个进程都有自己的段表和页表,用于记录该进程的逻辑地址与物理地址之间的映射关系。

当进程需要访问某个逻辑地址时,首先根据该地址所属的段,在段表中查找该段所对应的页表的物理地址,并计算出该地址所对应的页的物理地址。然后在页表中查找该页的物理地址,并计算出物理地址偏移量。最后将物理地址偏移量加上页的物理地址,得到最终的物理地址,并执行相应的操作。

在基本段页式存储管理中,可以实现不同进程之间的空间隔离和内存共享,从而提高了内存的利用率。但是在实现过程中,需要考虑到段的分配、段的保护、页表的管理、页面置换算法以及缺页中断的处理等问题。同时,由于段的大小不同,也会带来段的碎片化问题。

五.虚拟内存的管理方式

1.结构图

2.请求分页式存储管理

请求分页式存储管理是基于基本分页存储管理的一种改进,它可以提高页面置换算法的效率,并减少缺页中断的次数。在请求分页式存储管理中,每个进程所占用的物理页面数量并不是固定的,而是根据进程的实际需要来动态地进行分配。

具体来说,当一个进程需要申请一页新的物理页面时,操作系统会进行以下步骤:

  1. 首先搜索空闲物理页面池,查找是否有空闲的物理页面可供使用。
  2. 如果没有空闲的物理页面,则采用页面置换算法将一个已经驻留在主存中但未被使用的页替换出去,释放其物理页面,以供当前进程使用。
  3. 如果已经找到了空闲的物理页面,则将该页面分配给当前进程,并在进程的页表中记录该页面的映射关系。

通过动态地分配物理页面,请求分页式存储管理可以避免浪费物理内存的情况发生,并且可以根据进程的实际需要来动态地分配物理内存,从而提高了内存的利用率。同时,请求分页式存储管理还可以根据不同的页面置换算法,如FIFO和LRU等,来选择最优的页面置换策略,从而减少缺页中断的次数,提高系统的性能。

3.请求分页式存储管理流程图

4.补充

在计算机组成原理中,也涉及到虚拟内存这一知识点,在那里我有详细解释,这里就不赘述了。

点我了解虚拟存储技术

六.声明

本文是从操作系统角度了解的内存管理,可以结合从计算机组成原理一起观看效果更佳。

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

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

相关文章

Effective第三版 中英 | 第二章 创建和销毁对象 | 固定资源首选使用依赖注入

文章目录 Effective第三版前言第二章 创建和销毁对象固定资源首选使用依赖注入 Effective第三版 前言 大家好,这里是 Rocky 编程日记 ,喜欢后端架构及中间件源码,目前正在阅读 effective-java 书籍。同时也把自己学习该书时的笔记&#xff0…

接招吧!MySQL 10 连问

文章目录 🍉1. 索引底层采用什么数据结构?为什么不用hash🍉2. B树与B树区别?为何用B树?🍉3. 自增主键理解?🍉4. 为什么自增主键不连续🍉5. Innodb为什么推荐用自增ID&…

Jetpack Compose 中的基础组件

Button 默认样式 Button的lambda块中可以传入任意的Composable组件,但一般是放一个Text在里面 Button(onClick { println("确认onClick") }) {Text("默认样式") }按钮的宽高 如果想要宽一点或高一点的Button,可以通过Modifier修…

chatgpt赋能python:Python平面图制作教程

Python平面图制作教程 Python是一种高级编程语言,也是数据科学和机器学习领域中使用最广泛的编程语言之一。在数据可视化中,Python语言具有优秀的表现力和灵活性,可以为用户展示各种数据可视化方案。这篇文章将重点介绍Python如何制作平面图…

八字诀 · 十年之约

* * * 原创:刘教链 * * * 号外:今天在“刘教链Pro”发表了两篇文章,《一视同仁,SEC起诉Coinbase》和《SEC起诉币安的官方新闻稿》,欢迎关注“刘教链Pro”并阅读。 * * * 隔夜比特币奋力反弹,重新回升至27k…

激发数学思维:GPT-4实证研究探索挑战性数学问题

深度学习自然语言处理 原创作者:wkk 考虑到自然语言在许多科学和工程领域表达的数学问题的丰富性,使用大语言模型(LLM)来解决数学问题是一项有趣的研究工作。今天给大家介绍一篇微软研究院联合欧美高校关于如何使用GPT-4解决数学问题的研究论文。 之前的…

KCC@深圳 邀你共享『升压手电DIY』的创新之旅!

嘿,亲爱的KCC深圳的社区成员们!你们是否曾经梦想过拥有一款强大的手电,能够在黑暗中照亮一切?现在,我将揭开一个让你们眼前一亮的活动——『升压手电DIY』! 在这个充满创意的活动中,我们将带你们…

为什么我们是RISC-V的首选 GPU

谈起 GPU,很容易想到 Imagination。毫无疑问,鉴于 Imagination 在图形处理领域的积累,也成为 RISC-V 的首选 GPU。 凭借 30 多年的 PowerVR GPU,Imagination 非常熟悉图形处理器。在过去的时间里,我们不断创新&#xf…

总结893

学习目标: 月目标:6月(线性代数强化9讲,背诵15篇短文,考研核心词过三遍) 周目标:线性代数强化3讲,英语背3篇文章并回诵,检测 每日必复习(5分钟)…

java数组and二维数组

文章目录 java一维数组1.数组定义和定义格式1.1 定义1.2格式 2.数组初始化2.1数组动态初始化2.1.1格式 2.2动态数组初始化取值2.2.1格式 2.3 静态数组初始化取值2.3.1格式 3.数组求长度4.数组遍历 java二维数组1.二维数组动态初始化2.二维数组遍历3.二维数组长度 数组赋值1整数…

聊一聊Netflix 技术栈-数据库

大家好!今天我们来聊一聊全球最受欢迎的视频流媒体平台Netflix的技术栈。作为一个庞大的流媒体服务提供商,Netflix需要强大的数据库支持来实现规模化的视频播放。让我们一起来看看Netflix选择了哪些数据库来支撑他们的业务。 在Netflix的技术栈中&#x…

define与const什么使用区别

&#x1f6a9;define &#x1f38c;一.define的使用方法 &#x1f380;1.定义常量 #define M 10010 int main() {cout << M << endl;cout << M M << endl;//cout << M << end;//会报错return 0; }我们定义了一个名为M的常数&#xff0…

Effective第三版 中英 | 第二章 创建和销毁对象 | 避免创建不需要的对象

文章目录 Effective第三版前言第二章 创建和销毁对象避免创建不需要的对象 Effective第三版 前言 大家好&#xff0c;这里是 Rocky 编程日记 &#xff0c;喜欢后端架构及中间件源码&#xff0c;目前正在阅读 effective-java 书籍。   同时也把自己学习该书时的笔记&#xff…

我爸嘲讽我,写破代码一年才挣十几万,他在工地带50个工人,一个月仅人头费就挣3万多,让我滚回去跟他干工地!...

现在码农的地位有多低&#xff1f; 一位程序员讲述自己被父亲鄙视的经过&#xff1a; 我爸嘲讽我&#xff0c;说我天天写这破代码有啥用&#xff0c;一年就拿十多万死工资。他在工地带 50 个工人&#xff0c;一个人一天抽 20 块钱人头费&#xff0c;一个月都能抽 3 万多&#x…

MTK 相机内存知识点

和你一起终身学习&#xff0c;这里是程序员Android 经典好文推荐&#xff0c;通过阅读本文&#xff0c;您将收获以下知识点 一、Camera 内存包含哪些内容二、VSS/RSS/PSS/USS 内存介绍三、内存查看常用命令四、内存泄漏相关知识点五、参考文献 一、Camera 内存包含哪些内容 1.1…

DeepFaceLive AI实时换脸软件安装流程

第一&#xff1a;设置虚拟内存≥32G 在安装DeepFaceLive前&#xff0c;需把电脑的虚拟内存设置≥32G。鼠标移到左下角WIN处&#xff0c;右击后选择【系统】模块。 在显示的【系统信息】页面选择【高级系统设置】。 在显示的【系统属性】页面中&#xff0c;选择【高级】选项&…

【MySQL数据库 | 第四篇】SQL通用语法及分类

目录 &#x1f914;SQL通用语法&#xff1a; &#x1f60a;语句&#xff1a; &#x1f60a;注释&#xff1a; &#x1f914;SQL语句分类&#xff1a; &#x1f60a;1.DDL语句&#xff1a; &#x1f60a;2.DML语句&#xff1a; &#x1f60a;3.DQL语言&#xff1a; &…

不写代码也能年薪百万?Prompt+低代码开发实战

&#x1f449;腾小云导读 近期 AIGC 狂潮席卷&#xff0c;“前端走向穷途”“低代码时代终结”的言论甚嚣尘上。事实上 GPT 不仅不会干掉低代码&#xff0c;反而会大幅度促进低代码相关系统的开发。本文会介绍 GPT Prompt Engineering 的基本原理&#xff0c;以及如何帮助低代码…

elementui大型表单校验

一般很大的表单都会被拆解开&#xff0c;校验&#xff0c;&#xff0c;不会写在一个页面&#xff0c;&#xff0c;就会有多个 el-form &#xff0c;&#xff0c;主页要集合所有el-form的数据&#xff0c;&#xff0c;所以有一个map来接收&#xff0c;传送表单数据&#xff0c;&…

【Android】脱壳之frida-dexdump小计

前言 最近在挖客户端漏洞时&#xff0c;遇到了加壳的情况&#xff0c;之前没解决过&#xff0c;遇到了就解决一下。特此记录。 本文详细介绍了frida-dexdump脱壳原理相关知识并且在实战中进行了脱壳操作。 基本知识 1. Frida-dexdump frida-dexdump通过以下步骤实现DEX文件…