进程内存分布--之理论知识
一个由C/C++编译的程序占用的内存分为以下几个部分 :
1、栈区(stack):由编译器自动分配释放 ,存放函数调用函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
2、堆区(heap):一般由程序员分配释放,如malloc 来分配的全局指针。若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。
3、全局区(静态区)(static):全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后有系统释放。
4、文字常量区 :常量字符串就是放在这里的。 程序结束后由系统释放。
5、程序代码区:存放函数体的二进制代码。
- 进程内存分布总结如下:
- - 程序段 (Text Segment):可执行文件代码的内存映射
- 程序代码在内存中的映射,存放函数体的二进制代码。
- 可执行代码、字符串字面值、只读变量
- - 数据段 (Data Segment):可执行文件的已初始化全局变量的内存映射
- 在程序运行初已经对变量进行初始化的数据。
- 已初始化且初值非0的全局变量和局部静态变量,全局静态变量,常量
- - BSS段 (BSS Segment):未初始化的全局变量或者静态变量(用零页初始化)
- 在程序运行初未对变量进行初始化的数据。
- 未初始化或初值为0的全局变量和静态局部变量
- - 堆区 (Heap) : 存储动态内存分配,匿名的内存映射
- 存储动态内存分配,需要程序员手工分配,手工释放.
- 注意它与数据结构中的堆是两回事,分配方式类似于链表
- - 栈区 (Stack) : 进程用户空间栈,由编译器自动分配释放,存放函数的参数值、局部变量的值等
- 存储局部、临时变量,函数参数
- 函数调用时,存储函数的返回指针,用于控制函数的调用和返回。
- 在程序块开始时自动分配内存,结束时自动释放内存,其操作方式类似于数据结构中的栈。
- 但不包括static声明的变量, static 意味着 在“数据段”中 存放变量
- - 映射段(Memory Mapping Segment):任何内存映射文件
- 内核将文件的内容直接映射到内存
- 内存映射是一种方便高效的文件I/O方式,所以它被用来加载动态库。创建一个不对应于任何文件的匿名内存映射也是可能的,此方法用于存放程序的数据。
- 该区域用于映射可执行文件用到的动态链接库。
Linux 对进程地址空间有个标准布局,地址空间中由各个不同的内存段组成 (Memory Segment),主要的内存段如下:图示如下: