当前位置:网站首页>内存申请(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中寻找相应的页面。如果没有找到,则说明文件数据还没有读入内存,处理程序会从磁盘读入相应的页面,并返回相应地址,同时,进程页表也会更新
边栏推荐
猜你喜欢
随机推荐
MapReduce流程
mysql
1.RecyclerView是什么
2022最新交规记忆重点
VS2017中安装visual assist X插件
MySQL知识总结 (五) 锁
App signature in flutter
华为防火墙
宝塔面板搭建小说CMS管理系统源码实测 - ThinkPHP6.0
关于UDF
Cannot figure out how to save this field into database. You can consider adding a type converter for
加强版Apktool堪称逆向神器
vscode compiles the keil project and burns the program
存储系统Cache(知识点+例题)
国内IT市场还有发展吗?有哪些创新好用的IT运维工具可以推荐?
NDK报错问题分析方案(一)
标签加id 和 加号 两个文本框 和一个var 赋值
无人驾驶综述:摘要
RN开发时遇到的问题
2.RecyclerView基本使用