挑戰408——作業系統(3)——程序與PCB
阿新 • • 發佈:2018-11-10
早期的計算機系統只允許一次執行一個程式,因此程式對系統擁有完全的控制權,能訪問系統中所有的資源,而現代的作業系統允許多道程式同時調入記憶體併發執行,便要求對各種程式提供更加嚴格的控制和功能劃分。這便產生了程序的概念。
程式的併發執行
多道程式的併發執行是指在記憶體中存放多道程式,它們在作業系統的控制下,在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)={}
S1 : a = x + 1.這個語句中,x是要用到的量,並且我們沒有改變它的值,所以它是讀集元素,a因為改變了它的量,所以它是寫集元素。當兩個程式中讀集元素和寫集元素有重複的時候,即有交集,那麼兩者程式不能併發。容易看出S1 S2可以併發,S1 S3不可以併發
程式併發的特點
- 間斷性。程式併發時,它們共享系統中的資源或者為完成同一個任務相互合作,致使在併發當中形成某種制約關係(比如剛剛舉的例子S4中的S3沒有算出,S4的執行必須等待),所以併發程序具有“執行 - 暫停 - 執行”間斷性活動。因此也叫制約性
- 失去封閉性。多道程式共享系統中某個資源,因而這些資源由多個程式改變,所以程式在執行期間容易受到其他程式的影響。(就看起來不是相互獨立)。
- 不可再現性。再現性是指程式被重複執行時,只要初始條件相同,那麼執行結果必然相同。不可再現性當然就是說執行的結果會受到其他因素的影響。看下面一段程式碼:
s1 : n = n + 1;
s2: printf(n);
假設一開始時,n = 5,如果按順序執行,顯然輸出的結果為6,但是如果先執行的是S2(因為程式是併發的,S2可能執行的比較快),再執行S1,那麼輸出結果就是5.。