内存申请(malloc)和释放(free)之上篇

上一篇简单的介绍了进程内存寻址空间和内存分配,本篇主要详细介绍下内存的申请和释放

1.brk和sbrk

int brk(void * addr)

void * sbrk(intptr_t increment)

(1).brk()和sbrk()改变程序间断点的位置,程序间断点就是程序数据段的结尾

(2).增加程序间断点,申请有效内存,传参为addr,数据段结尾设置为addr

(3).sbrk()将程序数据空间增加increment字节

(4).内存的申请和释放均可以使用brk或者sbrk来操作

具体看一个例子:

(1).sbrk(0) 返回的是未开辟内存的地址(也是上一个开辟内存的结束位置),如上图中当前断点是0xe27000

(2).sbrk(max*max) 返回的地址是一开始申请内存的启始地址,也是0xe27000,但是此时已经申请内存大小为max*max

(3).sbrk(-max*max) 传递参数为负的,表示的是堆断点指针开始下移,释放内存。

内存开辟和释放通过 命令cat /proc/pid/maps 如下:

接下来 我们可以使用brk()函数来验证下内存的释放和开辟:

综述:

从上一篇进程的内存分布可知,.bss段之上的这块内存分配给用户的称之为堆(heap),sbrk指针指向heap堆的开始,brk指针指向heap堆的顶部,可以使用系统调用brk和sbrk来增加标识heap顶部的brk值,从而线性的增加分配给用户的heap空间。

2.mmap()分配内存

(1).映射磁盘文件到内存中

(2).匿名映射,面向映射区申请一块内存

主要是如下步骤:

(1).在用户虚拟地址空间寻找空闲的满足要求的一段连续虚拟地址空间,为映射做准备(mmap系统调用完成)

(2).建立虚拟地址和设备文件之间的物理映射关系(设备驱动完成)

(3).访问新映射的页面操作(缺页中断)

缺页中断主要是:进程调用 mmap()时候,只是在进程中新增加一块响应大小的缓冲区,并设置相应的访问标识符,但是没建立空间到物理页面的映射,因此第一次访问改空间时,会发生一个缺页异常。缺页异常措施:

(1).共享内存:缺页异常首先是在swap cache中寻找页目标,如果找到直接返回,如果没有找到,则判断该页面是否在swap区(swap area),如果存在,则执行交换操作。如果都没有找到,则程序开始分配新的物理页面,并插入page cache中,进程最终更新进程页面表。

(2).文件映射: 缺页异常处理程序首先会在page cache中寻找相应的页面。如果没有找到,则说明文件数据还没有读入内存,处理程序会从磁盘读入相应的页面,并返回相应地址,同时,进程页表也会更新

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值