多道程序的并发执行是指在内存中存放多道程序,它们在操作系统的控制下,在CPU上交替进行(因此我们前面说的是,宏观上程序并发执行,微观上轮流执行)。
在计算问题中,有些操作必须在其他操作之后完成,有些操作却可以并发执行。比如有下面的程序段:
S1: a = x + 2;
S2: b = y +3;
S3: c = a + b;
S4: d = c + 1;
其中,操作S3必须在a,b被赋值之后进行计算,但是S1和S2两者却可以并发进行,因为他们不会用到共有的一个变量。而S4又需要用到S3的值。这种结构我们在学习数据结构的图中遇到过,称为先决条件图。这里我们称这种关系为前驱图。这个程序的前驱图如下:
系统的吞吐量是指系统在单位时间内能完成的作业数量。显然多道程序设计能显著地提高系统的吞吐量和系统的执行效率。
程序并发的条件
从刚刚的分析中我们知道,并不是所有程序都是可以并发的,那么什么样的程序是可以并发的,或者说程序并发需要什么条件。
我们可以用Bernstein条件法判别:对于可以并发的两个程序S1和S2,Bernstein条件要求R(S1)∩W(S2)∪W(S1)∩R(S2)∪W(S1)∩W(S2)={}。这样给公式太抽象,我们举个例子:R(P)表示程序在执行过程中需要用到的变量的集合,称为读集。W§表示程序在执行期间要改变的量,称为写集。针对上面的代码我们可以得到这样的结论:
S1 : a = x + 1.这个语句中,x是要用到的量,并且我们没有改变它的值,所以它是读集元素,a因为改变了它的量,所以它是写集元素。当两个程序中读集元素和写集元素有重复的时候,即有交集,那么两者程序不能并发。容易看出S1 S2可以并发,S1 S3不可以并发