《操作系统》OS学习(五):连续内存分配 内存碎片、动态分配、碎片整理、伙伴系统

内存碎片

在没有其他方式辅助的情况下,我们分配给一个进程的内存是连续的。在分配时候我们需要有动态分配与碎片处理。如何理解呢?就是每个进程需要一块内存,我们要选取合适的位置的内存分配给它。当有的进程先结束了内存还给操作系统,此时可能就会产生内存碎片,要对碎片进行处理。首先对一些概念进行解释。

  • 连续内存分配:给进程分配一块不小于指定大小的连续的物理内存区域。
  • 内存碎片:不能被利用的空闲内存,内存碎片又分为外部碎片和内部碎片。
  1. 外部碎片:分配单元之间的未被利用的内存,比如两个进程之间的进程结束后的空间,如果后续请求的大小都大于这一部分空间,这部分空间就不能被利用,也就形成了外部碎片。
  2. 内部碎片:分配单元内部的未被使用的内存,这是由于分配时可能只能分配2的幂次方大小内存比如512字节,而实际使用了510字节,那么就有2字节的内部碎片。

动态分配:

当程序加载执行时,需要分配给进程一个指定大小可变的分区,分区的地址是连续的。如图中右侧分给进程1到6内存空间。当进程3和进程5结束后它们所占有的位置重新变为空闲。操作系统要维护的数据结构就包含了内存中已分配区域与未分配区域。当有新的进程请求一定的内存空间时,则根据未分配空间进行一个动态分区分配。分配的策略是多种多样的。比如:

  • 最先分配,空闲分区列表按照地址顺序排序,遍历空闲分区,遇到的第一个大小满足需求的区域分配给进程。释放内存使,查看附近是否有临近的空闲区,有的话进行合并。优点是找和合并开销较小,算法简单,并且由于每次从小地址开始查找,可以在大地址处留有大块的空闲分区,可以分配给需要大内存的进程。缺点是会有外部碎片,因为切完剩下的可能有很多小块内存,也因此分配大内存时需要遍历到最后时间较长。
  • 最佳匹配,空闲分区列表按照大小排序,寻找空闲区域中大小大于需求大小中最小的分配给进程,具体实现时可以对空闲分区按大小排序从最小开始寻找第一个大于需求的内存区即可,如果不排序则需要整个遍历一遍。释放时,也是与邻近空闲区域合并。而合并时我们要找的是地址邻近的而不是大小邻近的,所以合并的开销会大一些。优点大部分分配的内存尺寸较小时效果很好,因为可以避免较大的内存被拆分,同时减小外部碎片的大小,同时相对来说比较简单。缺点是外部碎片还是较多,并且越小越无法被利用,容易产生很多无用的小碎片,此外如前所述释放分区较慢,合并时算法复杂。
  • 最差匹配,空闲分区列表按照大小排序,寻找空闲去榆中大小最大的区域从中划分出需要大小的内存分配给进程。释放时寻找邻近空闲分区合并。因此也存在最佳匹配的问题,释放内存时合并算法开销较大。优点是中等尺度内存分配较多时效果最好,可以避免产生太多小碎片。缺点是释放较慢,也会有外部碎片,容易破坏大的内存区域,因此后续无法分配大内存。

碎片整理

系统运行过程中,碎片越来越多,很可能无法获取需要的较大的内存空间。我们需要解决这个问题,这就是碎片整理的意义,可以通过碎片整理获得更大的连续内存空间,以便于满足进程的应用空间需求。碎片整理是通过调整进程占用的分区位置来减少或避免分区碎片的。碎片整理有很多种方式,比如碎片紧凑、分区对换。

碎片紧凑

  • 实现方式:通过移动分配给进程的内存分区,以合并外部碎片。
  • 条件:所有的应用程序可以动态重定位。这是因为程序中可能有很多地址引用,如果引用了绝对地址,移动分配的内存位置可能就会出错。因此需要动态重定位,执行到命令的时候才生成内存地址。
  • 时机:进程处于等待状态时搬动。
  • 开销:移动已分配的内存分区是有开销的,因此不会为了一小块碎片就进行紧凑。具体开销暂且按下不讲。

分区对换

分区对换是通过抢占并回收处于等待状态进程的分区,以增大可用内存空间。即将等待状态进程的数据存储到外存中,也就是对换到对换区。可以结合下面的图示理解:假设系统运行到某个时刻处于如下第一张图片的状态,图中下侧为内存与外存状态,上侧为操作系统维护的进程状态数据结构示意图,即有三个进程P1、P2、P3占满了内存区,而P1处于等待状态,P2处于运行状态,P3处于就绪状态。此时又有第四个进程要运行,而内存是不够的。则进行分区对换,对换后如第二张图所示,将处于等待状态的进程P1移动到外存,此时就有足够的内存空间。通过这种方式,我们可以让更多的进程在系统中交替进行。

