摘 要:本文介紹和分析了用信號量機制和管程機制實現并發進程的同步的原理,及其各自應用案例和優缺點。
關鍵詞:信號量機制;管程機制;進程;同步;應用
中圖分類號:TP311.13 文獻標識碼:A 文章編號:1674-7712 (2014) 20-0000-01
在多道程序設計系統中,由于進程的并發執行和系統資源的有限性,進程間存在著兩種主要的關系即同步與互斥。進程同步的主要任務是對多個相關進程在執行次序上進行協調,以使并發執行的諸進程之間能有效地共享資源和相互合作,從而使程序的執行具有可再現性。下面分析操作系統中進程同步的兩種實現機制原理及其優缺點。
一、信號量機制
信號量是最早出現的用來解決進程同步與互斥問題的機制,包括一個稱為信號量的變量及對它進行的兩個原語操作。
(一)信號量定義。信號量,有時被稱為信號燈,是在多線程環境下使用的一種設施,是可以用來保證兩個或多個關鍵代碼段不被并發調用。在進入一個關鍵代碼段之前,線程必須獲取一個信號量;一旦該關鍵代碼段完成了,那么該線程必須釋放信號量。其它想進入該關鍵代碼段的線程必須等待直到第一個線程釋放信號量。為了完成這個過程,需要創建一個信號量VI,然后將Acquire Semaphore VI以及Release Semaphore VI分別放置在每個關鍵代碼段的首末端。確認這些信號量VI引用的是初始創建的信號量。
(二)信號量特征。抽象的來講,信號量是一個非負整數(車位數),所有通過它的線程/進程(車輛)都會將該整數減一(通過它當然是為了使用資源),當該整數值為零時,所有試圖通過它的線程都將處于等待狀態。在信號量上我們定義兩種操作:Wait(等待)和Release(釋放)。當一個線程調用Wait操作時,它要么得到資源然后將信號量減一,要么一直等下去(指放入阻塞隊列),直到信號量大于等于一時。Release(釋放)實際上是在信號量上執行加操作,對應于車輛離開停車場,該操作之所以叫做“釋放”是因為釋放了由信號量守護的資源。
(三)信號量機制工作原理——P、V操作原語。P原語操作過程:(1)S減1;(2)若S減1后仍大于或等于零,則調用P原語的進程繼續執行;(3)若S減1后小于零,則該進程被阻塞到與該信號相對應的隊列Q中,然后轉進程調度。V原語操作過程:(1)S加1;(2)若相加后的S大于零,則進程繼續執行;(3)若相加后的S小于或等于零,則從該信號的等待隊列Q中喚醒一等待進程,然后再返回原進程繼續執行或轉進程調度。
(四)信號量機制優缺點。優點:PV操作能夠實現對臨界區的管理要求;實現簡單;允許使用它的代碼休眠,持有鎖的時間可相對較長。缺點:一個信號量只能置一次初值,以后只能對之進行p操作或v操作。
由上述消費者——生產者問題的應用也可以看到,信號量機制必須有公共內存,不能用于分布式操作系統,這是它最大的弱點。信號量機制功能強大,但使用時對信號量的操作分散,而且難以控制,讀寫和維護都很困難。加重了程序員的編碼負擔;核心操作P-V分散在各用戶程序的代碼中,不易控制和管理;一旦錯誤,后果嚴重,且不易發現和糾正。
二、管程機制
為實現進程間的同步,在每個并發進程中都要設置大量的同步操作原語,這不僅給編程帶來麻煩,且會因P操作使用不當導致數據的不定性或死鎖:同時操作系統的結構不夠清晰。因此后來又提出了一種集中式同步進程——管程。其基本思想是將共享變量和對它們的操作集中在一個模塊中,操作系統或并發程序就由于這樣的模塊構成。這樣模塊之間聯系清晰,便于維護和修改,易于保證正確性。
(一)管程概念。管程可以看做一個軟件模塊,它是將共享的變量和對于這些共享變量的操作封裝起來,形成一個具有一定接口的功能模塊,進程可以調用管程來實現進程級別的并發控制。進程只能互斥得使用管程,即當一個進程使用管程時,另一個進程必須等待。當一個進程使用完管程后,它必須釋放管程并喚醒等待管程的某一個進程。在管程入口處的等待隊列稱為入口等待隊列,由于進程會執行喚醒操作,因此可能有多個等待使用管程的隊列,這樣的隊列稱為緊急隊列,它的優先級高于等待隊列。
(二)管程的特征。(1)模塊化。管程是一個基本的軟件模塊,可以被單獨編譯;(2)抽象數據類型。管程中封裝了數據及對于數據的操作,這點有點像面向對象編程語言中的類;(3)信息隱藏。管程外的進程或其他軟件模塊只能通過管程對外的接口來訪問管程提供的操作,管程內部的實現細節對外界是透明的。
(三)使用的互斥性。任何一個時刻,管程只能由一個進程使用。進入管程時的互斥由編譯器負責完成。
(四)管程機制優缺點。優點:集中式同步進程——管程。其基本思想是將共享變量和對它們的操作集中在一個模塊中,操作系統或并發程序就由這樣的模塊構成。這樣模塊之間聯系清晰,便于維護和修改,易于保證正確性。缺點:如果一個分布式系統具有多個CPU,并且每個CPU擁有自己的私有內存,它們通過一個局域網相連,那么這些原語將失效。而管程在少數幾種編程語言之外又無法使用,并且,這些原語均未提供機器間的信息交換方法。
三、結束語
信號量機制和管程機制都遵循同步機制的四條準則,即空閑讓進、忙則等待、有限等待、讓權等待。當它們面臨間接相互制約和直接相互制約時,都會根據自己的工作原理做出相應的調整配合。當面對相同的生產者-消費者問題時,選擇的機制不同,代碼實現也不同,對系統的利用率也不同,所以當面對相同的問題時,如何選擇對系統最優的選擇方案也是十分重要的。進程同步機制不僅僅只有這兩種,還有自旋鎖機制、會合機制、分布式系統機制,如何更加巧妙的結合這幾種機制是非常必要的,對計算機操作系統的發展也會起到很好的作用。
參考文獻:
[1]湯小丹.計算機操作系統[M].西安:西安電子科技大學出版社,2014.
[2]http://blog.csdn.net/wangrunmin/article/details/7941592.
[3]百度百科[OL].
[4]王文磊,徐汀榮.多線程編程技術實現經典進程同步問題[J].計算機技術與發展,2006(03).
[5]趙素萍.操作系統中進程同步的實現[J].電腦開發與應用,2008(06).
[作者簡介]趙童童(1993.05-),女,溫州人,本科在讀,計算機專業,研究方向:計算機科學與技術。