程序互斥與同步

2022-06-13 06:51:13 字數 3154 閱讀 7381

一、程序互斥

首先我們要知道,為了保證程式執行最終結果的正確性,必須對併發執行的各程序進行制約,以控制它們的執行速度和對資源的競爭。需要回到乙個問題,需要對程式哪些部分進行制約才能保證其執行結果的正確性?如:程序pa 和pb共享記憶體 ms,程序pa 和pb 各執行兩條語句時,可能按以下順序執行:當程序pa執行完第一條語句,開始執行程序pb,再接著執行程序pa 的第二條語句。這樣會導致錯誤。如何保證正確性了?我們可以將各自的兩條語句抽象為兩個各以乙個動作完成的順序執行單位,這樣執行結果的正確性就可以得到保證。這也引出了乙個概念。

臨界區(critical region):把不允許多個併發程序交叉執行的一段程度稱為臨界區。臨界區是有屬於不同併發程序的程式段共享公用資料或公用資料變數二引起的。

把這種由於共享某一公有資源而引起的在臨界區內不允許併發程序交叉執行的現象,稱為由共享公有資源而造成的對併發程序執行速度的間接制約,簡稱間接制約

1、什麼是互斥?

一組併發程序中的乙個或多個程式段,因共享某一公有資源而導致它們必須以乙個不允許交叉執行的單位執行。也就是說,不允許兩個以上的共享該資源的併發程序同時進入臨界區稱為互斥。

一組併發程序互斥執行時必須滿足如下準則:

i)不能假設各併發程序的相對執行速度。即各併發程序享有平等地、獨立地競爭公有資源的權利。

ii)併發程序中的某個程序不在臨界區時,它不阻止其他程序進入臨界區;

iii)併發程序中的若干個程序申請進入臨界區時,只能允許乙個程序進入;

iv)併發程序中的某個程序從申請進入臨界區時開始,應在有限時間內得以進入臨界區。

準則iv)是併發程序不發生死鎖的重要保證。

2、互斥的加鎖實現

是否只需把臨界區中的各個過程按不同的時間排列呼叫就好?事實上不可能。因為使用者程式的執行開始的隨機性是不可知的。

一種可能的辦法是對臨界區加鎖以實現互斥。當某個程序進入臨界區之後,它將鎖上臨界區,直到它退出臨界區為止。併發程序在申請進入臨界區時,首先測試該臨界區是否是上鎖的。如果該臨界區已被鎖住,則該程序要等待該臨界區開鎖之後才有可能獲得臨界區。

3、訊號量和p、v原語

3.1 使用加鎖實現程序之間互斥存在的問題:

i)如果一組併發程序的程序數較多,且由於每個程序在申請進入臨界區時都得對鎖定位進行測試,這樣開銷是很大的。

ii)另外使用加鎖實現程序間互斥時,還將導致在某些情況下出現不公平現象,如:對程序pa 和pb ,程序pa 執行完並解鎖以後,緊接一條轉向語句呼叫程序pa ,由於轉向排程語句瞬間就執行,使得程序pa 將處理機轉讓給程序pb  的可能性非常小。因此,程序pb將處於永久飢餓狀態。

針對ii)為什麼產生這樣的問題呢?因為在用加鎖法解決程序互斥的問題時,乙個程序能否進入臨界區是依靠程序自己的呼叫lock過程去測試相應的鎖定位,也就是說,每個程序能否進入臨界區是靠自己測試判斷的,這樣,沒有執行機會的程序當然無法判斷,從而出現不公平現象。

我們可以用訊號量管理相應臨界區的公有資源,它代表可用資源實體。訊號量的數值僅能有p、v原語操作改變,sem是訊號量,一次p原語操作使得訊號量sem減1,一次v原語操作將使訊號量sem加1.

注:當某個程序正在臨界區內執行時,其他程序如果執行了p原語操作,則該程序並不想調動lock時那樣因進不了臨界區而返回lock起點,等待以後重新執行測試,而是在等待佇列中等待有其他程序做v元素操作釋放資源後,進入臨界區,這時,p原語的執行才算真正結束。

