程序在并发执行时,由于它们共享系统资源,以及为完成同一项任务而相互合作,这些并发执行的程序之间形成了相互制约的关系。
如图所示I、C、P是三个互相合作的程序。当计算程序Ci-1完成计算时,如果输入程序Ii尚未完成数据输入,,则计算程序Ci就无法进行数据处理,此时必须暂停执行。
系统中存在多个可以并发执行的程序时,系统中的各种资源将为它们所共享,而这些资源的状态也会由这些程序来改变,致使其中任一程序在执行时,其执行环境必然会受到其他程序的影响。
程序并发时,失去封闭性会导致失去可再现性。
例如程序A和B,共享变量N。
// 程序A
N = N +1;
// 程序B
printf("%d",N);
N = 0;
执行种可能有几种结果
A程序在B之前执行
N = n+1
输出N = n+1
N = 0
B在A前
输出N = n
N = 0
N = 1
N+1在printf和N=0之间执行
输出N = n
N = n+1
N = 0
多道程序环境下,程序的执行属于并发执行,因此它们会失去封闭性,并具有间断性和运行结果不可再现性。
通常,程序是不能参与并发执行的,否则程序就失去了意义。
为了使得程序可以并发执行,并且可以对并发执行的程序加以描述和控制,所以人们在OS中引入了“进程”这个概念。
Process Control Block
系统利用进程控制块来描述进程的基本情况和活动过程,进而控制和管理进程,是进程存在的唯一标识。
从不同的角度可以有不同的定义
引入进程的概念后,我们可以把传统OS中的进程定义为:
进程是程序的执行过程,是系统进行资源分配和调度的一个独立单位。
进程和程序是不同的概念,除了进程具有程序所没有的PCB结构外,还具有下面一些特征:
进程的实质是程序的执行过程。
进程有一定的生命期:进程由创建产生,由调度而执行,由撤销而消亡。
多个进程共存于内存中,且能在一段时间内同时执行。
引入进程也正是为了使进程能和其他进程并发执行。
而没有建立PCB的程序是不能参与并发执行的。
进程是一个能够独立运行、独立获取资源、独立接收调度的基本单位。
没有建立PCB的程序都不能作为一个独立的单位参与并发执行。
进程按各自独立的、不可预知的速度向前推进。
总结:程序经过多次执行后,虽然多次执行时的环境和初始条件相同,但得到的结果却各不相同。
由于多个进程在并发执行时需要共享资源,它们会在执行过程中呈现间断性规律,因此,进程在其生命周期内可能具有多种状态。
此时进程已分配到除CPU以外的所有必要资源,只要获得CPU后,便可立即执行。
如果系统中有多个就绪进程,通常它们按照一定的策略*(e.g. 优先级策略)排成队列,则该队列就成为就绪队列*。
在单处理系统中,只有一个进程处于执行状态。
多处理机系统中,则可能会有多个进程处于执行状态。
由于发生某事件*(e.g. I/O请求、申请缓冲区失败)而暂时无法继续执行,即进程的执行收到了阻塞。
此时会引发进程调度,OS会把处理机分配给另一个就绪进程,而让受阻进程处于暂停状态(又称阻塞状态、等待状态或封锁状态)。
通常系统会将阻塞状态的进程排成一个队列,则该队列就成为阻塞队列*。
在较大的系统中,为了减少阻塞队列的操作开销,提高系统效率,则会设置多个阻塞队列。
为满足PCB对数据与操作的完整性要求和增强管理灵活性,则通常会引入这两种状态。
进程进程一般要通过多个步骤才能完成
如果进程所需的资源不足,此时进程将不能被调度运行,此时进程所处的状态称为创建状态(新建状态)。
进程进入终止状态后,OS中依然会保留一个记录,保存状态码和一些计时统计数据以供其他进程收集。
终端用户发现自己的程序在运行时有可疑问题,希望暂停程序运行,以便用户研究其执行情况或对其进行修改。
父进程有时候需要考察和修改子进程,协调各子进程间的活动。
实时系统工作负荷较重时,可能会影响到对实时任务的控制,系统可以将不重要的进程挂起,保证自身的运行正常。
OS有时需要挂起进程,以便检查进程运行过程中资源使用情况或进行记账。

相互通信的进程通过共享某些数据结构或存储区来进行通信,可分为
利用共享文件来实现进程间的通信。
进程间的消息交换以消息或报文为单位,程序员利用一组通信**命令(原语)**来实现通信,可分为
拥有资源所有权的称为进程,而调度的最小单位称为线程,或轻量级进程。
进程是资源独立占有的单位。