笔者:YY同学
文章目录
内存区域由五部分组成:Text segment,Data segment,BSS,Stack 和 Heap。
Text segment(包含代码和常量)
- 只可读
- 运行期间不能更改值
- 只能存取一个固定的特值
- 通过地址/指针访问 (pointers)
Data segment(初始化的全局变量和静态变量)
- 程序运行时才分配内存
- 挨个存储(地址 +4 或 -4)
- 地址 size 不同,根据声明大小而定
- 全局 array 大小最大上限为 2G
- 在 32-bit Linux 系统中,用户空间地址(user-space addressing) 大约有 3GB, 1GB 给 kernel
BSS(未初始化的全局变量和静态变量)
- 程序运行时才分配内存
- 挨个存储(地址 +4 或 -4)
- 地址 size 相同
- 全局 array 大小最大上限为 2G
- 在 32-bit Linux 系统中,用户空间地址(user-space addressing) 大约有 3GB, 1GB 给 kernel
Stack(所有局部变量,所有函数参数,program 参数以及环境变量)
- 32-bit Linux 中 Stack 的大小是 10Mb
- 以 function 为界而不是 kernel,每当 function 调用时分配栈空间,当 function 返回时销毁栈空间
- 使用 push-pop-stack
- 局部变量动态大小
- 栈计算取决于参数数量、局部变量数量以及嵌套函数的数量
- 编译阶段无法评估栈大小(取决于 function 数量、用户输入、state 等条件)
- kernel 为栈保留足够空间
- 调用时把变量、参数等压入栈内,返回时将其取出
- Intel 处理器会把返回值存入寄存器 EAX,返回函数结果时读取寄存器内的值
- 当 main 函数 return 的时候,调用 exit() system call 结束程序
Heap(动态内存)
- 动态内存,由 malloc(stdlib.h)申请获得
- Dynamic: not defined at compile time
- Allocated: if you don’t raise your hands and ask for something, you will be allocated nothing
- malloc() 函数请求分配内存,开拓 heap 存储空间,其本质是调用 brk() system call 申请内存,但是 brk() 不知道具体需要申请多少(只管申请),brk() 本身也具备良好的缩放性
- free() 函数释放内存,压缩 heap 空间或者创建一个 free blocks 的 list
- allocates the space required by malloc(). But, it doesn’t care how malloc() uses the space
- 在 32-bit Linux 系统中,用户空间地址(user-space addressing) 大约有 3GB, 1GB 给 kernel