我们以”HelloWorld.c”这个最简单的c语言程序为例来给大家介绍到底什么是进程。
程序就是最简单的”HelloWorld.c”,我们想要运行它,执行”gcc HelloWorld.c -o HelloWorld”之后,再./HelloWorld,屏幕上就会显示”Hello World!”的输出了,现在我们将这个过程细化,我们知道一个c语言程序的执行过程分为以下几步:预处理->编译->汇编->链接。其实我们可以通过gcc不同的参数来一步步执行:
gcc -E HelloWorld.c -o HelloWorld.i 这一步是预处理的过程,生成HelloWorld.i文件,我们”cat HelloWorld.i”,在它的好几百行代码的最后可以发现我们写的短短几行代码,实际上预处理的过程会将头文件”stdio.h”用文件内容替换,并且替换#define定义的数据,去掉我们代码中注释的部分,并且还会做一些对齐工作。
gcc -S HelloWorld.i -o HelloWorld.s 这一步是编译的过程,编译生成的是汇编代码,由编译器完成。
gcc HelloWorld.s -o HelloWorld.o 这一步会将汇编代码解释成机器指令,并且把这些指令打包成一种叫做”可重定位目标程序”的格式。最后我们的HelloWorld.o和printf.o被链接器链接生成我们的可执行文件HelloWorld。
现在我们已经有了可执行文件HelloWorld文件,等到它被加载到内存中,到了CPU分配给它的时间片,就会被CPU执行,CPU从内存中取得数据,通过总线来传递,而我们程序执行的过程就是进程,所以进程是一个程序执行过程中的实例,说到这里,有没有对”程序”和”进程”的概念有一点区分,一个程序可以创建多个进程,并且许多进程运行的可以是一个程序,由此我们也可以说进程是内核定义的抽象的实体,该实体会被分配用以执行程序的各项系统资源,我们可以把进程看做由两部分构成,一部分是我们用户状态的代码,代码使用的变量等,一部分是内核为我们维护的进程的状态信息。我们可以在/proc目录下查看到我们系统当前运行的进程目录,由不同的进程ID区分。正是有进程这个概念,才让我们的计算机”看起来”有同时处理多个任务的能力。