由于对换是在内存与外存之间,对换速度是非常慢的,开销很大,因此需要解决一个问题,就是到底要交换哪些进程。

伙伴系统

伙伴系统是连续存储分配的一种办法。它比较好地折中了分配和回收过程中分配块的位置碎片和合并的问题。伙伴系统地概念如下图:整个可分配分区大小为2的幂次方,当需要的内存空间大于当前块的一半的时候就将整个分区分配给进程,如果小于当前分区的一半,就将当前分区对半分开,将其中一半继续与需要的内存大小进行比较,递归进行下去,直到满足所需内存大小大于分区一半。可以看到这种分配方式内部碎片最大为分区大小的一半减一。知道了伙伴系统的思想,下面我们看下具体实现。

伙伴系统的实现

数据结构:

  • 空闲块按大小和起始位置组织称二维数组;
  • 初始状态时,只有一个大小为2^u的空闲块;

分配过程:

  • 由小到大在空闲块数组中找最小的可用空闲块;
  • 如果空闲块过大,对可用空闲块进行二等分,一个放入空闲块列表,另一块继续比较,直到得到合适的可用空闲块

分配示例:

释放过程:

  • 把释放的块放入空闲块数组
  • 合并满足合并条件的空闲块

合并条件:

  • 大小相同2^i
  • 地址相邻
  • 起始地址小的块的地址必须是2^{i+1}的倍数。看起来有点抽象,其实就是地址较小的块的起始地址必须是要合并的块的大小的两倍的倍数。因此上图中三个256只有后面两个可以合并。

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

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

相关文章

GCC 中文手册 - 摘自纯C论坛

GCC Section: GNU Tools (1) Updated: 2003/12/05 Index Return to Main Contents NAME gcc,g-GNU工程的C和C编译器(egcs-1.1.2) 总览(SYNOPSIS) gcc[option|filename ]... g[option|filename ]... 警告(WARNING) 本手册页内容摘自GNU C编译器的完整文档,仅限于解释选项的含义…

python如何实现支持中文

#codingutf-8print("我要python支持中文") 默认情况下,python是不支持中文的。 如果要实现python支持中文(我是从python3.6开始学习的),只要在python文档的开头加入:“#codingutf-8"就可以了。转载于:h…

世界之窗浏览器删除文本框信息_文本框——Excel里的便利贴

工作表里面的单元格应该是足够我们来记录数据和信息了。但是文本框这个功能在工作表中还是存在,可以理解为便利贴功能。插入文本框1.点击“插入”选项卡。2.然后点击“文本框”。3.在下拉菜单里面,有两种可供选择:横排文本框和垂直文本框。在…

RHEL 5服务篇—常用网络配置命令

常用网络配置命令 在“Linux系统管理”的文章中,大家已经学习了Linux系统的基本管理命令和技巧,为了进一步学习Linux网络服务打下了良好的基础。所以我作者以后将陆续推出Linux网络服务的相关文章。希望大家能给与我大大的支持。 今天我们就来学习一下…

清华大学《操作系统》(六):非连续内存分配 段式、页式、段页式存储管理

背景 连续内存分配给内存分配带来了很多不便,可能所有空闲片区大小都无法满足需求大小,这个分配就会失败。基于这种现状,就有了非连续内存分配的需求。非连续分配成功的几率更高,但也面对更多的问题,比如分配时是不是…

python监控文件内容变化_Python监控文件内容变化