3.2 p原語操作的主要動作如下:

a)sem減1;

b)若sem減1後仍大於或等於0,則p原語返回,該程序繼續執行;

c)若sem減1後小於0,則該程序被阻塞進入相應的佇列中,然後轉程序排程。

v原語的操作主要動作如下:

a)sem 加1;

b)若相加結果大於0,v原語停止執行,該程序返**用處,繼續執行;

c)若相加結果小於或等於0,則從該訊號的等待佇列中喚醒乙個等待程序,然後返回原程序繼續執行或轉程序排程。

3.3為什麼p、v過程要以原語實現?

如果不,則多個程序同時呼叫p操作或v操作的話,則有可能在p操作剛執行完sem-1而未把對應程序送入等待佇列時,v操作開始執行,從而,v操作將無法發現等待程序而返回。所以p、v操作都必須以原語實現,且在p、v原語執行期間不允許中斷發生。

4、用p、v原語實現程序互斥

設訊號sem是用於互斥的訊號量,且其初始值為1表示沒有併發程式使用該臨界區。當乙個程序想要進入臨界區時,它必須先執行p原語操作以將訊號量sem減1。在乙個程序完成對臨界區的操作之後,它必須執行v原語操作以釋放它所占用的臨界區。

由於訊號量初始值為1,所以,任一程序在執行p原語操作之後將sem的值變為0,表示該程序可以進入臨界區。在改程序未執行v原語操作之前如有另一程序想進入臨界區的話,它也應該先執行p原語操作,從而使sem的值變為-1,因此,第二個程序將被阻塞。直到第乙個程序執行v原語操作之後,sem的值變為0,從而可喚醒第二個程序進入就緒佇列,經排程後再進入臨界區。在第二個程序執行完v原語操作之後,若沒有其他程序申請進入臨界區的話,則sem又恢復到初始值。

二、程序同步

1、程序同步

一組在非同步環境下的併發程序,各自的執行結果互為對方的執行條件,從而限制各程序的執行速度的過程稱為併發程序間的直接制約。這裡的非同步環境主要指各併發程序的執行起始時間的隨機性和執行速度的獨立性。

一種最為簡單和直觀的方法是直接制約的程序相互給對方程序傳送執行條件已具備的訊號。

把非同步環境下的一組併發程序因直接制約而相互傳送訊息而進行相互合作、相互等待,使得各程序按一定的速度執行的過程稱為程序間的同步。

2、私用訊號量

與程序互斥不同的是,這裡的訊號量只與制約程序及被制約程序有關二不是與整租併發程序有關。

3、生產者-消費者問題

把併發程序的同步和互斥問題一般化,得到乙個抽象的一般模型,即生產者-消費者問題。

把系統中使用某一類資源的程序稱為消費者,而把釋放同類資源的程序稱為該資源的生產者。

程序互斥與同步

1.解釋併發與並行,並說明兩者關係。併發的實質是乙個物理cpu 也可以多個物理cpu 在若干道程式之間多路復用,併發性是對有限物理資源強制行使多使用者共享以提高效率。並行性指兩個或兩個以上事件或活動在同一時刻發生。在多道程式環境下,並行性使多個程式同一時刻可在不同cpu上同時執行。併發與並行是兩個既...

程序互斥與同步

1 併發與並行是兩個既相似而又不相同的概念 併發性,又稱共行性,是指能處理多個同時性活動的能力 並行是指同時發生的兩個併發事件,具有併發的含義,而併發則不一定並行,也亦是說併發事件之間不一定要同一時刻發生。兩者區別 乙個是交替執行,乙個是同時執行.2 程序之間存在同步和互斥兩種關係 同步是因合作程序...

程序互斥與同步

1.解釋併發與並行,並說明兩者關係。並行 是指兩個或者多個事件在同一時刻發生 併發 是指兩個或多個事件在同一時間間隔發生。並行是併發的特例,併發是並行的擴充套件。2.程序間有哪幾種關係?分別要採取什麼策略?程序間有競爭 協作兩種關係 競爭採用的程序互斥的策略 協作採用的程序同步的策略 3.為什麼說程...