盤點操作系統之第三章 進程同步與通信

第三章 進程同步與通信

前言

爲了保證系統的正常活動,使程序的執行具有可再現性,操作系統必須提供某種機制。

進程之間的協作關係包括互斥、同步和通信

互斥是指多個進程不能同時使用同一個資源,當某個進程使用某種資源時,其他進程必須等待。

同步是指多個進程中發生的事件存在着某種時序關係,某些進程的執行必須先於另一些進程。

進程通信是指多個進程之間要傳遞一定量的信息。

3.1 進程同步與互斥

3.1.1 併發原理

1.併發帶來的問題

帶來了以下苦難:
1)全局變量的共享充滿了危險。
2)操作系統很難最佳地管理資源的分配。
3)定位程序的錯誤是很苦難的。

2.進程的交互

按進程之間是否知道對方的存在以及進程的交互方式劃分,可分爲以下情況:
1)進程之間不知道對方的存在
2)進程間接知道對方
3)進程直接得知對方

進程的併發執行使進程之間存在着交互,進程之間的交互關係包括互斥、同步和通信。

按照進程間之間的程度:進程通信>進程同步>進程互斥

3.進程互斥

競爭雙方本來毫無關係,但由於競爭統一資源,使二者產生了相互制約的 關係,這種制約關係就是互斥。所謂互斥就是指多個進程不能同時使用同一資源。

4.進程同步

所謂進程同步,是指多個進程中發生的事件存在着某種時序關係,它們必須按時序執行,以共同完成一項任務。

3.1.2 臨界資源與臨界區

1.臨界區和臨界資源的概念

在某段時間內只允許一個進程使用的資源成爲臨界資源,每個進程中訪問臨界資源的那段程序稱爲臨界區。

幾個進程共享同一臨界資源,它們必須以互相排斥的方式使用臨界資源,即當一個進程正在使用臨界資源且尚未使用完畢時,其他進程必須延遲對該資源的進一步操作,在當前進程使用完畢之前,不能從中插入使用這個臨界資源,否則將會造成信息混亂和操作出錯。

2.進程訪問臨界區的一般結構

即:進入區、臨界區、退出區、剩餘區

進入區:在臨界區前面增加的一段用於進行檢查臨界資源是否被訪問的代碼
退出區:在臨界區後面的用於將臨界區正在被訪問的標誌恢復爲未被訪問標誌的代碼
剩餘區:進程中除了上述進入區、臨界區及退出區之外的其他部分的代碼

3.臨界區進入準則

所有同步機制都必須遵循下述4個準則
1)空閒讓進。當無進程處於臨界區時,臨界資源處於空閒狀態,允許進程進入臨界區。
2)忙則等待。當已有進程進入臨界區時,臨界資源正在被訪問,其他想要進入臨界區的進程必須等待。
3)有限等待。對於要求訪問臨界資源的進程,應保證在有效的時間內進入,以免進入“死等”狀態。
4)讓權等待。當進程不能進入臨界區時,應立即釋放處理機,以免其他進程進入“忙等”狀態。

3.1.3 互斥實現的硬件方法

1.禁止中斷

2.專用機器指令

1)硬件方法分爲TS指令、Swap指令

2)硬件方法的優點
(1)適用範圍廣
(2)簡單
(3)支持多個臨界區

3)硬件方法的缺點
(1)進程在等待進入臨界區時,不能做到“讓權等待”
(2)由於進入臨界區的進程是從等待過程中隨機選擇的,可能造成某個進程長時間不能被選上,從而導致“飢餓”現象。

3.1.4 互斥實現的軟件方法

1.算法一:單標誌算法

可以保證任何時刻至多隻有一個進程進入臨界區,但缺點是強制性輪流進入臨界區,不能保證“空閒讓進”。

2.算法二:雙標誌、先檢查算法

解決了“空閒讓進”,但不能保證“忙則等待” 。

3.算法三:雙標誌、先修改後檢查算法

可防止兩個進程同時進入臨界區,但缺點是可能兩個進程因過分“謙讓”而都進入不了臨界區。

4.算法四:先修改、後檢查、後檢查、後修改者等待算法

