信號量機制 優先級翻轉 解決

1965年,荷蘭學者Dijkstra提出了利用信號量機制解決進程同步問題,信號量正式成爲有效的進程同步工具,現在信號量機制被廣泛的用於單處理機和多處理機系統以及計算機網絡中。

信號量S是一個整數,S大於等於零時代表可供併發進程使用的資源實體數,但S小於零時則表示正在等待使用臨界區的進程數。

Dijkstra同時提出了對信號量操作的PV原語。

P原語操作的動作是:

  (1)S減1;
  (2)若S減1後仍大於或等於零,則進程繼續執行;

  (3)若S減1後小於零,則該進程被阻塞後進入與該信號相對應的隊列中,然後轉進程調度。

V原語操作的動作是:

  (1)S加1;
  (2)若相加結果大於零,則進程繼續執行;

  (3)若相加結果小於或等於零,則從該信號的等待隊列中喚醒一等待進程,然後再返回原進程繼續執行或轉進程調度。

PV操作對於每一個進程來說,都只能進行一次,而且必須成對使用。在PV原語執行期間不允許有中斷的發生。


互斥信號量和二進制信號量的區別:1)互斥型信號量必須是同一個任務申請,同一個任務釋放,其他任務釋放無效,同一個任務可以遞歸申請。2)二進制信號量,一個任務申請成功後,可以由另一個任務釋放。

二進制信號量實現任務互斥:打印機資源只有一個,abc三個任務共享,當a取得使用權後,爲了防止其他任務錯誤地釋放了信號量(),必須將打印機房的門關起來(進入臨界段),用完後,釋放信號量,再把門打開(出臨界段),其他任務再進去打印。(而互斥型信號量由於必須由取得信號量的那個任務釋放,故不會出現其他任務錯誤地釋放了信號量的情況出現,故不需要有臨界段。互斥型信號量是二進制信號量的子集。)
二進制信號量實現任務同步:a任務一直等待信號量,b任務定時釋放信號量,完成同步功能。

互斥量(Mutex) :互斥量表現互斥現象的數據結構,也被當作二元信號燈。一個互斥基本上是一個多任務敏感的二元信號,它能用作同步多任務的行爲,它常用作保護從中斷來的臨界段代碼並且在共享同步使用的資源。

Mutex本質上說就是一把鎖,提供對資源的獨佔訪問,所以Mutex主要的作用是用於互斥。Mutex對象的值,只有0和1兩個值。這兩個值也分別代表了Mutex的兩種狀態。值爲0, 表示鎖定狀態,當前對象被鎖定,用戶進程/線程如果試圖Lock臨界資源,則進入排隊等待;值爲1,表示空閒狀態,當前對象爲空閒,用戶進程/線程可以Lock臨界資源,之後Mutex值減1變爲0。Mutex可以被抽象爲四個操作: - 創建 Create- 加鎖 Lock- 解鎖 Unlock- 銷燬 Destroy。

Mutex被創建時可以有初始值,表示Mutex被創建後,是鎖定狀態還是空閒狀態。在同一個線程中,爲了防止死鎖,系統不允許連續兩次對Mutex加鎖(系統一般會在第二次調用立刻返回)。也就是說,加鎖和解鎖這兩個對應的操作,需要在同一個線程中完成。


操作系統的優先級反轉:如果任務之間由於有共享資源出現了競爭或者死鎖,是會嚴重影響系統安全的。因此uC/OS對共享資源提供了保護機制。一般情況下使用的是信號量方法。創建一個信號量並對他進行初始化,當一個任務需要使用一個共享資源時,他必須先申請得到這個信號量。在這個過程中即使有優先權更高的任務進入了就緒態,因爲無法得到信號量,也不能使用該資源。在uC/OS中稱爲優先級反轉。簡單地說,就是高優先級任務必須等待低優先級任務的完成。


互斥信號量解決任務優先級反轉:使獲得信號量的任務的優先級別在使用共享資源期間暫時提升到所有任務最高優先級的高一個級別上,以使該任務不被其他任務所打斷,從而能儘快的使用完共享資源並釋放信號量,然後在釋放信號量之後,再恢復該任務原來的優先級別。(可以通過線程的屬性來動態的修改線程的優先級)


優先級反轉+解決方案 
1. 優先級反轉(Priority Inversion): 由於多進程共享資源,具有最高優先權的進程被低優先級進程阻塞,反而使具有中優先級的進程先於高優先級的進程執行,導致系統的崩潰。這就是所謂的優先級反轉(Priority Inversion)。

2. 產生原因: 其實,優先級反轉是在高優級(假設爲A)的任務要訪問一個被低優先級任務(假設爲C)佔有的資源時,被阻塞.而此時又有優先級高於佔有資源的任務(C)而低於被阻塞的任務(A)的優先級的任務(假設爲B)時,於是,佔有資源的任務就被掛起(佔有的資源仍爲它佔有),因爲佔有資源的任務優先級很低,所以,它可能一直被另外的任務掛起.而它佔有的資源也就一直不能釋放,這樣,引起任務A一直沒辦法執行.而比它優先低的任務卻可以執行。所以,一個解決辦法就是提高佔有資源任務的優先級,讓它正常執行,然後釋放資源,以讓任務A能正常獲取資源而得以執行。


3. 解決方案 ( 優先級繼承 / 優先級天花板 ):目前解決優先級反轉有許多種方法。其中普遍使用的有2種方法:一種被稱作優先級繼承(priority inheritance);另一種被稱作優先級極限(priority ceilings)。

A. 優先級繼承(priority inheritance) :優先級繼承是指將低優先級任務的優先級提升到等待它所佔有的資源的最高優先級任務的優先級.當高優先級任務由於等待資源而被阻塞時,此時資源的擁有者的優先級將會自動被提升。

B. 優先級天花板(priority ceilings):  優先級天花板是指將申請某資源的任務的優先級提升到可能訪問該資源的所有任務中最高優先級任務的優先級.(這個優先級稱爲該資源的優先級天花板) 。

A 和B的區別: 優先級繼承,只有當佔有資源的低優先級的任務被阻塞時,纔會提高佔有資源任務的優先級,而優先級天花板,不論是否發生阻塞,都提升。

(可以通過線程的屬性來動態的修改線程的優先級)


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