精华内容
下载资源
问答
  • 而磁盘上的外部碎片(即平时所说的磁盘碎片,磁盘碎片清理工具只能清理磁盘上的外部碎片,清除不了磁盘上的内部碎片,除非改变文件系统的分配单位即簇的大小,使之是一个文件大小的整数倍。)实际上指的是一个文件...

    操作系统小课堂

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

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

    参考2

    展开全文
  • 内存碎片---内部碎片&外部碎片

    千次阅读 多人点赞 2018-05-05 20:44:01
    内部碎片的产生:因为所有的内存分配必须起始于可被 4、8 或 16 整除(视处理器体系结构而定)的地址或者因为MMU的分页机制的限制,决定内存分配算法仅能把预定大小...外部碎片的产生:频繁的分配与回收物理页面会导...

    内部碎片的产生:因为所有的内存分配必须起始于可被 4、8 或 16 整除(视处理器体系结构而定)的地址或者因为MMU的分页机制的限制,决定内存分配算法仅能把预定大小的内存块分配给客户。假设当某个客户请求一个43字节的内存块时,因为没有适合大小的内存,所以它可能会获得 44字节、48字节等稍大一点的字节,因此由所需大小四舍五入而产生的多余空间就叫内部碎片。

    外部碎片的产生:频繁的分配与回收物理页面会导致大量的、连续且小的页面块夹杂在已分配的页面中间,就会产生外部碎片。假设有一块一共有100个单位的连续空闲内存空间,范围是0~99。如果你从中申请一块内存,如10个单位,那么申请出来的内存块就为0~9区间。这时候你继续申请一块内存,比如说5个单位大,第二块得到的内存块就应该为10~14区间。如果你把第一块内存块释放,然后再申请一块大于10个单位的内存块,比如说20个单位。因为刚被释放的内存块不能满足新的请求,所以只能从15开始分配出20个单位的内存块。现在整个内存空间的状态是0~9空闲,10~14被占用,15~24被占用,25~99空闲。其中0~9就是一个内存碎片了。如果10~14一直被占用,而以后申请的空间都大于10个单位,那么0~9就永远用不上了,变成外部碎片。

    内部碎片

    内部碎片是已经被分配出去能明确指出属于哪个进程的内存空间大于请求所需的内存空间,不能被利用的内存空间就是内部碎片

    内部碎片是处于区域内部或页面内部的存储块。占有这些区域或页面的进程并不使用这个存储块。而在进程占有这块存储块时,系统无法利用它。直到进程释放它,或进程结束时,系统才有可能利用这个存储块。

    为了有效的利用内存,使内存产生更少的碎片,要对内存分页,内存以页为单位来使用,最后一页往往装不满,于是形成了内部碎片。
    由于被装入的数据块小于分区大小,从而导致分区内部有空间浪费,这种现象成为内部碎片。


    外部碎片

    外部碎片是指还没有分配出去不属于任何进程,但是由于大小而无法分配给申请内存空间的新进程的内存空闲块。

    外部碎片是出于任何已分配区域或页面外部的空闲存储块。这些存储块的总和可以满足当前申请的长度要求,但是由于它们的地址不连续或其他原因,使得系统无法满足当前申请。
    分区外的存储空间会出现很多不能使用的碎片。
    为了共享要分段,在段的换入换出时形成外部碎片,比如5K的段换出后,有一个4k的段进来放到原来5k的地方,于是形成1k的外部碎片。

    外部碎片示意图:

    内存碎片(内部碎片&外部碎片)

    产生内部碎片的情况:固定分区分配,页式虚拟存储系统

    产生外部碎片的请况:可变式分区分配,段式虚拟存储系统,动态分区分配

    碎片整理

    通过调整进程占用的分区位置来减少或避免分区碎片

    1. 紧凑(compaction) 通过移动分配给进程的内存分区,以合并外部碎片。紧凑的条件是:所有的应用程序可动态重定位。

    2. 分区对换(Swapping in/out) 通过抢占并回收处于等待状态进程的分区,以增大可用内存空间。


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

    很多人会把文件碎片跟簇的概念混淆起来。其实对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、在磁盘上,将文件分割成几块不相连的分片,这样不相连的分片叫做文件碎片,也即外部碎片。如果将文件分割成几块相连的分片,这样相连的分片则不是文件碎片。


    展开全文
  • 内部碎片和外部碎片的区别

    千次阅读 2018-08-09 10:48:15
    一、在内存上(使用连续分配算法来管理分配内存时会产生)的外部碎片和内部碎片两个概念   这几天一直看操作系统,看到内存的连续分配时,对于外部碎片和内部碎片时甚是不解:   内存碎片分为:内部碎片和外部...

    转自:

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

     

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

     

    内存碎片分为:内部碎片和外部碎片

    【内部碎片】

    内部碎片就是已经被分配出去(能明确指出属于哪个进程)却不能被利用的内存空间;

    内部碎片是处于(操作系统分配的用于装载某一进程的内存)区域内部或页面内部的存储块。占有这些区域或页面的进程并不使用这个存储块。而在进程占有这块存储块时,系统无法利用它。直到进程释放它,或进程结束时,系统才有可能利用这个存储块。

    单道连续分配只有内部碎片。多道固定连续分配既有内部碎片,又有外部碎片。

    【外部碎片】

    外部碎片指的是还没有被分配出去(不属于任何进程),但由于太小了无法分配给申请内存空间的新进程的内存空闲区域。

    外部碎片是处于任何两个已分配区域或页面之间的空闲存储块。这些存储块的总和可以满足当前申请的长度要求,但是由于它们的地址不连续或其他原因,使得系统无法满足当前申请。
    产生外部碎片的一种情况:

    举个例子,在内存上,分配三个操作系统分配的用于装载进程的内存区域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 字节。

    展开全文
  • 什么是内部碎片和外部碎片

    千次阅读 2021-02-04 09:22:40
    外部碎片指的是还没有被分配出去(不属于任何进程),但由于太小了无法分配给申请内存空间的新进程的内存空闲区域。 外部碎片是出于任何已分配区域或页面外部的空闲存储块。这些存储块的总和可以满足当前申请的长度...

    什么是内部碎片?

    内部碎片就是已经被分配出去(能明确指出属于哪个进程)却不能被利用的内存空间;

    内部碎片是处于区域内部或页面内部的存储块。占有这些区域或页面的进程并不使用这个存储块。而在进程占有这块存储块时,系统无法利用它。直到进程释放它,或进程结束时,系统才有可能利用这个存储块。

    什么是外部碎片?

    外部碎片指的是还没有被分配出去(不属于任何进程),但由于太小了无法分配给申请内存空间的新进程的内存空闲区域。

    外部碎片是出于任何已分配区域或页面外部的空闲存储块。这些存储块的总和可以满足当前申请的长度要求,但是由于它们的地址不连续或其他原因,使得系统无法满足当前申请。

    展开全文
  • 索引碎片实际上有2种形式:外部碎片和内部碎片。不管哪种碎片基本上都会影响索引内页的使用。这也许是因为页的逻辑顺序错误(即外部碎片)或每页存储的数据量少于数据页的容量(内部错误)。无论索引产生了哪种类型...
  • 内部碎片与外部碎片

    2020-07-16 09:23:47
    内部碎片与外部碎片 根据碎片出现的情况,可以将碎片分为内部碎片和外部碎片。内部碎片是指已经分配给作业但不能被利用的内存空间,外部碎片是指系统中还没有分配给作业,但由于碎片太小而无法分配给申请内存空间的...
  • 最近做题时忘了怎么区分内部外部碎片了,今天又想起来了于是记录一下。 把内存空间比作停车位,假如有专门给运货车提供的车位,即每辆大车可以占用连续个车位,这里有5个车位,某一天擎天柱来了,直接把中间的3个...
  • 碎片的内存”描述一个系统中所有不可用的空闲内存。这些资源之所以仍然未被使用,是因为负责分配内存的分配器使这些内存无法使用。这一问题通常都会发生,原因在于空闲内存以小而不连续方式出现在不同的位置。由于...
  • 操作系统内部碎片和外部碎片In a computer storage system, as processes are loaded and removed from memory, the free memory space is broken into small pieces. In this way memory space used inefficiently,...
  • 内部碎片和外部碎片

    千次阅读 2019-05-20 22:00:10
    内部碎片的产生:因为所有的内存分配必须起始于可被 4、8 或 16 整除(视处理器体系结构而定)的地址或者因为MMU的分页机制的限制,决定内存分配算法仅能把预定大小的...外部碎片的产生:频繁的分配与回收物理页面...
  • 外部碎片和内部碎片

    2018-10-22 22:53:04
    外部碎片,是由于大量信息由于先后写入、置换、删除而形成的空间碎片。  内部碎片,是由于存量信息容量与最小存储空间单位不完全相符而造成的空间碎片。还是沿用上面的例子,这次我们的6间仓库目前都是空置的,...
  • 在牛客网上刷题: 外部碎片( External Fragmentation )最严重的存储管理方式是() A、固定分区; B、可变分区; C、分页; D、分段。答案为B,并不明白,就整理了一下大牛的总结~ 感谢博主: ...
  • 内存分配和外部碎片和内部碎片

    千次阅读 2018-05-16 15:51:54
    随着进程装入和移出内存,空闲的内存空间被分为小片段,当所有的空闲的这些小片段的内存之和可以满足请求,但是并不连续的时候,这个时候就会出现外部碎片的问题,这个问题可能会很严重,这个就是外部碎片 ...
  • 内部碎片和外部碎片是在内存连续分配中产生的。内部碎片是因为固定分区分配方式,而外部碎片是由于动态分区分配产生的。 内部碎片:分配给作业的存储空间中未被利用的部分。 外部碎片:系统中无法利用的小存储空间。...
  • 内部碎片 外部碎片

    千次阅读 2013-10-29 23:07:44
    内存碎片的产生:  内存分配有静态分配和动态分配两种  静态分配在程序编译链接时分配的大小和使用寿命就已经确定,而应用上要求操作系统可以提供给进程运行时申请和释放任意大小内存的功能,这就是内存的动态...
  • 内部碎片、外部碎片

    2019-09-29 02:53:52
    “碎片的内存”描述一个系统中所有不可用的空闲内存。这些资源之所以仍然未被使用,是因为负责分配内存的分配器使这些内存无法使用。这一问题通常都会发生,...内部碎片、外部碎片剖析 internal fragmentation:whe...
  • 外部碎片&内部碎片

    2021-08-08 16:51:16
    外部碎片指的是还没有被分配出去(不属于任何进程),但由于太小了无法分配给申请内存空间的新进程的内存空闲区域。 外部碎片是处于任何两个已分配区域或页面之间的空闲存储块。这些存储块的总和可以满足当前申请的...
  • 内部碎片与外部碎片的小白理解: 内部碎片:  内部碎片是已经被分配出去却不能被利用的内存空间。例如我们在进行进程内存分配的时候,进程所占有的一部分存储块并没有被使用,但是由于进程的占用,使得系统无法...
  • 【操作系统】外部碎片和內部碎片

    千次阅读 2014-03-09 13:45:26
    碎片的内存”描述一个系统中所有不可用的空闲内存。这些资源之所以仍然未被使用,是因为负责分配内存的分配器使这些内存无法使用。这一问题通常都会发生,原因在于空闲内存以小而不连续方式出现在不同的位置。由于...
  • 碎片的内存”描述一个系统中所有不可用的空闲内存。这些资源之所以仍然未被使用,是因为负责分配内存的分配器使这些内存无法使用。这一问题通常都会发生,原因在于空闲内存以小而不连续方式出现在不同的位置。由于...
  • 此分配器旨在跨平台移植,并通过根据使用模式分解分配来尽可能地减少碎片。 设计的某些部分是从其他关于游戏引擎(如 MolecularEngine 和 BitSquid 引擎)的在线博客中借用的。 设计:从一个通用的 Allocator 基类...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 45,072
精华内容 18,028
关键字:

外部碎片