当前位置:网站首页>内存申请(malloc)和释放(free)之上篇
内存申请(malloc)和释放(free)之上篇
2022-08-02 14:07:00 【lq_fly_pig】
上一篇简单的介绍了进程内存寻址空间和内存分配,本篇主要详细介绍下内存的申请和释放
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中寻找相应的页面。如果没有找到,则说明文件数据还没有读入内存,处理程序会从磁盘读入相应的页面,并返回相应地址,同时,进程页表也会更新
边栏推荐
猜你喜欢
随机推荐
Manifest merger failed with multiple errors, see logs
1.RecyclerView是什么
VS Code无法安装插件之Unable to install because, the extension '' compatible with current version
加减法运算及其溢出处理
redis基础
利用红外-可见光图像数据集OTCBVS打通图像融合、目标检测和目标跟踪
getUserProfile接口不显示用户性别和地区
数据乱码问题—更改mysql字符编码
Must-know knowledge about disassembly
详解RecyclerView系列文章目录
国内IT市场还有发展吗?有哪些创新好用的IT运维工具可以推荐?
Handler你真的搞懂了吗?
LLVM系列第二十四章:用Xcode编译调试LLVM源码
记录Yolo-tiny-v4的权重提取和中间层结果提取
存储系统Cache(知识点+例题)
spark(standalone,yarn)
LLVM系列第二十章:写一个简单的Function Pass
6.如何使用CardView制作卡片布局效果
ConstraintLayout从入门到放弃
VS2017中安装visual assist X插件









