第五章 併發性 互斥和同步

2022-09-08 15:15:15 字數 4863 閱讀 5933

一、併發

1、定義:

併發:在作業系統中,是指乙個時間段中有幾個程式都處於已啟動執行到執行完畢之間,且這幾個程式都是在同乙個處理機上執行,但任乙個時刻點上只有乙個程式在處理機上執行。

2、特點

作業系統併發程式執行的特點:

併發環境下,由於程式的封閉性被打破,出現了新的特點:

①程式與計算不再一一對應,乙個程式副本可以有多個計算

②併發程式之間有相互制約關係,直接制約體現為乙個程式需要另乙個程式的計算結果,間接制約體現為多個程式競爭某一資源,如處理機、緩衝區等。

③併發程式在執行中是走走停停,斷續推進的。

3、與並行的區別:

併發:當有多個執行緒在操作時,如果系統只有乙個cpu,則它根本不可能真正同時進行乙個以上的執行緒,它只能把cpu執行時間劃分成若干個時間段,再將時間 段分配給各個執行緒執行,在乙個時間段的執行緒**執行時,其它執行緒處於掛起狀。.這種方式我們稱之為併發(concurrent)。

並行:當系統有乙個以上cpu時,則執行緒的操作有可能非併發。當乙個cpu執行乙個執行緒時,另乙個cpu可以執行另乙個執行緒,兩個執行緒互不搶占cpu資源,可以同時進行,這種方式我們稱之為並行(parallel)。

區別:

併發和並行是即相似又有區別的兩個概念,並行是指兩個或者多個事件在同一時刻發生;而併發是指兩個或多個事件在同一時間間隔內發生。

在多道程式環境下,併發性是指在一段時間內巨集觀上有多個程式在同時執行,但在單處理機系統中,每一時刻卻僅能有一道程式執行,故微觀上這些程式只能是分時地交替執行。

倘若在計算機系統中有多個處理機,則這些可以併發執行的程式便可被分配到多個處理機上,實現並行執行,即利用每個處理機來處理乙個可併發執行的程式,這樣,多個程式便可以同時執行。

4、競爭條件

多個執行緒或者程序在讀寫乙個共享資料時結果依賴於它們執行的相對時間,這種情形叫做競爭。

競爭條件發生在當多個程序或者執行緒在讀寫資料時,其最終的的結果依賴於多個程序的指令執行順序。

例如:考慮下面的例子

假設兩個程序p1和p2共享了變數a。在某一執行時刻,p1更新a為1,在另一時刻,p2更新a為2。

因此兩個任務競爭地寫變數a。在這個例子中,競爭的「失敗者」(最後更新的程序)決定了變數a的最終值。

多個程序併發訪問和操作同一資料且執行結果與訪問的特定順序有關,稱為競爭條件。

二、程序同步和互斥:

簡介 程序同步是乙個作業系統級別的概念,是在多道程式的環境下,存在著不同的制約關係,為了協調這種互相制約的關係,實現資源共享和程序協作,從而避免程序之間的衝突,引入了程序同步。

臨界資源

在作業系統中,程序是占有資源的最小單位(執行緒可以訪問其所在程序內的所有資源,但執行緒本身並不占有資源或僅僅占有一點必須資源)。

但對於某些資源來說,其在同一時間只能被乙個程序所占用。這些一次只能被乙個程序所占用的資源就是所謂的臨界資源。典型的臨界資源比如物理上的印表機,或是存在硬碟或記憶體中被多個程序所共享的一些變數和資料等(如果這類資源不被看成臨界資源加以保護,那麼很有可能造成丟資料的問題)。

對於臨界資源的訪問,必須是互訴進行。也就是當臨界資源被占用時,另乙個申請臨界資源的程序會被阻塞,直到其所申請的臨界資源被釋放。而程序內訪問臨界資源的**被成為臨界區。

對於臨界區的訪問過程分為四個部分:

1.進入區:檢視臨界區是否可訪問,如果可以訪問,則轉到步驟二,否則程序會被阻塞

2.臨界區:在臨界區做操作

3.退出區:清除臨界區被占用的標誌

程序間同步和互斥的概念

程序同步

程序同步也是程序之間直接的制約關係,是為完成某種任務而建立的兩個或多個執行緒,這個執行緒需要在某些位置上協調他們的工作次序而等待、傳遞資訊所產生的制約關係。程序間的直接制約關係**於他們之間的合作。

比如說程序a需要從緩衝區讀取程序b產生的資訊,當緩衝區為空時,程序b因為讀取不到資訊而被阻塞。而當程序a產生資訊放入緩衝區時,程序b才會被喚醒。概念如圖1所示。

程序互斥

程序互斥是程序之間的間接制約關係。當乙個程序進入臨界區使用臨界資源時,另乙個程序必須等待。只有當使用臨界資源的程序退出臨界區後,這個程序才會解除阻塞狀態。

比如程序b需要訪問印表機,但此時程序a占有了印表機,程序b會被阻塞,直到程序a釋放了印表機資源,程序b才可以繼續執行。

三、訊號量

1、概念

訊號量(semaphore),有時被稱為訊號燈,是在多執行緒環境下使用的一種設施,是可以用來保證兩個或多個關鍵**段不被併發呼叫。

在進入乙個關鍵**段之前,執行緒必須獲取乙個訊號量;一旦該關鍵**段完成了,那麼該執行緒必須釋放訊號量。其它想進入該關鍵**段的執行緒必須等待直到第乙個執行緒釋放訊號量。

為了完成這個過程,需要建立乙個訊號量vi,然後將acquire semaphore vi以及release semaphore vi分別放置在每個關鍵**段的首末端。確認這些訊號量vi引用的是初始建立的訊號量。

以乙個停車場的運作為例。簡單起見,假設停車場只有三個車位,一開始三個車位都是空的。這時如果同時來了五輛車,看門人允許其中三輛直接進入,然後放落車攔,剩下的車則必須在入口等待,此後來的車也都不得不在入口處等待。這時,有一輛車離開停車場,看門人得知後,開啟車攔,放入外面的一輛進去,如果又離開兩輛,則又可以放入兩輛,如此往復。

在這個停車場系統中,車位是公共資源,每輛車好比乙個執行緒,看門人起的就是訊號量的作用。

2、分類

整型訊號量(integer semaphore):訊號量是整數

記錄型訊號量(record semaphore):每個訊號量s除乙個整數值s.value(計數)外,還有乙個程序等待佇列s.l,其中是阻塞在該訊號量的各個程序的標識

二進位制訊號量(binary semaphore):只允許訊號量取0或1值

每個訊號量至少須記錄兩個資訊:訊號量的值和等待該訊號量的程序佇列。

它的型別定義如下:(用類pascal語言表述)

semaphore = record

value: integer;

queue: ^pcb;

end;

其中pcb是程序控制塊,是作業系統為每個程序建立的資料結構。

s.value>=0時,s.queue為空;

s.value<0時,s.value的絕對值為s.queue中等待程序的個數;

3、特性

抽象的來講,訊號量的特性如下:訊號量是乙個非負整數(車位數),所有通過它的執行緒/程序(車輛)都會將該整數減一(通過它當然是為了使用資源),當該整數值為零時,所有試圖通過它的執行緒都將處於等待狀態。在訊號量上我們定義兩種操作: wait(等待) 和 release(釋放)。當乙個執行緒呼叫wait操作時,它要麼得到資源然後將訊號量減一,要麼一直等下去(指放入阻塞佇列),直到訊號量大於等於一時。release(釋放)實際上是在訊號量上執行加操作,對應於車輛離開停車場,該操作之所以叫做「釋放」是因為釋放了由訊號量守護的資源。

4、操作方式

對訊號量有4種操作(include):