{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":4,"count":4}]},"card":[{"des":"阿里云文件存储NAS是一个可共享访问&#xf…

C语言第三次博客作业---单层循环结构

一、PTA实验作业。 题目1 1.实验代码 int n,i; double height1,height2;//1为输入身高&#xff0c;2为输出身高。 char sex; //1<height1<3; //N<1; scanf("%d",&n); while(n--){getchar();scanf("%c%lf",&sex,&height1);switch(sex)…

函数和函数式编程

python的过程就是函数&#xff0c;因为解释器会隐式地返回默认值None。 实际编程中大部分偏函数更接近过程&#xff0c;不显示地返回任何东西。 当没有显示地返回元素或者如果返回None时&#xff0c;python会返回一个None。 * 元组 ** 字典 def子句的剩余部分包括了一个虽…

清华大学《操作系统》(七):虚拟存储、覆盖、交换

接下来几节都是对虚拟存储的讲解。虚拟存储是非连续存储管理的扩展。通过将内存中的数据暂存到外存的方式&#xff0c;为进程提供更大的内存空间。虚拟存储出现的主要原因是因为程序规模的增长速度远远大于存储器容量的增长速度&#xff0c;导致内存空间不够用。其实针对内存空…

遵义大数据中心项目工程概况_市委书记张新文到曹州云都大数据中心等项目现场调研建设情况...

4月25日&#xff0c;市委书记张新文到曹县调研重点项目建设情况&#xff0c;研究推进措施。市委常委、秘书长任仲义参加活动。张新文首先来到曹州云都大数据中心项目建设现场&#xff0c;查看项目推进情况。曹州云都大数据中心&#xff0c;是涵盖云计算区、研发办公区、公寓生活…

linux 可执行文件的分析(gcc GUN BUILEIN)

1、GCC The History of GCC 1984年&#xff0c;Richard Stallman发起了自由软件运动&#xff0c;GNU (Gnus Not Unix)项目应运而生&#xff0c;3年后&#xff0c;最初版的GCC横空出世&#xff0c;成为第一款可移植、可优化、支持ANSI C的开源C编译器。GCC最初的全名是GNU C Com…

Cassandra 的数据存储结构——本质是SortedMapRowKey, SortedMapColumnKey, ColumnValue

Cassandra 的数据存储结构 Cassandra 的数据模型是基于列族&#xff08;Column Family&#xff09;的四维或五维模型。它借鉴了 Amazon 的 Dynamo 和 Googles BigTable 的数据结构和功能特点&#xff0c;采用 Memtable 和 SSTable 的方式进行存储。在 Cassandra 写入数据之前&a…

清华大学《操作系统》(八):置换算法

功能&#xff1a;置换算法是指当出现缺页异常时&#xff0c;需要调入新页面而内存已满时&#xff0c;置换算法选择被置换的物理页面。 设计目标&#xff1a; 尽可能减少页面的调入调出次数&#xff1b;把未来不再访问或短期内不访问的页面调出。 页面锁定&#xff1a; 了解具…

python email模块详解_python模块之email: 电子邮件编码解码 (一、解码邮件)

python自带的email模块是个很有意思的东西&#xff0c;它可以对邮件编码解码&#xff0c;用来处理邮件非常好用。处理邮件是一个很细致的工作&#xff0c;尤其是解码邮件&#xff0c;因为它的格式变化太多了&#xff0c;下面先看看一个邮件的源文件&#xff1a;Received: from …

烂泥:通过vsphere给esxi添加本地硬盘

公司ESXi服务器的硬盘空间不够使用&#xff0c;现在新加了一块硬盘在ESxi服务器上。在服务器上添加完硬盘后&#xff0c;在Vsphere上是看不到新加硬盘的。 下面我们来通过虚拟机模拟该情况&#xff0c;先添加一块硬盘。如下图&#xff1a; 在Esxi添加完硬盘后&#xff0c;现在通…

清华大学《操作系统》(九):进程和线程

进程 定义&#xff1a; 进程是指一个具有一定独立功能的程序在一个数据集合上的一次动态执行的过程。 组成&#xff1a; 代码数据状态寄存器&#xff08;正在运行的一个程序的所有状态信息&#xff09;&#xff1a;CPU状态CP0、指令指针IP通用寄存器&#xff1a;AX、BX、CX…

开始Flask项目

1.新建Flask项目。2.设置调试模式。3.理解Flask项目主程序。4.使用装饰器&#xff0c;设置路径与函数之间的关系。5.使用Flask中render_template&#xff0c;用不同的路径&#xff0c;返回首页、登录员、注册页。6.用视图函数反转得到URL&#xff0c;{{url_for(‘login’)}}&am…

gcc交叉编译的实现

gcc支持多种不同的语言&#xff0c;也支持多种不同的CPU架构。在它的实现上&#xff0c;不同语言编译的实现是通过conststruct lang_hooks lang_hooks LANG_HOOKS_INITIALIZER;这个结构体的不同定义来实现的。比如c语言的编译器就通过gcc/c-lang.c指定了lang_hooks这个结构体的…

烂泥:mysql数据库使用的基本命令

1、连接数据库的格式 mysql -h IP -u用户名 -p密码; 1.1连接远程数据库 mysql -h 192.168.1.214 -uroot -p123456 也可写成&#xff1a; mysql -h 192.168.1.214 -u root -p 123456 1.2连接本地数据库 mysql -uroot -p123456 也可写成&#xff1a; mysql -u root -p 123456 2、…

mse均方误差计算公式_PCA的两种解读:方差最大与均方误差最小的推导

这张图片很关键&#xff0c;来自统计学习方法的PCA插图又要考试了&#xff0c;推导一下方差最大化与均方差最小化&#xff0c;老师上课讲了一些均方差最小化&#xff0c;推导的过程很详细不过自己没有记下来&#xff0c;复习的时候再推一遍加深印象。感谢 耳东陈 老师的精彩课件…