1.linux内存布局
原文链接:https://blog.csdn.net/yangkuanqaz85988/article/details/52403726
Linux 对进程地址空间有个标准布局,地址空间中由各个不同的内存段组成 (Memory Segment),主要的内存段如下:
- 程序段 (Text Segment):代码
- 数据段 (Data Segment):已初始化全局变量或者静态变量
- BSS段 (BSS Segment):未初始化的全局变量或者静态变量
- 堆区 (Heap) : 存储动态内存分配,匿名的内存映射
- 栈区 (Stack) : 进程用户空间栈,由编译器自动分配释放,存放函数的参数值、局部变量的值等
- 内存映射段(Memory Mapping Segment):mmap分配、动态库等
- 内核空间
参照:
关于static静态变量的理解以及C中的内存区的分配
https://blog.csdn.net/qq_26039331/article/details/52749970
2.线程栈、函数栈
从 Linux 内核的角度来说,其实它并没有线程的概念。Linux 把所有线程都当做进程来实现,它将线程和进程不加区分的统一到了 task_struct 中。
调用的基本过程,就演变记录一个栈指针的过程。每次函数调用的时候,都配套一个栈指针。即使循环嵌套调用函数,只要对应函数栈指针是不同的,也不会出现冲突。
即函数调用就是通过移动栈指针实现,函数栈上保存函数参数、返回地址、局部变量。
64位系统线程栈8M. 递归调用层次深了可能造成线程栈溢出。