上一篇文章学了堆,栈以及静态存储区。它们实际上都是针对进程来说的。那么程序与进程有什么区别呢?
本文不细讲程序与进程。
1 程序与进程
1.1 什么是程序
写完的.c文件是源文件。也叫源代码。
将源代码编译后,会生成可执行文件程序(Linux下是.out,windows下是.exe)。这个文件就是程序。也叫作可执行代码。
比如下面的源代码对应的可执行文件的内容:
那么程序文件中,各个段的作用是什么?
- 堆和栈是在程序运行开始后才正式存在。是程序运行的基础
- .bss段存放的是未初始化的全局变量和静态局部变量(初始化为0的也算未初始化这里)
- .text段存放的是程序中的可执行代码
- .data段存放的是已经初始化了的全局变量和局部静态变量.
- .rodata段存放的是程序中的常量值。如字符串字面量。
上述图中,程序中的函数的局部变量是在程序运行开始后才在栈空间分配内存。那么在可执行文件中,局部变量是怎么记录的?
实际上在可执行文件中有一个符号表,这个符号表记录了所有符号(变量和函数名)的信息。当程序加载到内存的时候,加载器根据符号表里记录的关于局部变量的信息来为局部变量分配栈空间。
1.2 什么是进程
程序是可执行文件。那么将可执行文件加载到内存中去运行就形成了进程。进程的内存布局与可执行程序文件的布局的关系大致如下(不够细致,这里只是笼统的讲解它们的区别):
可以看到进程中是没有File Header字段的。
1.3 程序与进程的不同点
- 程序是静态的概念。表现形式为一个可执行文件
- 进程是动态的概念。由操作系统加载程序运行后变为进程
- 每个程序可以对应多个进程
- 每个进程只能对应一个进程
1.4 程序术语的对应关系
- 静态存储区通常指进程(或者程序也一样)中的:.data,.bss,段
- 只读存储区通常指进程中的:.rodata段
- 局部非静态变量所占空间为栈空间 .是进程里的
- 动态空间为堆中的空间 ,也是进程里的
- 程序的可执行代码存在于.text段。是只读的。
2 总结
- 熟练的区分程序与进程的一些概念。概念很容易说错。