堆内存管理

                                        堆内存管理

**********************堆内存分配
我们c++中的new和delete都是调用c中的malloc和free来经行工作的因此malloc底层的行为方式就对于理解堆
来讲至关重要。(sbrk brk mmap munmap)为我们底层的几个系统调用
**sbrk&brk
小于128k的malloc会调用sbrk&brk,大于128k将会使用mmap&munmap
sbrk是c的库函数,而底层会调用brk(系统调用),数据段顶层(可以理解为虚拟空间堆的顶层)结尾有_edata指针。
sbrk函数的参数中有一个increase参数,这个参数如果正数我们就向后移动_edata指针,反之就是向前移动。当我们
低地址的数据先释放我们不会退回指针而是等待高地址释放了再同低地址一起退回相加字节数的_edata指针。如果期间
还有申请空间请求,brk会先看一下有没有已经释放的可用空间。如果有就安排这个已经释放的空间给它。其实这样做
也是内存碎片由来的根本原因。(我们要注意这里类似于写时拷贝,当我们申请空间没有初始值的时候我们是不给真实
物理内存的,当我们需要写数据的时候会发生页错误,这时候才会真正映射,而且linux限定是4096的倍数)
(当然我们brk()只能申请4k的整数倍,那么没有用到的空间会被管理起来,内存主要通过空闲列表、位图管理、内存池等)


**mmap()&munmap()(如上图)
mmap用来开辟内存而munmap用来释放内存。这里我们mmap映射的空间是在我们的dynamic libraries。在我们堆和
栈之间的一个位置。我们把它映射到物理内存上供我们进程使用。这个空间不会像brk,如果释放就断开映射了。
mmap一开始是给文件映射使用的,而我们如果对象不是文件我们就把他叫做一块匿名空间,匿名空间就供堆使用。
void*mmap(void *start,size_t length,int prot,int flags,int fd,off_t offset);
start是开始位置,length是长度,prot是可读写权限,flags是类型(文件&匿名)fd是文件描述符,offset是文件指针。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值