淺談進程間的同步與互斥

當有多個線程的時候,經常需要去同步這些線程以訪問同一個數據或資源。

例如,假設有一個程序,其中一個線程用於把文件讀到內存,而另一個線程用於統計文件中的字符數。當然,在把整個文件調入內存之前,統計它的計數是沒有意義的。但是,由於每個操作都有自己的線程,操作系統會把兩個線程當作是互不相干的任務分別執行,這樣就可能在沒有把整個文件裝入內存時統計字數。爲解決此問題,你必須使兩個線程同步工作。

一、同步與互斥概念

1、進程同步

指散步在不同進程之間的若干程序片斷,它們的運行必須嚴格按照規定的某種先後次序來運行,這種先後次序依賴於要完成的特定的任務,即在某種特定順序訪問臨界資源,在互斥的前提下;

通過其它機制實現訪問者對資源的有序訪問。在大多數情況下,同步已經實現了互斥,特別是所有寫入資源的情況必定是互斥的。少數情況是指可以允許多個訪問者同時訪問資源;

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

進程同步也是進程之間直接的制約關係,是爲完成某種任務而建立的兩個或多個線程,這個線程需要在某些位置上協調他們的工作次序而等待、傳遞信息所產生的制約關係。進程間的直接制約關係來源於他們之間的合作。

比如說進程A需要從緩衝區讀取進程B產生的信息,當緩衝區爲空時,進程B因爲讀取不到信息而被阻塞。而當進程A產生信息放入緩衝區時,進程B纔會被喚醒。

如圖1所示:
這裏寫圖片描述

2、進程互斥

是進程之間的間接制約關係。當一個進程進入臨界區使用臨界資源時,其它進程必須等待。只有當使用臨界資源的進程退出臨界區後,其它進程纔會解除阻塞狀態。

(即指散佈在不同進程之間的若干程序片斷,當某個進程運行其中一個程序片段時,其它進程就不能運行它們之中的任一程序片段,只能等到該進程運行完這個程序片段後纔可以運行;)

如果用對資源的訪問來定義的話,互斥某一資源同時只允許一個訪問者對其進行訪問,具有唯一性和排它性。但互斥無法限制訪問者對資源的訪問順序,即訪問是無序的

比如進程B需要訪問打印機,但此時進程A佔有了打印機,進程B會被阻塞,直到進程A釋放了打印機資源,進程B纔可以繼續執行。概念如圖3所示。

進程之間的互斥:
這裏寫圖片描述

二、臨界資源

1、臨界資源概念:

線程可以訪問其所在進程內的所有資源,但線程本身並不佔有資源或僅僅佔有一點必須資源。但對於某些資源來說,其在同一時間只能被一個進程所佔用。這些一次只能被一個進程所佔用的資源就是所謂的臨界資源。

典型的臨界資源比如物理上的打印機,或是存在硬盤或內存中被多個進程所共享的一些變量和數據等(如果這類資源不被看成臨界資源加以保護,那麼很有可能造成丟數據的問題)。

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

2、對於臨界區的訪問過程分爲四個部分:

a、進入區:查看臨界區是否可訪問,如果可以訪問,則轉到步驟二,否則進程會被阻塞
b、臨界區:在臨界區做操作
c、退出區:清除臨界區被佔用的標誌
d、剩餘區:進程與臨界區不相關部分的代碼

3、實現臨界區互斥的基本方法

1) 硬件實現方法

通過硬件實現臨界區最簡單的辦法就是關CPU的中斷。從計算機原理我們知道,CPU進行進程切換是需要通過中斷來進行。如果屏蔽了中斷那麼就可以保證當前進程順利的將臨界區代碼執行完,從而實現了互斥。這個辦法的步驟就是:屏蔽中斷–執行臨界區–開中斷。但這樣做並不好,這大大限制了處理器交替執行任務的能力。並且將關中斷的權限交給用戶代碼,那麼如果用戶代碼屏蔽了中斷後不再開,那系統豈不是跪了?

2)信號量實現方式

這也是我們比較熟悉P V操作。通過設置一個表示資源個數的信號量S,通過對信號量S的P和V操作來實現進程的的互斥。

P和V操作分別來自荷蘭語Passeren和Vrijgeven,分別表示佔有和釋放。P V操作是操作系統的原語,意味着具有原子性。

P操作首先減少信號量,表示有一個進程將佔用或等待資源,然後檢測S是否小於0,如果小於0則阻塞,如果大於0則佔有資源進行執行。

V操作是和P操作相反的操作,首先增加信號量,表示佔用或等待資源的進程減少了1個。然後檢測S是否小於0,如果小於0則喚醒等待使用S資源的其它進程。

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