[操作系统笔记]内存管理1

news2025/1/20 2:51:06

内容系听课复习所做笔记,图例多来自课程截图

在这里插入图片描述

覆盖与交换

在这里插入图片描述

下图为覆盖技术图示:

在这里插入图片描述
交换技术和中级调度密切相关:

中级调度(内存调度):就是要决定将哪个处于挂起状态的进程重新调入内存

在这里插入图片描述

在哪保存被换出的进程

具有对换功能的操作系统中,通常把磁盘空间分为文件区对换区两部分。

文件区主要用于存放文件,主要追求存储空间的利用率,因此对文件区空间的管理采用离散分配方式

对换区空间只占磁盘空间的小部分,被换出的进程数据就存放在对换区。

由于对换的速度直接影响到系统的整体速度,因此对换区空间的管理主要追求换入换出速度,因此通常对换区采用连续分配方式,故对换区的I/O速度比文件区的更快。

什么时候进行交换

交换通常在许多进程运行且内存吃紧时进行,而系统负荷降低就暂停。例如:在发现许多进程运行时经常发生缺页,就说明内有紧张,此时可以换出一些进程;如果缺页率明显下降,就可以暂停换出。

应该换出哪些进程

可优先换出阻塞进程;可换出优先级低的进程;为了防止优先级低的进程在被调入内存后很快又被换出,有的系统还会考虑进程在内存的驻留时间…

内存的分配与回收

连续分配管理方式

在这里插入图片描述

连续分配:指为用户进程分配的必须是一个连续的内存空间

相应地,非连续分配可以是离散的


对于固定分区分配,需要有一个分区说明表,类似下表:

分区号大小(MB)起始地址状态
128未分配
2210已分配
3412已分配

当某用户程序要装入内存时,由操作系统内核程序根据用户程序大小检索该表,从中找到一个能满足大小的、未分配的分区,将之分配给该程序,然后修改状态为“已分配”。

动态分区分配的诸多问题

  1. 使用什么样的数据结构记录内存使用情况
  2. 当多个空闲分区都能满足需求时,应该选择哪个分区进行分配
  3. 如何进行分区的分配与回收操作

在这里插入图片描述

记录内存使用情况的数据结构

分为两种:

  • 空闲分区表(长得跟上面那个表挺像,有分区号、分区大小、分区起始位置等)
  • 空闲分区链(是双向链表)

动态分区分配算法

把一个新作业装入内存时,须按照一定的动态分区分配算法,从空闲分区表(或空闲分区链)中选出一个分区分配给该作业。由于分配算法算法对系统性能有很大的影响,因此人们对它进行了广泛的研究。

在这里插入图片描述

首次适应算法

实现方式:空闲分区以地址递增的次序排列。每次分配内存时按顺序查找(从地址最小的空闲分区开始)空闲分区链(或空闲分区表),找到首个大小能满足要求的空闲分区。

当然,分配完之后肯定要修改原空闲分区表(链)的数据,比如把第二个分区(大小4MB)分配给一个需要3MB空间的进程,那么分区表就得把第二个分区大小改为1MB。

最佳适应算法

算法思想:由于动态分区分配是一种连续分配方式,为各进程分配的空间必须是连续的一整片区域。因此为了保证当“大进程”到来时能有连续的大片空间,可以尽可能多地留下大片的空闲区

原则就是:优先使用更小的空闲区

如何实现:空闲分区按容量递增次序排列。每次分配内存时顺序查找空闲分区链(或空闲分区表),找到大小能满足要求的第一个空闲分区。

找到的必然是满足需要的最小的空闲分区


缺点:每次都选最小的分区进行分配会留下越来越多的、很小的、难以利用的内存块(因为用来分配的空闲分区大小不总是和需要的空间大小相同,因此总会留下空余的、更小的新的空闲空间)。因此这种方法会产生很多的外部碎片。

最坏适应算法

又称:最大适应算法(Largest Fit)

算法思想:为了解决最佳适应算法的问题――即留下太多难以利用的小碎片,可以在每次分配时优先使用最大的连续空闲区,这样分配后剩余的空闲区就不会太小,更方便使用。

如何实现:空闲分区按容量递减次序链接。每次分配内存时顺序查找空闲分区链(或空闲分区表),找到大小能满足要求的第一个空闲分区。

如果分配时第一个空闲分区都不能满足需要,那后面的也不用看了,肯定不行

缺点:每次都选最大的分区进行分配,虽然可以让分配后留下的空闲区更大、更可用,但是这种方式会导致较大的连续空闲区被迅速用完。如果之后有“大进程”到达,就没有内存分区可用了。

邻近适应算法

算法思想:首次适应算法每次都从链头开始查找的。这可能会导致低地址部分出现很多小的空闲分区,而每次分配查找时,都要经过这些分区,因此也增加了查找的开销。如果每次都从上次查找结束的位置开始检索,就能解决上述问题。

如何实现:空闲分区以地址递增的顺序排列(可排成一个循环链表)。每次分配内存时从上次查找结束的位置开始查找空闲分区链(或空闲分区表),找到大小能满足要求的第一个空闲分区。


