挑戰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.。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章