C/C++进阶之进程空间(二)

进程空间

首先认识进程和程序的区别
1、程序:源文件经过编译,生成可执行文件,一般window下是*.exe文件,linux下是a.out。程序是静态的。程序包含3个区域,text,inial data, uinial data。
2、进程:被操作系统加载到内存至运行结束的过程。进程是动态的。进程包含5个区域,text,inial data, uinial data,heap,stack。
通过下面这这张图可以更清晰的认识,进程和程序的区别。

C/C++进阶之进程空间(二)_第1张图片

接下来是分析进程空间简概图
1、图片标注的0-4G指的是操作系统分配给进程空间的虚拟内存大小,虚拟内存会通过内存管理单元(MMU)映射到实际的物理内存单元。
2、进程空间的每个段存储的内容详解看下一张图。

C/C++进阶之进程空间(二)_第2张图片

C/C++进阶之进程空间(二)_第3张图片

以一个实例解析变量在进程空间的存储区域
全局变量和静态变量,如果赋初始值,存储在data的inial的rw区域,放在.exe文件里面。如果没有赋初始值,存储在data的uninial的bss区,当 .exe被执行时,会调用命令将全局变量和静态变量初始化为0。
局部变量压栈。
全局变量的生命周期和main函数一样长。
静态变量只初始化一次。

C/C++进阶之进程空间(二)_第4张图片


函数压栈与出栈

通过图1、2、3进行形象解释
图1左边表示的是主函数会调用fa()函数,fa()函数会调用fb()函数,右边表示进程空间压栈情况
首先,将系统运行状态压栈,然后将返回地址压栈;
然后将main函数参数压栈,此时要先保存main函数运行状态,得到返回地址后才能把fa参数压栈;
fa调用fb时和main调用fa时同理

图1
C/C++进阶之进程空间(二)_第5张图片

图2解析
图2表示fb调用完后要出栈,fb所包含的内容会被清空
图3表示的是最终状态就是main运行结束后的状态。
根据进程调用压栈过程,很容易明白mn的值没有进行交换的原因,因为swap压栈后创建的a b变量压栈,ab交换后,swap执行结束出栈,ab的值也会跟着消失,所以mn的值并没有进行交换。

void swap(int a,int b)
{
    int temp = a;
    a =  b;
    b = temp;
}
void main(){
    int m = 1;
    int n = 2;
    swap(m,n);
    printf("%d %d",m,n);
}

图2
C/C++进阶之进程空间(二)_第6张图片
图3
C/C++进阶之进程空间(二)_第7张图片

你可能感兴趣的:(C语言,进程空间,函数压栈出栈)