外部碎片和内部碎片的区别

一、在内存上(使用连续分配算法来管理分配内存时会产生)的外部碎片和内部碎片两个概念

这几天一直看操作系统,看到内存的连续分配时,对于外部碎片和内部碎片时甚是不解:

内存碎片分为:内部碎片和外部碎片
【内部碎片】
内部碎片就是已经被分配出去(能明确指出属于哪个进程)却不能被利用的内存空间;
内部碎片是处于(操作系统分配的用于装载某一进程的内存)区域内部或页面内部的存储块。占有这些区域或页面的进程并不使用这个存储块。而在进程占有这块存储块时,系统无法利用它。直到进程释放它,或进程结束时,系统才有可能利用这个存储块。
单道连续分配只有内部碎片。多道固定连续分配既有内部碎片,又有外部碎片。
【外部碎片】
外部碎片指的是还没有被分配出去(不属于任何进程),但由于太小了无法分配给申请内存空间的新进程的内存空闲区域。
外部碎片是处于任何两个已分配区域或页面之间的空闲存储块。这些存储块的总和可以满足当前申请的长度要求,但是由于它们的地址不连续或其他原因,使得系统无法满足当前申请。
产生外部碎片的一种情况:

举个例子,在内存上,分配三个操作系统分配的用于装载进程的内存区域A、B和C。假设,三个内存区域都是相连的。故而三个内存区域不会产生外部碎片。现在假设B对应的进程执行完毕了操作系统随即收回了B,这个时候A和C中间就有一块空闲区域了。

多道可变连续分配只有外部碎片。

总之,在内存上,外部碎片是位于任何两个操作系统分配的用于装载进程的内存区域或页面之间的空闲区域,内部碎片是位于一个操作系统分配的用于装载进程的内存区域或页面内部的空闲区域。

================================

二、在磁盘上的外部碎片和内部碎片两个概念

很多人会把文件碎片跟簇的概念混淆起来。其实对windows系统来说硬盘上的每个分区都是由最小存储单元——簇组成的。就好比,一面墙是由一块块转头组成的。簇的大小可以在分区格式化时由用户定义,一般是数个KB大小,比如是8KB。假设我有一个文件,大小是80MB零1KB(1MB=1000KB),换算一下就是80,001KB,其中的80,000KB正好占用10000个簇,剩下的那1KB,不得以也要占用1个簇,但这最后一个簇还有7KB的空间没用上了。而且这个未完全使用的簇,其他文件也不允许继续使用。这就造成了一点点的空间浪费。

不少人就把这被浪费了的7KB空间就是磁盘上的内部碎片。

磁盘上的外部碎片(即平时所说的磁盘碎片,磁盘碎片清理工具只能清理磁盘上的外部碎片,清除不了磁盘上的内部碎片,除非改变文件系统的分配单位即簇的大小,使之是一个文件大小的整数倍。)实际上指的是一个文件占据那些簇是不连续的,就相当于文件被分割开来,分别存放在相互间断的几段簇上。文件被分割为几个部分就是几个碎片。所以碎片其实是指文件碎片,可以理解成,文件破碎成片之意。而且文件碎片之间有时候顺序还是错乱的。比如说,有时候“文件里靠后的碎片”所占的簇段在硬盘上反而会排在“文件里位置靠前的碎片”簇段的前面。这样一来,一个文件就会以比较混乱的顺序存放在硬盘上。

显然计算机读取连续的有序的数据肯定要比不连续的乱序的数据来得快。所以整理碎片可能会大幅度提高系统性能。

举个例子,起初硬盘某个分区是空白的,写入三个文件A、B和C。显然这个时候,三个文件都是顺次占用三个簇段(这个说明存放文件所用的文件系统应该是类似FAT这样的文件系统,具体参看注释1)。故而三个文件不会产生碎片。

现在假设你删除了B文件,这个时候A和C中间就有一块空闲簇段了。此时还是不存在文件碎片的,因为每个文件各自占据的簇段都是连续的,没有文件被分割。而如果现在需要写入一个文件D,而且D比刚刚删去的文件B要大。那么A和C之间的空闲簇段就不足以放入D,再假设C后面的空闲簇段也不足以放下D,这个时候D就势必要分割成两块存放,一块放在A和C之间,另一块放在C之后。这样一来,文件碎片就产生了。D文件有两个文件碎片。

磁盘碎片整理要做的工作就是:把C文件前移,一直移到紧接A文件的簇段上去。这样A和C之间就没有空闲簇了,C之后剩下的将是一段完整的空闲簇段,足以放下文件D。这样D就也占据一段连续的簇段。碎片也就消除了。

=====================================

外部碎片的两种理解:

1、在内存上,位于任何两个操作系统分配的用于装载进程的内存区域或页面之间的空闲区域称为外部碎片

2、在磁盘上,将文件分割成几块不相连的分片,这样不相连的分片叫做文件碎片,也即外部碎片。如果将文件分割成几块相连的分片,这样相连的分片则不是文件碎片。

==============================

减少内存碎片
内存碎片是因为在分配一个内存块后,使之空闲,但不将空闲内存归还给最大内存块而产生的。最后这一步很关键。如果内存分配程序是有效的,就不能阻止系统分配内存块并使之空闲。即使一个内存分配程序不能保证返回的内存能与最大内存块相连接(这种方法可以彻底避免内存碎片问题),但你可以设法控制并限制内存碎片。所有这些作法涉及到内存块的分割。每当系统减少被分割内存块的数量,确保被分割内存块尽可能大时,你就会有所改进。
这样做的目的是尽可能多次反复使用内存块,而不要每次都对内存块进行分割,以正好符合请求的存储量。分割内存块会产生大量的小内存碎片,犹如一堆散沙。以后很难把这些散沙与其余内存结合起来。比较好的办法是让每个内存块中都留有一些未用的字节。留有多少字节应看系统要在多大程度上避免内存碎片。对小型系统来说,增加几个字节的内部碎片是朝正确方向迈出的一步。当系统请求1字节内存时,你分配的存储量取决于系统的工作状态。
如果系统分配的内存存储量的主要部分是 1 ~ 16 字节,则为小内存也分配 16 字节是明智的。只要限制可以分配的最大内存块,你就能够获得较大的节约效果。但是,这种方法的缺点是,系统会不断地尝试分配大于极限的内存块,这使系统可能会停止工作。减少最大和最小内存块存储量之间内存存储量的数量也是有用的。采用按对数增大的内存块存储量可以避免大量的碎片。例如,每个存储量可能都比前一个存储量大 20%。在嵌入式系统中采用“一种存储量符合所有需要”对于嵌入式系统中的内存分配程序来说可能是不切实际的。这种方法从内部碎片来看是代价极高的,但系统可以彻底避免外部碎片,达到支持的最大存储量。
将相邻空闲内存块连接起来是一种可以显著减少内存碎片的技术。如果没有这一方法,某些分配算法(如最先适合算法)将根本无法工作。然而,效果是有限的,将邻近内存块连接起来只能缓解由于分配算法引起的问题,而无法解决根本问题。而且,当内存块存储量有限时,相邻内存块连接可能很难实现。
有些内存分配器很先进,可以在运行时收集有关某个系统的分配习惯的统计数据,然后,按存储量将所有的内存分配进行分类,例如分为小、中和大三类。系统将每次分配指向被管理内存的一个区域,因为该区域包括这样的内存块存储量。较小存储量是根据较大存储量分配的。这种方案是最先适合算法和一组有限的固定存储量算法的一种有趣的混合,但不是实时的。
有效地利用暂时的局限性通常是很困难的,但值得一提的是,在内存中暂时扩展共处一地的分配程序更容易产生内存碎片。尽管其它技术可以减轻这一问题,但限制不同存储量内存块的数目仍是减少内存碎片的主要方法。
现代软件环境业已实现各种避免内存碎片的工具。例如,专为分布式高可用性容错系统开发的 OSE 实时操作系统可提供三种运行时内存分配程序:内核 alloc(),它根据系统或内存块池来分配;堆 malloc(),根据程序堆来分配; OSE 内存管理程序 alloc_region,它根据内存管理程序内存来分配。
从 许多方面来看,Alloc就是终极内存分配程序。它产生的内存碎片很少,速度很快,并有判定功能。你可以调整甚至去掉内存碎片。只是在分配一个存储量后,使之空闲,但不再分配时,才会产生外部碎片。内部碎片会不断产生,但对某个给定的系统和八种存储量来说是恒定不变的。
Alloc 是一种有八个自由表的固定存储量内存分配程序的实现方法。系统程序员可以对每一种存储量进行配置,并可决定采用更少的存储量来进一步减少碎片。除开始时以外,分配内存块和使内存块空闲都是恒定时间操作。首先,系统必须对请求的存储量四舍五入到下一个可用存储量。就八种存储量而言,这一目标可用三个 如果 语句来实现。其次,系统总是在八个自由表的表头插入或删除内存块。开始时,分配未使用的内存要多花几个周期的时间,但速度仍然极快,而且所花时间恒定不变。
堆 malloc() 的内存开销(8 ~ 16 字节/分配)比 alloc小,所以你可以停用内存的专用权。malloc() 分配程序平均来讲是相当快的。它的内部碎片比alloc()少,但外部碎片则比alloc()多。它有一个最大分配存储量,但对大多数系统来说,这一极限值足够大。可选的共享所有权与低开销使 malloc() 适用于有许多小型对象和共享对象的 C++ 应用程序。堆是一种具有内部堆数据结构的伙伴系统的实现方法。在 OSE 中,有 28 个不同的存储量可供使用,每种存储量都是前两种存储量之和,于是形成一个斐波那契(Fibonacci)序列。实际内存块存储量为序列数乘以 16 字节,其中包括分配程序开销或者 8 字节/分配(在文件和行信息启用的情况下为 16 字节)。
当你很少需要大块内存时,则OSE内存管理程序最适用。典型的系统要把存储空间分配给整个系统、堆或库。在有 MMU 的系统中,有些实现方法使用 MMU 的转换功能来显著降低甚至消除内存碎片。在其他情况下,OSE 内存管理程序会产生非常多的碎片。它没有最大分配存储量,而且是一种最先适合内存分配程序的实现方法。内存分配被四舍五入到页面的偶数——典型值是 4 k 字节。

外部碎片和内部碎片的区别相关推荐

  1. 内部碎片和外部碎片的区别

    转自: 一.在内存上(使用连续分配算法来管理分配内存时会产生)的外部碎片和内部碎片两个概念 这几天一直看操作系统,看到内存的连续分配时,对于外部碎片和内部碎片时甚是不解: 内存碎片分为:内部碎片和外部 ...

  2. 内存碎片---内部碎片外部碎片

    内部碎片的产生:因为所有的内存分配必须起始于可被 4.8 或 16 整除(视处理器体系结构而定)的地址或者因为MMU的分页机制的限制,决定内存分配算法仅能把预定大小的内存块分配给客户.假设当某个客户请 ...

  3. 内部碎片和外部碎片的理解

    关于操作系统存储管理中的外部碎片和内部碎片的理解: 内部碎片: 固定分区存储管理会产生内部碎片 补充概念: 固定分区存储管理将主存发划分为系统区和用户区,系统区存放操作系统驻留代码和数据,用户区划分为 ...

  4. 反碎片化技术(外部碎片)的原理

    主要参考了<深入linux内核>和<Linux内核深度解析>,另外简单浅析了一下相关内容 文章目录 反碎片化技术(外部碎片) 虚拟可移动区域 使用方法 技术原理 解析内核引导参 ...

  5. 50.什么是内部碎片?什么是外部碎片?

    碎片是指内存中不足以用来分配给其他进程的小空间. 内部碎片和外部碎片是在内存连续分配中产生的.内部碎片是因为固定分区分配方式,而外部碎片是由于动态分区分配产生的. 内部碎片:分配给作业的存储空间中未被 ...

  6. 操作系统内存管理之 内部碎片vs外部碎片

    "碎片的内存"描述一个系统中所有不可用的空闲内存.这些资源之所以仍然未被使用,是因为负责分配内存的分配器使这些内存无法使用.这一问题通常都会发生,原因在于空闲内存以小而不连续方式出 ...

  7. 什么是内部碎片和外部碎片?

    什么是内部碎片? 内部碎片就是已经被分配出去(能明确指出属于哪个进程)却不能被利用的内存空间: 内部碎片是处于区域内部或页面内部的存储块.占有这些区域或页面的进程并不使用这个存储块.而在进程占有这块存 ...

  8. 内部跳转(请求转发)和外部跳转(重定向)的区别?

    总结归纳要点: 1.内部跳转的时候实际上是通过服务器端将请求转发到另外的页面或者servlet中,这个时候跳转到的目标页面或者servlet可以获取到请求对象, 也可以获取到请求中的属性和参数.而外部 ...

  9. 内部表外部表的操作与区别

    内部表外部表 未被external修饰的表是内部表(managed table),被external修饰的是外部表(external table) 内部表操作 准备工作: 创建stu.txt 1,zs ...

  10. 操作系统物理内存管理

    这里写目录标题 连续分配管理方式 单一连续存储管理 分区式存储管理 固定分区 动态分区 伙伴系统 内存紧缩(内存碎片化处理) 覆盖技术 交换技术 覆盖与交换的比较 外部碎片和内部碎片的区别 内部碎片 ...

