Linux系统编程:(3)进程内存分配

本文详细介绍了Linux系统编程中关于进程内存分配的知识,重点讲解了堆内存分配,包括brk()和sbrk()系统调用、malloc()和free()的功能以及内存管理策略。同时提到了栈内存分配,特别是alloca函数的工作机制。
摘要由CSDN通过智能技术生成

一、堆内存分配

进程在运行期间可以通过增加堆(heap)的大小来为进程分配内存,在进程的内存布局中,堆是一段大小可变的连续虚拟内存,始于BSS段的末尾,随着内存的分配和释放而增减。和栈有自己的指针指向栈顶一样,堆也有指向堆边界的“program break”。
在这里插入图片描述

1.调整program break:brk()和sbrk()
改变堆的大小(即分配或释放内存),其实就像命令内核改变program break位置一样简单,最初,program break与BSS段末尾重合,在program break抬升后,程序可以访问新增内存的任何地址,而此时物理内存页尚未分配,在首次访问该内存时,引发页面错误后会自动分配内存物理页

这里有个问题,上面为什么没有说是调用malloc函数后program break抬升呢?因为,malloc调用后,program break不一定改变,这个就要从malloc和free说起,因为free掉一块内存时,内核大多时候会将其保存在一个空闲内存列表中,后续再有malloc来申请内存,先看空闲内存列表中有没有满足的内存,如果有就直接分出去,如果没有,就在去堆新申请,然后program break就改变了。

两个操纵program break的系统调用:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值