實現了同步機制的前兩條——“空閒讓進”和“忙則等待” 。

3.1.5 信號量和PV操作

1.信號量的定義

2.信號量的物理意義

3.用信號量解決互斥問題

4.用信號量解決同步問題

3.2 經典進程同步與互斥問題

3.2.1 生產者——消費者問題

3.2.2 讀者——寫者問題

3.2.3 哲學家進餐問題

3.2.4 打瞌睡的理髮師問題

3.3 AND信號量

3.3.1 AND信號量的引入

3.3.2 用AND信號量解決實際應用

3.4 管程

3.4.1 管程的思想

1.管程的概念

管程的定義是一個共享資源的數據結構以及一組能爲併發進程在其上執行的針對改資源的一組操作,這組操作能同步進程和改變管程中的數據。

管程的基本思想是把信號量及其操作原語封裝在一個對象內部,即將共享資源以及針對共享資源的所有操作集中在一個模塊中。管程可以用函數庫的形式實現,一個管程就是一個基本程序單位,可以單獨編譯。

2.管程的特現

管程的主要特徵爲以下幾點:
(1)侷限於管程的共享變量(數據結構)只能被管程的過程訪問,任何外部過程都不能訪問。
(2)一個進程通過調用管程的一個過程進入管程。
(3)任何時候只能有一個進程在管程中執行,調用管程的任何其他過程都被掛起,以等待管程變爲可用,即管程有效地實現互斥。

3.4.2 管程的結構

1.條件變量

管程必須使用條件變量提供對同步的支持,這些條件變量包含在管程中,並且只有在管程中才能被訪問。以下兩個函數可以操作條件變量:
a.cwait(c):調用進程的執行在條件c上掛起,管程現在可被另一個進程使用
b.csignal(c):恢復在cwait上因爲某些條件而掛起的進程的執行。如果有多種這樣的進程,選擇其中一個。

2.管程的結構

3.4.3 用管程解決實際應用

1.生產者——消費者問題

2.管程與信號量的區別

3.5 同步與互斥實例

3.5.1 Solaris的同步與互斥

1.自旋鎖

2.讀寫門

3.十字轉門

3.5.2 Windows的同步與互斥

1.屏蔽中斷

2.調度對象

3.5.3 Linux的同步與互斥

3.6 進程通信

按照交換信息量的大小,可以把進程之間的通信分爲低級通信和高級通信。

低級通信之中,進程之間只能傳遞狀態和整數值,信號量機制屬於低級通信方式。其優點是傳遞信息的速度快,缺點是傳送的信息量少、通信效率低。

高級通信之中,進程之間可以傳送任意數量的數據,傳遞的信息量大。

3.6.1 進程通信的類型

高級通信機制可分爲三大類,分別爲共享存儲器系統、消息傳遞系統和管道通信。

1.共享存儲器系統

2.消息傳遞系統

因實現方式不同,又分爲直接通信方式和間接通信方式。
1)直接通信方式
2)間接通信方式

3.管道通信

所謂管道,是指用於連接一個讀進程和一個寫進程,以實現進程之間通信的一種共享文件,又稱Pipe文件

爲了協調雙方的通信,管道通信機制必須提供以下幾個方面的協調能力。
1)互斥
2)同步
3)雙方是否存在

3.6.2 進程通信中的問題

1.通信鏈路的建立方式

2.通信方向

3.通信鏈路連接方式

4.通信鏈路的容量

5.數據格式

6.同步方式

3.6.3 消息傳遞系統的實現

1.消息傳遞系統的數據結構

2.發送原語

3.接收原語

3.6.4 客戶端——服務器系統通信

常用的通信方式有命名管道、套接字和遠程過程調用

1.命名管道

2.套接字

3.遠程過程調用

4.遠程方法調用

————————————————————————————————————
大概就是這些,有些點到爲止,有些就需要自己好好琢磨了,諸如經典進程同步與互斥問題,每一個都需要自己慢慢琢磨,教材的講解和例子都有限,反正我們上網課,和課本的有出入,所以慢慢來,一步一步走踏實。

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