嵌入式Linux系統編程——併發性、互斥、信號量、進程,小白勿進

所有學嵌入式Linux系統的看過來了,以下內容是每一位想學習Linux嵌入式系統想要了解的內容,真的很想要分享給大家!

本文分享的內容主要如下幾個方面:

3.1 併發的原理

3.1.1 一個簡單的例子

3.1.2 競爭條件

3.1.3 操作系統關注的問題

3.1.4 進程的交互

3.1.5 互斥的要求

3.2 信號量原理

3.2.1 互斥

3.3 生產者/消費者問題

3.4 讀者-寫者問題

3.3.1 讀進程具有優先權

3.3.2 寫進程具有優先權


本章首先介紹併發的概念和多個併發進程的執行。我們發現,支持併發進程的基本需求是加強互斥的能力。也就是說,當一個進程被授予互斥的能力時,那麼在其活動期間,它具有排斥所有其他進程的能。

本章通過兩個經典的併發問題來說明併發的概念,並對本書中使用的各種方法進行比較。在本章開始

將介紹一個可運行的例子——生產者/消費者問題,讀者-寫者問題。


嵌入式Linux系統編程——併發性、互斥、信號量、進程,小白勿進


3.1 併發的原理

在單處理器多道程序設計系統中,進程被交替執行,表現出一種併發執行的外部特徵。即使不能實現真正的並行處理,並且即使在進程間來回切換需要一定的開銷,交替執行在處理效率和程序構造上還是帶來了重要的好處。

在單處理器的情況下,問題源於多道程序設計系統的一個基本特性:進程的相對執行速度不可預測,

它取決於其他進程的活動、操作系統處理中斷的方式以及操作系統的調度策略。這就帶來了下列困難:

 全局資源的共享充滿了危險。例如,如果兩個進程都使用同一個全局變量,並且都對該變量執行讀

寫操作,那麼不同的讀寫執行順序是非常關鍵的。關於這個問題的例子將在下一小節中給出。

 操作系統很難對分配資源進行最優化的管理

。例如,進程 A 可能請求使用一個特定的 I/O 通道,並

獲得控制權,但它在使用這個通道前被掛起了,操作系統仍然鎖定這個通道,以防止其他進程使用,

這是難以令人滿意的。此外,這還會導致死鎖。

 定位程序設計錯誤是非常困難的。這是因為結果通常是不確定的和不可再現的。

上述所有困難在多處理器系統中都有具體的表現,因為在這樣的系統中進程執行的相對速度也是不可

預測的。一個多處理器系統還必須處理多個進程同時執行所引發的問題,從根本上來說,這些問題和單處

理器系統中的是相同的。這些問題隨著討論的深入將逐漸明瞭。

3.1.1 一個簡單的例子

考慮下面的過程:


嵌入式Linux系統編程——併發性、互斥、信號量、進程,小白勿進


嵌入式Linux系統編程——併發性、互斥、信號量、進程,小白勿進

為理解如何解決與執行速度無關的問題,我們首先需要考慮進程間的交互方式。

3.1.4 進程的交互

1 、進程中的資源爭用

當併發進程競爭使用同一個資源時,它們互相之間會發生衝突。我們可以把這種情況簡單描述如下:

兩個或更多的進程在它們的執行過程中需要訪問一個資源,每個進程並不知道其他進程的存在,並且每個進程也不受其他進程的執行的影響。每個進程都不影響它所使用的資源的狀態,這類資源包括 I/O 設備、存儲器、處理器時間和時鐘。

競爭進程間沒有任何信息交換,但是一個進程的執行可能會影響到競爭進程的行為。特別是如果兩個進程都期望訪問同一個資源,操作系統把這個資源分配給一個進程,另一個就必須等待。因此,被拒絕訪

問的進程速度就會變慢。一種極端情況是,被阻塞的進程永遠不能訪問這個資源,因此一直不能成功地終止。

競爭進程面臨三個控制問題。首先是互斥的要求。假設兩個或更多的進程需要訪問一個不可共享的資

源,如打印機。在執行過程中,每個進程都給該 I/O 設備發命令,接收狀態信息,發送數據和接收數據。

我們把這類資源稱為臨界資源,使用臨界資源的那一部分代碼稱為程序的臨界區。一次只允許有一個程序在臨界區中,這一點是非常重要的。由於不清楚詳細要求,我們不能僅僅依靠操作系統來理解和增強這個限制。例如在打印機的例子中,我們希望任何一個進程在打印整個文件時都擁有打印機的控制權,否則在打印結果中就會穿插著來自競爭資源的打印內容。

實施互斥產生了兩個額外的控制問題。一個是 死鎖。例如,考慮兩個進程 Pl 和 P2,以及兩個資源 Rl

和 R2,假設每個進程為執行部分功能都需要訪問這兩個資源,那麼就有可能出現下列情況:操作系統把 Rl分配給 P2,把 R2 分配給 Pl,每個進程都在等待另一個資源,並且在獲得其他資源並完成需要這兩個資源的功能之前,誰都不會釋放自己已經擁有的資源。這樣,這兩個進程就發生了死鎖

