在一个计算机系统中存在着多个进程,这些进程之间可能有逻辑上的关系,也可能没有逻辑上的关系。进程之间无论是否存在逻辑上的关系,由于它们都要共享或竞争一个计算机系统中的资源,所以不可避免地会互相发生作用。本节专门研究进程间的相互作用。
一、相关进程和无关进程
在一个多道程序系统中同时运行的并发进程通常有多个。在逻辑上具有某种联系的进程称为相关进程,在逻辑上没有任何联系的进程称为无关进程。并发进程相互之间可能是无关的,也可能是相关的。
如果一个进程的执行不影响其他进程的执行,且与其他进程的进展情况无关,即它们是各自独立的,则说这些并发进程的相互之间是无关的。显然,无关的并发进程一定没有共享的变量,它们分别在各自的数据集合上操作。
例如,为两个不同的源程序进行编译的两个进程,它们可以是并发执行但它们之间却是无关的。因为这两个进程分别在不同的数据集合上,为不同的源程序进行编译。虽然这两个进程可交叉地占用处理器为各自的源程序进行编译,但是,任何一个进程都不依赖另一 个进程。甚至当一个进程发现被编译的源程序有错误时,也不会影响另一个进程继续对自己的源程序进行编译,它们是各自独立的。
如果一个进程的执行依赖其他进程的进展情况,或者说,一个进程的执行可能影响其他 进程的执行结果,则说这些并发进程是相关的。
例如,有三个进程,它们分别是读数据进程、处理数据进程和打印结果进程。其中读数据进程每次启动磁盘读人一批数据并把读到的数据存储到缓冲区中;处理数据进程对存储在 缓冲区中的数据进行加工处理;打印结果进程把加工处理后的结果打印输出。这三个进程中 的每一个进程的执行都依赖另一个进程的进展情况,即只有当读数据进程把一批数据读完并 存入缓冲区后,处理数据进程才能对它进行加工处理;而打印结果进程要等数据加工处理好 后才能进行;也只有当缓冲区中的数据被打印结果进程取走后,读数据进程才能把读到的第 二批数据再存入缓冲区;如此循环,直至所有的数据都读入、处理过并打印输出。可见这三 个进程相互依赖、相互合作,它们是一组相关进程,共享着缓冲区中的数据资源。
二、与时间有关的错误
一个进程由于自身或外界的原因而可能被中断,且断点是不固定的。至于一个进程被中断后,哪个进程可以先运行,而被中断的进程在什么时候再去占用处理器等问题,则与进程调度策略有关。
进程执行的速度是不能由进程自身控制的。对于相关进程来说,可能有若干并发进程同 时使用共享资源,即一个进程一次使用未结束,另一进程也开始使用,形成交替使用共享资源。
例如,两个并发程序A和B共享一个公共变量n,程序A每执行一次循环都要作n= n + 1操作,程序B则在每一次循环中打印出n的值并将n重新置0。程序描述如下。
程序A:
while(true){
n = n+1;
};
程序B:
while(true){
print(n);
n = 0;
};
由于程序A和B的执行都以各自独立的速度向前推进,它们的语句在时间上可任意穿插或交叉执行,故程序A的n=n + 1操作可能在程序B的print(n)之后,而在n=0操作之前,也 可能在它们之后或它们之间(即n = n + l出现在print (n)之后,而在n=0之前),设在开始某个循环之前n的值为5,则对于上面三种情形,执行完一个循环后,打印机印出的值分 别为6, 5和5,而执行后的n值分别为0, 1,0。相同的程序在可能的三种情况下,分别产生了三组不同的结果,显然,这不是我们所希望的。产生了这种情形的根本原因在于:在并 发程序中共享了公共变量,使得程序的计算结果与并发程序执行的速度有关。这种错误的结 果又往往是与时间有关的(如上例中的三种情形,其结果时对时错,随执行速度的不同而 异),所以,把它称为“与时间有关的错误”。