进程在内存中是什么样子?
加载到内存并执行的程序称为进程。简单来说,进程就是正在执行的程序。
创建程序时,它只是一些字节,作为被动实体存储在硬盘上。然后,当在 Windows 中双击程序或在命令行中输入可执行文件的名称时(例如 a.out 或 prog.exe),程序开始加载到内存中并成为一个活动实体。
让我们看一下每个内存段以及进程在内存中的样子:
图:内存中的进程
文本段 (TEXT)
进程不仅仅是程序代码,代码段被称为**文本段**。此内存段包含程序的可执行指令。它还包含常量、宏,并且是只读段,以防止意外修改指令。它也是可共享的,以便其他进程在需要时可以使用它。
数据段 (DATA)
下一个**数据段**内存段包含全局和静态变量,这些变量由程序员在程序执行之前初始化。此段不是只读的,因为变量的值可以在运行时更改。
例如,在 C 程序中:
#include<stdio.h> int b;//will be stored in data section int main(){ static int a; //will be stored in data section return; }
堆 (HEAP)
为了分配内存给那些**编译器**在程序执行前无法静态确定大小的变量(由程序员请求),需要动态分配内存,这在**堆**段中完成。它只能在运行时确定。它是通过对 malloc、calloc、free、delete 等的系统调用来管理的。一个 C 例子:malloc(2) 返回堆区域中 2 字节块的起始地址。
栈 (STACK)
进程通常还包括进程栈,其中包含临时数据,例如函数参数、返回地址和局部变量。在标准 x86 架构中,它向下增长到较低的地址,但在某些其他架构中,它可能向相反方向增长。图中显示栈的增长方向与堆相反,以避免重叠问题。此段用于存储程序中函数调用所需的所有数据。
栈指针寄存器跟踪栈顶,即当前进程使用了多少栈空间,并且每次将值“压入”栈时都会修改它。如果栈指针遇到堆指针,则可用空闲内存将被耗尽。
广告