程序的内存布局
一个程序运行时的进程,都会被分配一块虚拟内存空间,虚拟内存空间再映射到内存中。程序可访问的虚拟内存空间的大小由CPU的位数决定,针对32位的系统最大可访问空间为4GB。 内存空间包含几个部分: 栈、堆、可执行文件映像、保留区。当然4GB不是全部分配给程序使用的,linux一般会把高1GB地址分配给系统内核,低3GB为用户进程空间。
- 栈:用户进程空间的最高位, 用于维护函数调用的上下文,一般只有几MB大小, 从高往低增长
- 堆:用于存储应用程序动态分配的内存, 一般有几百MB大小, 从低往高分配
- 可执行文件映像: 用于加载可执行文件映射,可执行文件各个段就在这里, 包含代码段、全局变量等
- 保留区:一般是为了保护内存禁止访问的区域,比如很低的地址
用户空间除了堆和栈,还存在一个动态链接库的映射区域。
栈
栈用来保存函数运行期间使用的一些寄存器、变量和地址。维护函数调用顺序
栈的调用惯例,指的是约定的参数传递顺序、栈的维护方式、函数修饰、函数返回值的回传方式约定。
堆
堆用于程序中动态分配地址,栈在函数运行完毕后,地址会被释放,而全局变量不好动态的分配地址,所以有了堆。堆可以分配的地址为用户空间中剩余的大小。32位的话,一般不超过2.9GB吧, 可以自行计算一下, 堆需要连续的地址。
linux使用2种系统调用分配堆空间, brk、mmap。 brk的作用就是设置数据段终止地址。mmap申请一块虚拟地址,并且映射到文件。使用mmap的方式申请地址, 可申请大小还受到系统剩余可使用内存大小和剩余磁盘交换空间的大小限制。
内存分配算法:空闲链表法、位图法。
行动,才不会被动!
欢迎关注个人公众号 微信 -> 搜索 -> fishmwei,沟通交流。