另一個控制問題是 飢餓。假設有三個進程(P1、P2 和 P3),每個進程都週期性地訪問資源 R。考慮這種情況,Pl 擁有資源,P2 和 P3 都被延遲,等待這個資源。當 Pl 退出臨界區時,P2 和 P3 都允許訪問 R。假設操作系統把訪問權授予 P3,並且在 P3 完成臨界區之前 PI 又需要訪問該臨界區,如果在 P3 結束後操作系統又把訪問權授予 Pl,並且接下來把訪問權輪流授予 Pl 和 P3,那麼即使沒有死鎖,P2 也可能無限期地被拒絕訪問資源。

由於操作系統負責分配資源,競爭的控制不可避免地涉及到操作系統。此外,進程自身需要能夠以某

種方式表達互斥的要求,如在使用資源前鎖定資源,但任何一種解決方案都涉及到操作系統的某些支持,如提供鎖機制。圖 3.2 用抽象術語給出了互斥機制。假設有 n 個進程併發執行,每個進程包括(1)在某些資源 Ra 上操作的臨界區,(2)不涉及訪問資源 Ra 的額外代碼。因為所有的進程都需要訪問同一資源 Ra,因此保證在同一時刻只有一個進程在臨界區是很重要的。為實現互斥,需要兩個函數:entercritical 和exitcritical。每個函數的參數都是競爭使用的資源名,如果另外一個進程在臨界區中,那麼任何試圖進入關於同一個資源的臨界區的講程都必須等待。


嵌入式Linux系統編程——併發性、互斥、信號量、進程,小白勿進


嵌入式Linux系統編程——併發性、互斥、信號量、進程,小白勿進


嵌入式Linux系統編程——併發性、互斥、信號量、進程,小白勿進


嵌入式Linux系統編程——併發性、互斥、信號量、進程,小白勿進


嵌入式Linux系統編程——併發性、互斥、信號量、進程,小白勿進


嵌入式Linux系統編程——併發性、互斥、信號量、進程,小白勿進


嵌入式Linux系統編程——併發性、互斥、信號量、進程,小白勿進


嵌入式Linux系統編程——併發性、互斥、信號量、進程,小白勿進


嵌入式Linux系統編程——併發性、互斥、信號量、進程,小白勿進


嵌入式Linux系統編程——併發性、互斥、信號量、進程,小白勿進


嵌入式Linux系統編程——併發性、互斥、信號量、進程,小白勿進


嵌入式Linux系統編程——併發性、互斥、信號量、進程,小白勿進


嵌入式Linux系統編程——併發性、互斥、信號量、進程,小白勿進


嵌入式Linux系統編程——併發性、互斥、信號量、進程,小白勿進


嵌入式Linux系統編程——併發性、互斥、信號量、進程,小白勿進


本章總結

現代操作系統的中心方案是多道程序設計、多處理和分佈式處理,這些方案的基礎以及操作系統設計

技術的基礎是併發。當多個進程併發執行時,不論是在多處理器系統的情況下,還是在單處理器多道程序系統中,都會產生解決衝突和合作的問題。

併發進程可以按多種方式進行交互。互相之間不知道對方的進程可能需要競爭使用資源,如處理器時

間或對 I/O 設備的訪問。進程間由於共享訪問一個公共對象,如主存中的一塊空間或一個文件,可能間接知道對方,這類交互中產生的重要問題是互斥和死鎖。

互斥是指,對一組併發進程,一次只有一個進程能夠訪問一個給定的資源或執行一個給定的功能。互

斥技術可以用於解決諸如資源爭用之類的衝突,還可以用於進程間的同步,使得它們可以合作。後一種情況的一個例子是生產者/消費者模型,一個進程往緩衝區中放數據,另一個或更多的進程從緩衝區中取數據。

支持互斥的第二種方法涉及到使用專門的機器指令,這種方法減少了開銷;但由於使用了忙等待,因

而仍然是低效的。

支持互斥的另一種方法是在操作系統中提供功能,其中最常見的兩種技術是信號量和消息機制。信號

量用於在進程間發信號,並可以很容易地用於實施一個互斥規定。消息對實施互斥是很有用的,它還為進程間的通信提供了一種有效的方法。

死鎖是指一組爭用系統資源或互相通信的進程被阻塞的現象。阻塞是永久的,除非操作系統採取某些

非常的行動,如殺死一個或多個進程,或者強迫一個或多個進程沿原路返回。死鎖可能涉及到可重用資源或可消費資源。可重用資源是指不會因為使用而被耗盡或毀滅的資源,如 I/O 通道或存儲器區域。可消費資源是指當被一個進程獲得時就毀滅了的資源,這類資源的例子有消息和 I/O 緩衝區中的信息。

處理死鎖通常有三種方法:預防、檢測和避免。死鎖預防通過確保死鎖的一個必要條件不會滿足,保

證不會發生死鎖。本章沒有對檢測和避免進行深入討論。


分享到:


相關文章: