堆区内存管理

引用侯捷老师内存管理ppt中相关内容

操作系统中一页的内存为4Kb,一段的内存为16B

1、malloc\free

malloc与free是库函数,主要为了兼容c,需要包含相应的头文件。malloc和free在申请和释放内存的时候需要知道处理的内存的大小,如malloc(100)就会从堆区中开辟出100个字节大小的内存,释放的时候也要给出分配的首地址和内存的大小。

如上图所示,每次从系统中申请1Mb的内存(一开始只是申请32Kb的实际内存也就是8页内存,剩下的都是虚内存,没有在磁盘中实际分配),这一块1Mb内存会分为32组(平均每一组又32Kb的内存大小),每一组的内存又分为64条链表(header中总共由32组大小为64bit的头来记录每一组中每一条链表是否有内存),起始的时候每一组中的32Kb内存均由8条大小为4kb的双头链表存储。每次需要从中分隔内存的时候分隔,然后再把剩余的内存挂到对应64条链表中去。(计算挂到哪一条链表,是将剩余的内存大小n/16+1,16b为一段的内存代下,就是需要挂的那条链表,需要注意的是大于1kb的内存都挂在第64条链表上)。

回收内存的时候,需要这一组所有的内存均已回收完(每一组的内存中会有一个头来记录分配和释放的次数,分配+1,释放-1,只有当该值为0的时候才锁门该组的内存均已回收)。同时内存并不是立刻就回收给系统的,需要同时有两组的内存均可回收的时候才会将其中一组的内存交还给系统,主要是防止内存的多吃释放和分配。

2、new\delete|new[]\delete[]

new\delete|new[]\delete[]是C++的操作符,而非库函数不需要引入头文件。对于类变量的new和new[],在执行的时候,会先调用operator new()或者operator new[]()分配空间,再执行其类的构造函数;delete和delete[]的时候也一样会调用operator delete()或者operator delete[]()释放空间,然后再逆序调用其析构函数。

new和new[]调用的时候不需要给出具体要分配的内存大小,其大小会有系统去计算得出。

new[]分配的地址的头四个字节用来描述分配的变量数组的大小。

3、allocator\dellocator

allocator\dellocator,会申请一块内存而非一个内存,当申请的单个变量的内存超过128字节的时候,调用malloc。否则看申请的变量的大小所对应当前的freelist(16个,8字节到8*16字节,往上补齐)的freelist[i]是否还有剩余的空间,如果有直接返回给申请的变量,如果没有就要去储备内存池中要内存。如果储备内存池中大小足够20个变量的大小,则直接拿出该大小,1个给变量,19个给freelist[i]。如果不够,且内存池中还有容量,如果够一个的话,先返回给变量,然后尽可能多的填补freelist[i];如果一个也不够或者没有容量的话则先将已有的容量给freelist[i](碎片化处理),然后再去申请剩余的内存,保证1个给变量,19个给freelist[i],20个留在储备内存池中。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yanzhe1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值