挑战408——操作系统(3)——进程与PCB

2019-07-14 12:40发布

class="markdown_views prism-github-gist"> 早期的计算机系统只允许一次执行一个程序,因此程序对系统拥有完全的控制权,能访问系统中所有的资源,而现代的操作系统允许多道程序同时调入内存并发执行,便要求对各种程序提供更加严格的控制和功能划分。这便产生了进程的概念。

程序的并发执行

多道程序的并发执行是指在内存中存放多道程序,它们在操作系统的控制下,在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不可以并发

程序并发的特点

  1. 间断性。程序并发时,它们共享系统中的资源或者为完成同一个任务相互合作,致使在并发当中形成某种制约关系(比如刚刚举的例子S4中的S3没有算出,S4的执行必须等待),所以并发进程具有“执行 - 暂停 - 执行”间断性活动。因此也叫制约性
  2. 失去封闭性。多道程序共享系统中某个资源,因而这些资源由多个程序改变,所以程序在执行期间容易受到其他程序的影响。(就看起来不是相互独立)。
  3. 不可再现性再现性是指程序被重复执行时,只要初始条件相同,那么执行结果必然相同。不可再现性当然就是说执行的结果会受到其他因素的影响。看下面一段代码:
s1 : n = n + 1; s2: printf(n); 假设一开始时,n = 5,如果按顺序执行,显然输出的结果为6,但是如果先执行的是S2(因为程序是并发的,S2可能执行的比较快),再执行S1,那么输出结果就是5.。