1、什么是程序?
程序:程序(Program)是一个静态的命令集合,程序可以作为目标存储在磁盘中。在它不执行的时候,它只占用存储,仅仅是一些代码和数据。
2、什么是进程?
进程:进程(Process)是执行中程序的一个具体实例,是操作系统对一个正在运行的程序的一种抽象。
从程序员角度来讲,可以认为进程总是处于下面三种状态之一:
运行:进程要么在CPU上执行,要么在等待被执行且最终会被执行。
停止:进程的执行被挂起(suspend),且不会被调度。当收到SIGTOP、SIGSTP或者SIDTTIN信号时,进程就停止,并且保持停止直到它收到一个SIGCONT信号,这个时刻,进程再次开始运行。
终止:进程永远地停止了。进程会因为三种原因终止:1)收到一个信号,该信号的默认行为是终止进程,2)从主程序返回,3)调用exit函数。
进程给人一种假象,当一个程序在系统上运行时,好像系统只有这个程序在运行,看上去只有这一个程序在使用处理器、主存和I/O设备。一个CPU看上去是并发的执行多个进程,其实这也是一种假象。一个系统中可以同时运行多个进程,但是,在任何一个时刻,单处理器系统都只能执行一个进程的代码。
上边这段话的理解可以从进程的状态和进程的上下文切换机制去解释,上边进程的状态中提到了进程的运行,进程在运行的时候其实也是分为两种,一种是在CPU上执行,另一种是等待被执行。也就是说,一个进程在运行的时候是可以暂停的。这样来理解上边那一段话就很简单,CPU可以并发执行多个进程,但是执行一个进程的时候其他的进程处于等待的状态,如果需要执行其他的进程可以暂停现在正在进行的进程切换到要执行的进程上去,这也就是操作系统中实现交错执行的机制,也叫做上下文切换。下图是示例hello程序运行场景的基本理念。
示例中有两个并发进程,外壳进程和hello进程,不好理解外壳进程的话,我们可以类比shell进程是这个外壳进程。我们用过linux操作系统的都知道一开始只有shell进程在运行,等待命令行上的输入。当我们运行hello程序的时候,通过调用一个专门的函数,也就是系统调用,来执行我们的请求,然后系统调用会把控制权交给操作系统,操作系统会保存shell进程的上下文,然后将控制权传递给hello进程。Hello进程终止之后,操作系统恢复外壳进程的上下文,外壳进程等待下一个命令行输入。
进程与程序的关系:进程是一个随时都可能发生变化的、动态的、使用系统运行资源的程序。而程序可以启动多个进程,程序总是运行在某个进程的上下文中。