蓝盟IT小贴士,来喽!
当然,所有进程(要执行的程序)都需要占用一定量的内存来存储从磁盘加载的程序代码,以及存储用户输入的数据。 然而,进程管理这些存储器的方法取决于存储器的用途,有些存储器是预先静态分配的,被一起收集,但有些是根据需要动态分配和收集的。
任何一般的过程都包含五个不同的段。 稍有编程知识的朋友可认为这些数据段中包含“程序代码段”、“程序数据段”、“程序堆栈段”等. 虽然这些数据段确实在其中,但流程除了包括这些数据段以外,还包括两个数据段。 下面简单地总结一下与进程对应的内存空间中包含的5种不同的数据区域。
代码段:代码段是一个用于存储可执行文件的操作命令,可执行程序镜像在内存中。 由于必须确保代码段在运行时不被未经授权地改变,所以写(改变)操作——不被允许,而不可写入。
分段:用于存储初始化为可执行文件的全局变量,即程序静态分配[1]的变量和全局变量。
BSS段[2]:BSS段包含未通过程序初始化的全局变量,BSS段全部被设置为零。
堆(heap ) :堆用于存储在进程执行期间动态分配的内存段,并且大小不固定,可以动态扩展或缩小。 当进程调用诸如malloc之类的函数来分配内存时,新分配的内存会动态地添加到堆中(扩展堆)。 使用诸如free之类的函数释放内存时,被释放的存储器被从堆栈中删除(减少堆栈)。
堆栈:堆栈是用户存储过程临时创建的局部变量,是在函数{}中定义的变量(不包括静态声明的变量,static表示将变量存储在数据段中)。 此外,在调用函数时,其参数也被推入开始调用的流程堆栈中,函数的返回值存储在堆栈中,直到调用结束。 由于堆栈的先进特征,堆栈特别便于调用现场的保存/恢复。 在这种意义上,堆栈可以被认为是存储和交换临时数据的存储器区域。
存在:进程分配的、加载到主存储器中的内存。 包含来自共享库的内存。 只要这些库占用的页面框在主内存中,就包含所有正在使用的堆栈和堆内存。 可以使用ps -o rss显示进程的内存大小。
内存:包含进程可以访问的所有内存,包括已被交换、已分配但未使用的内存,以及共享库中的内存。 可以通过ps -o vsz确认进程的可用容量。例如,如果进程a具有500K的二进制文件并链接到2500K的共享库,则有200K的堆栈/堆栈分配,100K实际上在存储器中(剩下的交换或未使用),实际上只加载1000K的共享库。
文/上海蓝盟 IT外包