初始化(initialize),也叫做建立(create) int sem_init(sem_t *sem, int pshared, unsigned int value);

等訊號(wait),也可叫做掛起(suspend)int sem_wait(sem_t *sem);

給訊號(signal)或發訊號(post) int sem_post(sem_t *sem);

4.清理(destroy) int sem_destory(sem_t *sem);

四、管程

1、定義:

管程 (英語:moniters,也稱為監視器) 是一種程式結構,結構內的多個子程式(物件或模組)形成的多個工作執行緒互斥訪問共享資源。這些共享資源一般是硬體裝置或一群變數。】

管程實現了在乙個時間點,最多只有乙個執行緒在執行管程的某個子程式。與那些通過修改資料結構實現互斥訪問的併發程式設計相比,管程實現很大程度上簡化了程式設計。

系統中的各種硬體資源和軟體資源,均可用資料結構抽象地描述其資源特性,即用少量資訊和對資源所執行的操作來表徵該資源,而忽略了它們的內部結構和實現細節。

利用共享資料結構抽象地表示系統中的共享資源,而把對該共享資料結構實施的操作定義為一組過程。

代表共享資源的資料結構,以及由對該共享資料結構實施操作的一組過程所組成的資源管理程式,共同構成了乙個作業系統的資源管理模組,我們稱之為管程。

hansan為管程所下的定義:「乙個管程定義了乙個資料結構和能為併發程序所執行(在該資料結構上)的一組操作,這組操作能同步程序和改變管程中的資料」。

2、組成:

管程由四部分組成:

1.管程的名稱;

2.區域性於管程內部的共享資料結構說明;

3.對該資料結構進行操作的一組過程;

4.對區域性於管程內部的共享資料設定初始值的語句。

區域性於管程的資料結構,只能被區域性於管程的過程所訪問,任何管程之外的過程都不能訪問它;反之,區域性於管程的過程也只能訪問管程內的資料結構。

由此可見,管程相當於圍牆,它把共享變數和對它進行操作的若干個過程圍了起來,所有程序要訪問臨界資源時,都必須經過管程才能進入,而管程每次只允許乙個程序進入管程,從而實現了程序的互斥。

管程的條件變數:條件變數是在管程內部的資料結構,且只有在管程內才能被訪問,它對管程內所有過程是全域性的,只能通過wait(),signal()兩個操作訪問。

wait():掛起呼叫程序並釋放管程,直至另一程序在條件變數上執行signal()。

signal():如果有其他程序因對條件變數執行wait()而被掛起,便釋放之,如果沒有程序等待,則訊號被忽略,不儲存。

併發性 互斥和同步 死鎖和飢餓

二 併發的原理 在單處理器多道程式設計系統中,程序被交替執行,表現出一種併發執行的外部特徵。即使不能實現真正的並行處理,並且在程序間來回切換也需要一定的開銷,交替執行在處理效率和程式結構上還是帶來了重要的好處。在多處理器系統中,不僅可以交替執行程序,而且可以重疊執行程序。三 程序的互動 我們可以根據...

分布計算系統學習隨筆 第五章同步和互斥

5.1 1 資源管理方式 1 全集中管理方式 所有資源都由乙個服務員管理 2 集中分布管理方式 乙個資源由乙個服務員管理 3 全分布管理方式 乙個資源是由多個服務員共同管理。2 多個服務員參加對同乙個資源進行控制的方式 1 順序方式 按某種順序,先由乙個服務員控制一段時間,之後再由另乙個服務員控制一...

第五章 訊號量和互斥體

第三章介紹了乙個以記憶體為裝置的字元裝置驅動。需要注意的是,第三章介紹的只是這個驅動的最基本的四個函式,open release read和write 有了這四個函式,這個驅動也就可以使用了。不過,從書本附帶的原始碼中得到的scull工程的 可遠遠不止這四個函式,它的很多 時為了後面章節的擴充套件。...