1. 程式人生 > >挑戰408——作業系統(3)——程序與PCB

挑戰408——作業系統(3)——程序與PCB

早期的計算機系統只允許一次執行一個程式,因此程式對系統擁有完全的控制權,能訪問系統中所有的資源,而現代的作業系統允許多道程式同時調入記憶體併發執行,便要求對各種程式提供更加嚴格的控制和功能劃分。這便產生了程序的概念。

程式的併發執行

多道程式的併發執行是指在記憶體中存放多道程式,它們在作業系統的控制下,在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.。