program break

作者: GGBond_8488 | 来源:发表于2021-03-06 16:13 被阅读0次

1.进程的内存分布布局

每个进程所分配的内存由很多部分组成,通常称之为段(segment)

  • 文本段:文本段包含了进程运行的程序机器语言指令。文本段具有只读属性,防止进程通过错误指针意外需修改自身指令。因为多个进程可同时运行同意程序,所以又将文本段设为可以共享,这样,一份程序代码的拷贝可以映射到所有这些进程的虚拟地址空间中。

  • 初始化数据段:包含显示初始化的全局变量和静态变量。当程序加载到内存时,从可执行文件中读取这些变量的值。

  • 未初始化数据段:包含未进行显示初始化的全局变量和静态变量。程序启动之前,将本段的所有内存初始化为0。将经过初始化的全局变量和静态变量与未经过初始化的全局变量和静态变量分开存放,其主要原因在于程序在磁盘上存储时,没有必要为未经初始化的变量分配空间。相反,可执行文件只需记录未初始化的数据段的位置及所需大小,直到运行时再有程序加载器来分配这一空间

  • 栈(stack)是一个动态增长和手速的段,有栈帧(statck frame)组成。系统会为每个当前调用的函数分配一个栈帧。栈帧中存储了函数的局部变量,实参和返回值。

  • 堆(heap)是可在运行时(为变量)动态进行内存分配的一块区域。堆顶端称作program break

2.

image.png

3. 在堆上分配内存

进程可以通过增加堆的大小来分配内存,所谓堆时一段长度可变的连续虚拟内存,始于进程的未初始化是数据段末尾,随着内存的分配和释放而增减,通常将堆的当前内存边界称为program break

改变堆的大小(即分配或释放内存),其实就像命令内核改变进程的program break位置一样。最初,program break正好位于未初始化数据段末尾之后,在program break位置抬升以后,程序可以访问新分配区域内的任何内存地址,而此时物理内存页尚未分配。内核会在进程首次试图访问这些虚拟内存地址时自动分配新的物理内存页。

相关文章

网友评论

    本文标题:program break

    本文链接:https://www.haomeiwen.com/subject/caujqltx.html