精华内容
下载资源
问答
  • 内存碎片产生原因

    2019-08-27 15:27:21
    原文地址:https://blog.csdn.net/csdn_kou/article/details/82891141(这里备注...1. 内部碎片是由于采用固定大小的内存分区,当一个进程不能完全使用分给它的固定内存区域时就产生内部碎片,通常内部碎片难以完...

    原文地址:https://blog.csdn.net/csdn_kou/article/details/82891141(这里备注下:可能上面还有一个原文链接,是csdn转载的文章类型自动加上去的,这里保持习惯吧。)

    以下是正文:

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

    1. 内部碎片是由于采用固定大小的内存分区,当一个进程不能完全使用分给它的固定内存区域时就产生了内部碎片,通常内部碎片难以完全避免;
    2. 外部碎片是由于某些未分配的连续内存区域太小,以至于不能满足任意进程的内存分配请求,从而不能被进程利用的内存区域。

      现在普遍采用的段页式内存分配方式就是将进程的内存区域分为不同的段,然后将每一段由多个固定大小的页组成。通过页表机制,使段内的页可以不必连续处于同一内存区域,从而减少了外部碎片,然而同一页内仍然可能存在少量的内部碎片,只是一页的内存空间本就较小,从而使可能存在的内部碎片也较少。

    解决办法:

    首先,使用最原始的标记分配方法,系统需要维护一个简单的内存信息表:

    当程序申请一个长度为3的内存空间后:

    当程序再申请一个长度为2,以及长度为4的内存空间后:

    此时,只剩1个可用空间。如果这时程序再来申请长度大于1的空间,就申请不了,也就是内存不够。

    现在,释放掉ID=2的空间:

    我们发现,现在可用内存空间为3,但是,这3个空闲空间,并不是连续的。所以,如果程序现在申请长度为3的内存空间,同样会申请不了,会出现内存不够。业界把这种情况,称之为【内存碎片】。

    明明剩余有3个空间,却申请不了3个内存空间,这TMD扯蛋?

    于是,工程师们,发明了基于页面的内存管理方式:

    首先,把物理内存,按照某种尺寸,进行平均分割。比如我现在以2个内存单位,来分割内存,也就是每两个连续的内存空间,组成一个内存页:

    接着,系统同样需要维护一个内存信息表:

    现在,程序申请长度为3的内存空间,不过由于现在申请的最小单位为页面,而一个页面的长度为2,因此现在需要申请2个页面,也就是4个内存空间。你看,这就浪费了1个内存空间。

    接着,程序再申请长度为1,长度为2的空间:

    释放掉ID=2,内存页ID为3的那条内存空间信息:

    现在,就出现了之前的情况:目前一共有4个内存空间,但是不连续。不过,因为现在是分页管理机制,因此,现在仍然可以继续申请长度为4的内存空间:

     

    这种方案是不是爽得多?没有碎片,能够尽量地全部用完空间。但仔细想想,这种优势背后,也是需要付出大量代价的。

    前面那种内存分配方式,虽然容易出现碎片,并且内存空间的利用率低,但是使用性能高,程序能直接从内存信息表获取内存地址,接着就可以直接按照地址来使用内存空间了。

    但下面这种分页的方式,程序需要记录的是内存页ID,每次使用时,需要从内存页ID翻译成实际内存地址,多了一次转换。而且这种模式,会浪费一些内存,比如上面申请3个内存空间,实际分配了2个页面共4个内存空间,浪费了1个内存空间。

    以上就是基本原理,实际系统中会做非常多的优化。目前各种主流操作系统都是分页的方式,因此你不需要太关心碎片。

    这个话题再延伸下去,就是一个程序内部的局部内存池了。不过这是另一个问题,喜欢的话可以深究一下。

     

     

     

     

     

    展开全文
  • 内存碎片产生原因及解决办法

    万次阅读 2018-09-28 22:42:47
    内部碎片是由于采用固定大小的内存分区,当一个进程不能完全使用分给它的固定内存区域时就产生内部碎片,通常内部碎片难以完全避免;   2. 外部碎片是由于某些未分配的连续内存区域太小,以至于不能...
    来源:知乎
    链接:https://www.zhihu.com/question/51836333/answer/145693402

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

      1. 内部碎片是由于采用固定大小的内存分区,当一个进程不能完全使用分给它的固定内存区域时就产生了内部碎片,通常内部碎片难以完全避免;

      2. 外部碎片是由于某些未分配的连续内存区域太小,以至于不能满足任意进程的内存分配请求,从而不能被进程利用的内存区域。

      现在普遍采用的段页式内存分配方式就是将进程的内存区域分为不同的段,然后将每一段由多个固定大小的页组成。通过页表机制,使段内的页可以不必连续处于同一内存区域,从而减少了外部碎片,然而同一页内仍然可能存在少量的内部碎片,只是一页的内存空间本就较小,从而使可能存在的内部碎片也较少。


    解决办法:

    首先,使用最原始的标记分配方法,系统需要维护一个简单的内存信息表:

    当程序申请一个长度为3的内存空间后:

    当程序再申请一个长度为2,以及长度为4的内存空间后:

    此时,只剩1个可用空间。如果这时程序再来申请长度大于1的空间,就申请不了,也就是内存不够。

    现在,释放掉ID=2的空间:

    我们发现,现在可用内存空间为3,但是,这3个空闲空间,并不是连续的。所以,如果程序现在申请长度为3的内存空间,同样会申请不了,会出现内存不够。业界把这种情况,称之为【内存碎片】。

    明明剩余有3个空间,却申请不了3个内存空间,这TMD扯蛋?

    于是,工程师们,发明了基于页面的内存管理方式:

    首先,把物理内存,按照某种尺寸,进行平均分割。比如我现在以2个内存单位,来分割内存,也就是每两个连续的内存空间,组成一个内存页:


    接着,系统同样需要维护一个内存信息表:

    现在,程序申请长度为3的内存空间,不过由于现在申请的最小单位为页面,而一个页面的长度为2,因此现在需要申请2个页面,也就是4个内存空间。你看,这就浪费了1个内存空间。

    接着,程序再申请长度为1,长度为2的空间:


    释放掉ID=2,内存页ID为3的那条内存空间信息:

    现在,就出现了之前的情况:目前一共有4个内存空间,但是不连续。不过,因为现在是分页管理机制,因此,现在仍然可以继续申请长度为4的内存空间:


    这种方案是不是爽得多?没有碎片,能够尽量地全部用完空间。但仔细想想,这种优势背后,也是需要付出大量代价的。

    前面那种内存分配方式,虽然容易出现碎片,并且内存空间的利用率低,但是使用性能高,程序能直接从内存信息表获取内存地址,接着就可以直接按照地址来使用内存空间了。

    但下面这种分页的方式,程序需要记录的是内存页ID,每次使用时,需要从内存页ID翻译成实际内存地址,多了一次转换。而且这种模式,会浪费一些内存,比如上面申请3个内存空间,实际分配了2个页面共4个内存空间,浪费了1个内存空间。

    以上就是基本原理,实际系统中会做非常多的优化。目前各种主流操作系统都是分页的方式,因此你不需要太关心碎片。

    这个话题再延伸下去,就是一个程序内部的局部内存池了。不过这是另一个问题,喜欢的话可以深究一下。


    来源:知乎
    链接:https://www.zhihu.com/question/51836333/answer/145693402

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

    千次阅读 多人点赞 2018-05-05 20:44:01
    内部碎片产生:因为所有的内存分配必须起始于可被 4、8 或 16 整除(视处理器体系结构而定)的地址或者因为MMU的分页机制的限制,决定内存分配算法仅能把预定大小的内存块分配给客户。假设当某个客户请求一个43...

    内部碎片的产生:因为所有的内存分配必须起始于可被 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、在磁盘上,将文件分割成几块不相连的分片,这样不相连的分片叫做文件碎片,也即外部碎片。如果将文件分割成几块相连的分片,这样相连的分片则不是文件碎片。


    展开全文
  • 内部碎片是由于采用固定大小的内存分区,当一个进程不能完全使用分给它的固定内存区域时就产生内部碎片,通常内部碎片难以完全避免; 外部碎片是由于某些未分配的连续内存区域太小,以至于不能满足任意进程的内存...

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

    1. 内部碎片是由于采用固定大小的内存分区,当一个进程不能完全使用分给它的固定内存区域时就产生了内部碎片,通常内部碎片难以完全避免;
    2. 外部碎片是由于某些未分配的连续内存区域太小,以至于不能满足任意进程的内存分配请求,从而不能被进程利用的内存区域。
      现在普遍采用的段页式内存分配方式就是将进程的内存区域分为不同的段,然后将每一段由多个固定大小的页组成。通过页表机制,使段内的页可以不必连续处于同一内存区域,从而减少了外部碎片,然而同一页内仍然可能存在少量的内部碎片,只是一页的内存空间本就较小,从而使可能存在的内部碎片也较少。

    解决办法:

    首先,使用最原始的标记分配方法,系统需要维护一个简单的内存信息表:
    在这里插入图片描述
    在这里插入图片描述
    我们发现,现在可用内存空间为3,但是,这3个空闲空间,并不是连续的。所以,如果程序现在申请长度为3的内存空间,同样会申请不了,会出现内存不够。业界把这种情况,称之为【内存碎片】。

    明明剩余有3个空间,却申请不了3个内存空间,这TMD扯蛋?

    于是,工程师们,发明了基于页面的内存管理方式:

    首先,把物理内存,按照某种尺寸,进行平均分割。比如我现在以2个内存单位,来分割内存,也就是每两个连续的内存空间,组成一个内存页:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    这种方案是不是爽得多?没有碎片,能够尽量地全部用完空间。但仔细想想,这种优势背后,也是需要付出大量代价的。

    前面那种内存分配方式,虽然容易出现碎片,并且内存空间的利用率低,但是使用性能高,程序能直接从内存信息表获取内存地址,接着就可以直接按照地址来使用内存空间了。

    但下面这种分页的方式,程序需要记录的是内存页ID,每次使用时,需要从内存页ID翻译成实际内存地址,多了一次转换。而且这种模式,会浪费一些内存,比如上面申请3个内存空间,实际分配了2个页面共4个内存空间,浪费了1个内存空间。

    以上就是基本原理,实际系统中会做非常多的优化。目前各种主流操作系统都是分页的方式,因此你不需要太关心碎片。

    来源:知乎
    链接:https://www.zhihu.com/question/51836333/answer/145693402

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

    千次阅读 2019-05-20 22:00:10
    内部碎片产生:因为所有的内存分配必须起始于可被 4、8 或 16 整除(视处理器体系结构而定)的地址或者因为MMU的分页机制的限制,决定内存分配算法仅能把预定大小的内存块分配给客户。假设当某个客户请求一个43...
  • 什么是内部碎片和外部碎片?

    千次阅读 2021-02-04 09:22:40
    什么是内部碎片内部碎片就是已经被分配出去(能明确指出属于哪个进程)却不能被利用的内存空间; 内部碎片是处于区域内部或页面内部的存储块。占有这些区域或页面的进程并不使用这个存储块。而在进程占有这块存储...
  • 内部碎片和外部碎片的区别

    千次阅读 2018-08-09 10:48:15
    一、在内存上(使用连续分配算法来管理分配内存时会产生)的外部碎片和内部碎片两个概念   这几天一直看操作系统,看到内存的连续分配时,对于外部碎片和内部碎片时甚是不解:   内存碎片分为:内部碎片和外部...
  • 索引碎片实际上有2种形式:外部碎片和内部碎片。不管哪种碎片基本上都会影响索引内页的使用。这也许是因为页的逻辑顺序错误(即外部碎片)或每页存储的数据量少于数据页的容量(内部错误)。无论索引产生了哪种类型...
  • 外部碎片和内部碎片

    2018-10-22 22:53:04
     内部碎片,是由于存量信息容量与最小存储空间单位不完全相符而造成的空间碎片。还是沿用上面的例子,这次我们的6间仓库目前都是空置的,但是假设我们管理仓库的最小空间单位是间,今天运来了容量为2.5间仓库的货物...
  • 内部碎片 外部碎片

    千次阅读 2013-10-29 23:07:44
    内存碎片产生:  内存分配有静态分配和动态分配两种  静态分配在程序编译链接时分配的大小和使用寿命就已经确定,而应用上要求操作系统可以提供给进程运行时申请和释放任意大小内存的功能,这就是内存的动态...
  • 采用( B )不会产生内部碎片。 A、分页式存储管理 B、分段式存储管理 C、固定分区式存储管理 D、段页式存储管理 综述 内存管理主要包括:连续内存管理、分页、分段。 其中分页是不会产生外碎片的(很好理解,...
  • 操作系统内部碎片和外部碎片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,...
  • 这一问题通常都会发生,原因在于空闲内存以小而不连续方式出现在不同的位置。由于分 配方法决定内存碎片是否是一个问题,因此内存分配器在保证空闲资源可用性方面扮演着重要的角色。 internal fragmentation:when...
  • 内部碎片和外部碎片是在内存连续分配中产生的。内部碎片是因为固定分区分配方式,而外部碎片是由于动态分区分配产生的。 内部碎片:分配给作业的存储空间中未被利用的部分。 外部碎片:系统中无法利用的小存储空间。...
  • 内存分配和外部碎片和内部碎片

    千次阅读 2018-05-16 15:51:54
    外部碎片和内部碎片 外部碎片 随着进程装入和移出内存,空闲的内存空间被分为小片段,当所有的空闲的这些小片段的内存之和可以满足请求,但是并不连续的时候,这个时候就会出现外部碎片的问题,这个问题...
  • 内部碎片、外部碎片

    2019-09-29 02:53:52
    “碎片的内存”描述一个系统中所有不可用的空闲内存。这些资源之所以仍然未被使用,是因为负责分配内存的分配器使这些内存无法使用。这一问题通常都会发生,...内部碎片、外部碎片剖析 internal fragmentation:whe...
  • 在牛客网上刷题: 外部碎片( External Fragmentation )最严重的存储管理方式是() A、固定分区; B、可变分区; C、分页; D、分段。答案为B,并不明白,就整理了一下大牛的总结~ 感谢博主: ...
  • 外部碎片&内部碎片

    2021-08-08 16:51:16
    内部碎片 是处于操作系统分配的用于装载某一进程的内存区域内部的存储块。占有这些区域或页面的进程并不使用这个存储块。而在进程占有这块存储块时,系统无法利用它。直到进程释放它,或进程结束时,系统才有可能...
  • 内存碎片产生原因

    2020-09-27 18:50:06
    内部碎片产生原因在于因为分配的内存起始地址必须可被 4、8 或 16 整除,如申请7字节空间,可能会获得8或16字节空间,实际上多余的空间是不可使用的。 2.2 外部碎片 外部碎片指的是还没有被分配出去(不属于任何...
  • 内存碎片产生原因及处理技术

    千次阅读 2013-09-14 01:53:44
    一个不断产生内存碎片的系统,不管产生的内存碎片多么小,只要时 间足够长,就会将内存用完。这种情况在许多嵌入式系统中,特别是在高可用性系统中是不可接受的。有些软件环境,如 OSE 实时操作系统已经备有避免内存...
  • 内部碎片与外部碎片的小白理解: 内部碎片:  内部碎片是已经被分配出去却不能被利用的内存空间。例如我们在进行进程内存分配的时候,进程所占有的一部分存储块并没有被使用,但是由于进程的占用,使得系统无法...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 60,381
精华内容 24,152
关键字:

内部碎片产生的原因