首次适应算法每次都要从头查找,每次都需要检索低地址的小分区。但是这种规则也决定了当低地址部分有更小的分区可以满足需求时,会更有可能用到低地址部分的小分区,也会更有可能把高地址部分的大分区保留下来(最佳适应算法的优点)

邻近适应算法的规则可能会导致无论低地址、高地址部分的空闲分区都有相同的概率被使用,也就导致了高地址部分的大分区更可能被使用(划分为小分区),最后导致无大分区可用(最大适应算法的缺点)

总结

最佳适应和最坏适应是有额外开销的,即对空闲空间的按大小进行排序;但是首次适应和邻近适应没有。

算法思想分区排列顺序优点缺点
首次适应从头到尾找适合的分区空闲分区以地址递增次序排列综合看性能最好。算法开销小,回收分区后一般不需要对空闲分区队列重新排序
最佳适应优先使用更小的分区,以保留更多大分区空闲分区以容量递增次序排列会有更多的大分区被保留下来,更能满足大进程需求会产生很多太小的、难以利用的碎片;算法开销大,回收分区后可能需要对空闲分区队列重新排序
最坏适应优先使用更大的分区,以防止产生太小的不可用的碎片空闲分区以容量递减次序排列可以减少难以利用的小碎片大分区容易被用完,不利于大进程;算法开销大(原因同上)
邻近适应由首次适应演变而来,每次从上次查找结束位置开始查找空闲分区以地址递增次序排列(可排列成循环链表)不用每次都从低地址的小分区开始检索。算法开销小(原因同首次适应算法)会使高地址的大分区也被用完

如何进行分区的分配与回收

分配:如果采用分区表,就得修改其中条目(分区大小和起始地址),如果一整条记录对应的分区都被分配了,那么就删掉这条记录(因为记录是要记录空闲的)

回收:如果回收的空间挨着(分为前边挨着、后边挨着和前后两边都挨着)已记录的空闲空间,就得在记录中将之合并;如果回收区的前后均未邻接空闲分区,则应增加(新建)记录

看好了啊,回收一共是四种情况:前边挨着、后边挨着、前后两边都挨着和前后两边都不挨着空闲空间

总而言之的原则就是相邻的空闲区间要合并


分区表各表项的顺序不一定按照地址递增顺序排列,具体的排列方式需要依据动态分区分配算法来确定。

内部碎片和外部碎片

内部碎片:分配给某进程的内存区域中,如果有些部分没有用上。
外部碎片:是指内存中的某些空闲分区由于太小而难以利用。

如果内存中空闲空间的总和本来可以满足某进程的要求,但由于进程需要的是一整块连续的内存空间,因此这些“碎片”不能满足进程的需求。

可以通过紧凑技术(或称拼凑技术, Compaction)来解决外部碎片

技术性质
单一连续分配无外部碎片,有内部碎片
固定分区分配无外部碎片,有内部碎片
动态分区分配无内部碎片,有外部碎片

非连续分配管理方式

  • 基本分页存储管理
  • 基本分段存储管理
  • 段页式存储管理

基本分页存储管理

将内存空间分为一个个大小相等的分区(比如每个分区4KB),每个分区就是一个“页框”(页框=页帧=内存块=物理块=物理页面)。每个页框有一个编号,即“页框号”(页框号=页帧号=内存块号=物理块号=物理页号),页框号从0开始。

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

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

相关文章

m基于遗传优化算法的公式参数拟合matlab仿真

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 遗传算法的原理 遗传算法GA把问题的解表示成“染色体”,在算法中也即是以二进制编码的串。并且,在执行遗传算法之前,给出一群“染色体”,也即是假…

MySQL窗口函数

窗口函数在统计类的需求中很常见,稍微复杂一点的查询需求就有可能用到它,使用窗口函数可以极大的简化我们的 SQL 语句。像 Oracle、SQL Server 这些数据库在较早的版本就支持窗口函数了,MySQL 直到 8.0 版本后才支持它。 一般来说涉及复杂的分…

pytorch深度学习实战lesson29

第二十九课 深度学习硬件 这节课讲一下深度学习的硬件。具体来讲一下所谓的 CPU 和 GPU有什么区别,为什么 GPU 会快? 目录 CPU GPU 首先大家如果学习深度学习的话基本上都有一个GPU的电脑,如果你自己装一台机器的话,很有可能是…

【JavaScript高级】04-JavaScript函数增强

JavaScript函数增强函数属性和arguments函数对象的属性函数中的argumentsarguments转Array函数的剩余参数纯函数的理解和应用JavaScript纯函数定义纯函数案例柯里化的理解和应用柯里化定义组合函数理解和应用函数属性和arguments 函数对象的属性 在JavaScript中函数也是一个对…

维格云自定义按钮入门教程

目录 维格云自定义按钮功能简介 维格云自定义按钮适用场景 维格云自定义按钮设置步骤 开启插件 在拓展设置中创建按钮 在数据表中添加自定义按钮 效果展示 维格云自定义按钮注意事项 维格云自定义按钮功能简介 给不同情境下的数据详情页面,添加按钮,点击后可往另一个…

