共计 528 个字符,预计需要花费 2 分钟才能阅读完成。
当我们执行一个程序时,程序体有序的排列在内存里。首先,操作系统在内存中为程序运行创建地址空间,地址空间包含实际的程序指令和需要的数据。
操作系统在创建地址空间后,把程序的可执行文件加载到新创建的地址空间里,程序(可执行文件)一般包含三种类型的段:.text .bss 和.data。.text 段在内存中被映射为只读,.data 和.bss 被映射为可写。全局变量一般保存在.bss 和.data 段里。.data 段包含静态初始化的数据,.bss 段包含未初始化的数据,.text 段包含程序指令。
加载完程序后,系统紧接着就开始为程序初始化 “ 栈 ” 和 “ 堆 ”。栈是一种 “ 后进先出 ” 的数据结构,即最后入栈的数据将第一个从栈顶移走。栈比较适合保存暂时性的信息,即不需要长期保存的信息。栈用于保存局部变量、函数调用信息以及其它调用函数后系统通常会清除的信息。
栈的另外一个重要牲是它的地址空间 “ 向下减少 ”,也就是说,栈上保存的数据越多,地址值就越小。
堆是另外一种保存程序信息的数据结构,更准确的说法是,它保存程序的动态变量。堆是 “ 先进先出 ” 的数据结构,允许在 “ 堆 ” 的一端插入数据,从另一端移走数据。堆的地址空间是 “ 向上增长 ” 的,即堆上保存的数据越多,堆地址的值就越大,这一点和栈正好相反。