最新文章

  1. 考考你:输入数字,判定空格和回车
  2. vs2005格式化代码
  3. 几个数判断大小_许栩原创2020读书笔记2《魔鬼数学》:极小数的两倍仍然是极小数...
  4. 【Python】青少年蓝桥杯_每日一题_5.15_打印 99 乘法表
  5. 前端学习(2286):react之无状态组件
  6. 34tomcat设置默认页面
  7. 5.过滤器作为模板——1D 相关、Matlab互相关实战_1
  8. php 飞鹅云打印机_ThinkPHP飞鹅云打印接口
  9. 小米开源文件管理器MiCodeFileExplorer-源码研究(1)-2个模型Model
  10. 多元梯度下降法--machine learning
  11. irrlicht引擎:实现天龙八部的RPG换装
  12. 基金指数温度怎么算_指数温度计算方法
  13. 如何让计算机虚拟出多个桌面,多屏显示算什么?win10自带神技能,桌面秒变多屏幕,创建无上限...
  14. moment时区处理心得
  15. 一年之计在于春,一日之计在于晨, 一生之计在于勤,清晨起来修手机
  16. 三维重建方法--激光or视觉
  17. 火焰纹章16进制是怎么算_火焰是值得你的时间
  18. 教你制作第一个C++游戏!#1 引入
  19. 被修饰成单栋的倾斜摄影处理思路
  20. jquery点击图片放大效果

热门文章

  1. 黑苹果smbios机型选择_黑苹果注入三码洗白教程
  2. 【图像增强】基于matlab直方图均衡化图像增强【含Matlab源码 960期】
  3. OC门与OD门以及线与逻辑
  4. 计算机组成及工作原理课件,计算机组成与工作原理电子教案课件.ppt
  5. 【两步稀疏表示法】基于两步稀疏表示法的小波变换的图像重建算法的MATLAB仿真
  6. 2370. 最长理想子序列(每日一难phase2--day6)
  7. 批处理常用DOS命令简述
  8. eclipse查看代码git历史_Eclipse使用教程 : 利用Eclipse中git的插件来查看项目状态 - Break易站...
  9. 7. namp工具的基础了解
  10. .Net Framework 4.x 程序到底运行在哪个 CLR 版本之上