内存碎片

内存碎片是针对于堆的
因为申请空间时还会提供头部信息空间和越界标记空间,所以在反复申请小空间时,其申请的堆空间的使用比例较小,且容易内存的碎片问题。
本来申请的是一块4K大小连续的空间,你申请小空间,或收缩空间,则会将大块空间切割成为小空间,不连续了。那么下次申请时。还要进行检测这块小空间够不够你用,才能给你。

操作系统为堆维护一个记录空闲内存地址的链表(空闲链表)。当系统收到程序的内存分配申请时,会遍历该链表寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删除,并将该结点空间分配给程序。若无足够大小的空间(可能由于内存碎片太多),有可能调用系统功能去增加程序数据段的内存空间,以便有机会分到足够大小的内存,然后进行返回。大多数系统会在该内存空间首地址处记录本次分配的内存大小,供后续的释放函数(如free/delete)正确释放本内存空间。

此外,由于找到的堆结点大小不一定正好等于申请的大小,系统会自动将多余的部分重新放入空闲链表中(由会造成内存碎片)。

可见,堆容易造成内存碎片;由于没有专门的系统支持,效率很低;由于可能引发用户态和内核态切换,内存申请的代价更为昂贵。所以栈在程序中应用最广泛,函数调用也利用栈来完成,调用过程中的参数、返回地址、栈基指针和局部变量等都采用栈的方式存放。所以,建议尽量使用栈,仅在分配大量或大块内存空间时使用堆。

外碎片和内碎片
内部碎片是由于分配的块不仅仅只是有效荷载,还有头部和尾部信息,且必须进行对齐,所以一般情况下都会存在内部碎片,是必须的消耗。

外部碎片是由于分配器管理的内存,总量上有足够的空间来分配当前需要的空间,而找不到一块能容纳当前块大小的空闲块,此时只能进行brk调动系统调用来申请一块更大的堆空间给进程,但这样会导致堆空间利用率降低,且外部碎片是对于未来的,所需要使用的块大小决定的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值