程序管理 九 程序互斥

2022-06-30 11:21:13 字數 3361 閱讀 5745

不允許多個併發程序交叉執行的一段程式稱為臨界部分(critical section )或臨界區(critical region)

臨界區不可能用增加硬體的方法來解決。因此,臨界區也可以被稱為訪問公用資料的那段程式。

防止程序併發執行的時候,出現衝突,或者由於兩個併發程序處於競爭狀態,進而導致兩者執行順序不固定,導致程式執行出錯。

例子設計算程序pa,pb共享記憶體ms。 ms分為系統區、程序工作區和資料區。資料區劃分成大小相等的塊,每個塊中既可能有資料,也有可能沒有資料。系統區主要是堆疊s,存放空資料塊的位址。

令getspace 為取空資料塊過程,release(ad)為釋放資料塊過程。如果堆疊s非空的話,程序pa或pb可以任意順序釋放和獲取資料塊。在程序併發執行時,getspace或 release(ad)將有可能完不成所要求的功能

getspace: begin local g

g←stack[top]

top←top-1

endrelease(ad): begin

top ← top+1

stack[top]←ad

end設時刻t0時,top=h0

首先 release(ad)的第一句執行:

t0:top←top+1 top=h0+1;

接著getspace 執行:

t1:g←stack[top] g=stack[h0+1];

t2:top←top-1 top=h0;

再是 release(ad)的第二句執行:

t3:stack[top]←ad stack[h0+1]←ad;

呼叫getspace的程序取到的是h0+1中的乙個未定義值;呼叫release(ad)的程序把釋放的空塊位址ad重複放入了h0。

將那些不允許交叉執行的臨界區按不同的公用資料劃分為不同的集合。

上例中,以公用資料棧s劃分的臨界區集合是。把這些集合稱為類(class)

類的描述

設類 的類名為sp,getspace和release(ad)可重新描述為:

getspace: 	

when sp

do getspce←stack[top]

top←top-1

od

release(ad): 

when sp

do top← top+1

stack [top]← ad

od

由共享公有資源而造成的對併發程序執行速度的間接制約,簡稱間接制約。

由於共享某一公有資源而引起的在臨界區內不允許併發程序交叉執行的現象

不允許兩個以上的共享該資源的併發程序同時進入臨界區稱為互斥

純過程指在執行過程中不改變過程自身**的一類過程。

純過程的優缺點

優點:

把乙個過程作成純過程可便於多個程序共享

缺點:

但由於編制純過程必須對有關變數和工作區作相應的處理,從而其執行效率往往會受到一定的影響

1.各併發程序享有平等的、獨立的競爭共有資源的權利,且在不採取任何措施的條件下,在臨界區內任一指令結束時,其他併發程序可以進入臨界區。

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

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

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

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

加鎖產生的問題:

1.加鎖的方法可以實現程序之間的互斥,但存在影響系統可靠性和執行效率的問題。

例如,如果一組併發程序數量較多,每個程序在申請進入臨界區時都需要對鎖定位進行測試。迴圈測試鎖定位將損耗較多的 cpu計算時間。

2.使用加鎖法實現程序間互斥時,還將導致在某些情況下出現不公平現象

產生原因:乙個程序能否進入臨界區依靠程序自己呼叫lock過程去測試相應的鎖定位。每個程序能否進入臨界區是依靠自己的測試判斷!

訊號量的概念和下面所述的p、v原語是荷蘭科學家e.w.dijkstra提出來的

訊號量sem是一整數

1.sem大於等於零時代表可供併發程序使用的資源實體數;

2.sem小於零時表示正在等待使用臨界區的程序數。

3.用於互斥的訊號量sem的初值應該大於零

建立乙個訊號量步驟如下:

1.說明所建訊號量所代表的意義;

2.為訊號量賦初值;

3.建立相應資料結構以便指向那些等待使用該臨界區的程序。

p和v分別是荷蘭語 passeren 和verhoog 的首字母,相當於英文的pass和increment

sem是與臨界區內所使用的公用資源有關的訊號量。一次p原語操作使得訊號量sem減1,而一次v原語操作將使得訊號量sem加1。

v原語的操作主要動作是:

1.sem加1;

2.若相加結果大於零,程序繼續執行;

3.若相加結果小於或等於零,則從該訊號的等待佇列中喚醒一等待程序,然後再返回原程序繼續執行或轉程序排程

p原語操作的主要動作是:

1.sem減 1;

2.若sem減1後仍大於或等於零,則程序繼續執行;

3.若sem減1後小於零,則該程序被阻塞後放入與該訊號相對應的佇列中,然後轉程序排程。

利用p,v原語和訊號量,可以方便地解決併發程序的互斥問題,而且不會產生使用加鎖法解決互斥問題時所出現的問題。

利用p,v原語和訊號量,可以方便地解決併發程序的互斥問題,而且不會產生使用加鎖法解決互斥問題時所出現的問題。

設 sem為互斥訊號量,其取值範圍為(1,0,-1)。

sem=1表示程序pa和pb都未進入類名為s的臨界區;

sem=0表示程序pa或pb已進入類名為s的臨界區;

sem=-1表示程序pa和pb中,乙個程序已進入臨界區,而另乙個程序等待進入臨界區。

程序管理六(程序的同步與互斥三)

雖然訊號量及其p v操作是一種既方便又有效的程序同步工具,但如果採用這種同步機制來編寫併發程式,對於共享變數及訊號量變數的操作將被分散與各個程序中,有如下缺點 a.程式易讀性差。因為要了解對於一組共享變數及訊號量的操作是否正確,則必須通讀整個系統或者併發程式。b.不利於修改和維護。因為程式的區域性性...

程序同步 程序互斥

並行性帶來了非同步性,有時需要通過程序同步解決這種非同步問題 有的程序之間需要互相配合地完成工作,各程序的工作推進需要遵循一定的先後順序 1.對臨界資源的訪問,需要互斥的進行。即同一時間內只能允許乙個程序訪問該資源 2.四個部分 進入區 檢查是否可進入臨界區,若可進入,需要 上鎖 臨界區 訪問臨界資...

linux程序 init程序(九)

linux下有3個特殊的程序,idle程序 init程序 和kthreadd idle程序由系統自動建立,執行在核心態 idle程序其pid 0,其前身是系統建立的第乙個程序,也是唯一乙個沒有通過fork或者kernel thread產生的程序。完成載入系統後,演變為程序排程 交換 init程序由i...