我是靠谱客的博主 酷酷夏天,最近开发中收集的这篇文章主要介绍进程的私有地址空间构成?,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

在这里插入图片描述
一个程序本质上都是由.bss段、.data段、.text段(此处忽略.init和.rodata)三个组成的。可以看到一个可执行程序在存储(没有调入内存)时分为代码段数据区未初始化数据区三部分。

.bss段(未初始化数据区):通常用来存放程序中未初始化的全局变量静态变量的一块内存区域。.bss段属于静态分配,程序结束后静态变量资源由系统自动释放。

数据段:存放程序中已初始化的全局变量的一块内存区域。数据段也属于静态内存分配。

代码段:存放程序执行代码的一块内存区域。这部分区域的大小在程序运行前就已经确定,并且内存区域属于只读。在代码段中,也有可能包含一些只读的常数变量(指.rodata)。

.text段和.data段在编译时已经分配了空间,而.bss段并不占用可执行文件的大小,它是由链接器来获取内存的。

.bss段的内容并不存放在磁盘上的程序文件中。其原因是内核在程序开始运行前将它们设置为0。需要存放在程序文件中的只有正文段和初始化数据段。

.data段则为数据分配空间,数据保存到目标文件中。数据段包含经过初始化的全局变量以及它们的值。.bss段的大小从可执行文件中得到,然后链接器得到这个大小的内存块,紧跟在数据段的后面(地址高于数据段),当这部分内存进入程序的地址空间后全部清零。包含.data段和.bss段的整个区段此时通常被称为“数据区”。

可执行程序在运行时又多出两个区域:栈区和堆区。

栈区:由编译器自动释放,存放函数的参数值、局部变量等。每当一个函数被调用时,该函数的返回类型和一些调用的信息就会被压栈,然后这个被调用的函数再为他的自动变量和临时变量在栈上分配空间。每调用一个函数一个新的栈帧就会被使用。栈区是从高地址位向低地址位增长的,是一块连续的内存区域,最大容量是由系统预先定义好的(Linux下通过ulimit -s命令可以查询),申请的栈空间超过这个界限时会提示溢出。用户能从栈中获取的空间较小。

堆区:用于动态分配内存,位于.bss和栈中间的地址区域。由程序员申请分配和释放。堆是从低地址位向高地址位增长,采用链式存储结构。频繁的malloc/free会造成内存空间的不连续,产生外部碎片。当申请堆空间时库函数是按照一定的算法搜索可用的足够大的空间。因此堆的效率比栈要低的多。

最后

以上就是酷酷夏天为你收集整理的进程的私有地址空间构成?的全部内容,希望文章能够帮你解决进程的私有地址空间构成?所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(27)

评论列表共有 0 条评论

立即
投稿
返回
顶部