【博弈论】极小极大搜索(Minimax Algorithm)与α-β剪枝(Alpha-Beta Pruning)

文章目录一、极大极小搜索(Minimax Algorithm)二、α-β剪枝(Alpha-Beta Pruning)三、解题技巧一、极大极小搜索(Minimax Algorithm) 在零和博弈(有完整信息的,确定的、轮流行动的&…

steam搬砖项目月入过万靠谱吗

大家好,我是阿阳 什么是国外steam游戏装备汇率差项目 一、项目介绍 其实,Steam就是一个美国的游戏平台,搬砖主要是搬的一款火遍全球的游戏CSGO的装备和饰品。CS听说过吧,这款游戏就是CS的一个系列。(通俗易懂的理解就…

【C++数据结构】性能测量

性能测量 4.1 引言 容易计算内存的需求大小,只要知道编译后的代码和数据空间的大小就可以了; 数据空间的大小取决于用户所要解决的问题实例的大小。 要确定程序运行时间,需要通过实验来测量。 程序性能不仅依赖操作类型和数量&#xff0c…

Excel逆向查询的多种方法,赶快学起来

关于匹配查询,我们平时用的做多的就是VLOOKUP函数了,但VLOOKUP函数只能正向查找,不能逆向查询。 像是下面这种情况就不可以: (现在我们想用编码去匹配书名) 如果在不改变原表格结构的基础上查找出书目编码…

当MySQL和java通过媒婆navicate谈上了恋爱 ------ MySQL的安装和Java的连接

👨‍💻个人主页:元宇宙-秩沅 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 本文由 秩沅 原创 **收录于专栏 数据库 ⭐当MySQL和java通过媒婆navicate谈上了恋爱⭐ 文章目录⭐当MySQL和java通过媒婆navicate谈上了恋爱…

vue组件库发布到npm

修改项目的信息 在package.json文件中: 修改Readme文件的信息 注册npm 账号 指路官网 vscode终端登录npm 执行 npm login 输入用户名,密码,邮箱,邮箱验证码 如下图 执行 npm publish 如下图 出现的问题 npm ERR! code E403 …

CSAPP Lab6:Malloc

文章目录一、实验简介二、隐式链表实现基本宏块的相关函数mm_initmm_mallocmm_freemm_reallocextend_heapblk_mergeblk_findblk_split使用下次匹配三、显式链表实现四、分离适配五、完整代码隐式链表显式链表课本实现一、实验简介 实现一个动态内存分配器。 tar xvf mallocla…

Linux 应急响应命令总结,收藏版

系统排查 系统基本信息 CPU 信息 CPU 信息:lscpu 操作系统信息 操作系统信息:uname -a 操作系统信息:cat /proc/version 模块信息 模块信息:lsmod 账户信息 系统所有账户 系统所有账户:cat /etc/passwd 超级权限账户 超…

3D-SKIPDENSESEG医学图像分割

蓝色三角、黄色三角、红色三角相对应。 得到第三个feature map,反卷积会恢复到原来的尺寸 Dense block,通道增加了 Transition,池化 用正则表达式把里面的h5文件匹配一下吧 os.path.join()把两个部分的路径拼一下 root_path —data_train *.…

[kubernetes]-k8s开启swap

导语:记录k8s开启swap后先后做的调整 测试版本 k8s1.20版本 使用参数--fail-swap-onfalse Environment"KUBELET_EXTRA_ARGS--fail-swap-onfalse"使用测试 可以开启swap不报错 但是pod使用swap不太理想。且无法实现在使用swap的时候限制pod的内存。会造…

【Java面试】List接口

文章目录Iterator 和 ListIterator 有什么区别?遍历一个 List 有哪些不同的方式?每种方法的实现原理是什么?Java中List 遍历的最佳实践是什么?说一下 ArrayList 的优缺点如何实现数组和 List 之间的转换?ArrayList 和 …

M4 tm4c1294单片机软件调式总结

1,框架图: 调式基本方法: (1)加串口打印初始化,单步跟踪查看,类似gdb的单步; (2)打印命令行,重点参数添加命令行打印; (3&#xff…

Redis 的相关基础知识

【一】 Redis 中默认的端口号为什么是6379 图中的人名为 Alessia Merz ,其中的 Merz 对应的九键输入法按出来的就是6379 【二】 Redis 默认的数据库 Redis 中默认使用的是16个数据库,类似数组下标从0开始,初始默认使用0号数据库 【三】 Redis…

vscode搭建Verilog HDL开发环境

工欲善其事,必先利其器。应该没有多少人会使用Quartus和vivado这些软件自带的编辑器吧,原因在于这些编辑器效率很低,Verilog HDL代码格式比较固定,通常可以利用代码片段补全加快书写。基本上代码写完之后才会打开Quartus或者vivad…

一文带你了解Spring中的事务管理

文章目录前言一、事务的基础概念二、spring中事务的使用声明式事务编程式事务如何选择事务方式三、spring中事务管理实现原理前言 本文将涉及以下知识点: 事务的基础概念spring当中事务的使用spring当中事务管理的实现原理 一、事务的基础概念 事务(T…