嵌入式操作系統——進程管理

記筆記記筆記


先明確幾個概念:

進程同步( task synchronization):操作系統中的多個進程需要彼此之 間通信和共享數據,這個過程中合理 的調度, 稱 爲 進 程 同 步 。

進程互斥(task mutex):當多個進程需要使用相 同的資源,而此類資源在任一時刻卻 只能供一個進程使用,獲得資源的進 程可以繼續執行,沒有獲得資源的進 程必須等待。如共用一臺打印機。

二進制信號量:爲共享資源提供互斥訪問機制,每次只將資源分配給單個進程;當 某個進程佔用特定資源的時候,系統不允許其他進程訪問該資源。二進制信號量 的具體實現取決於操作系統內核;在特定操作系統內核中,二進制信號量也稱爲 互斥量。

計數信號量:與二進制信號量不同,計數信號量將資源併發訪問的進程或線程數目限制爲固定 數量。計數信號量始終記錄某個特定的計數器,其取值範圍是從0到某個固定值之 間;這就限制了系統支持資源併發訪問的最大數目。
計數信號量與二進制信號量是類似的。兩者不同在於,二進制信號量只能用於互 斥訪問;而計數信號量可以用於互斥訪問,也可以實現限定數目的訪問。

進程管理
進程同步
進程通信
互斥機制
信號量
二進制信號量
計數信號量

再明確兩個概念:
臨界資源(Critical Resource): 如打印機、 磁帶機等共享資源稱爲“臨界資源”。
臨界區(critical section):爲了訪問 共享資源(比如共享存儲器、共享變量 等),需要執行相應的程序指令,存放這 段程序指令的代碼存儲區域稱爲臨界區。 即把在每個進程中訪問臨界資源那段代碼 稱爲臨界區。

爲了實現共享資源的同步訪問,臨界區訪 問應該是互斥的。也就是說,在調用臨界 區代碼的時候,需要使用互斥機制。

實現進程之間互斥的方法:
在原語裏設置一個公共變量代表臨界資源的狀態。 lock/unlock

資源可用
資源正在使用
0
1
x

使用臨界資源必須做如下三步:

 - 檢查鎖的設置
 - 進入臨界區,訪問臨界區  
 - 釋放臨界資源,開鎖

進程同步遵循的原則:

- 空閒讓進:當無進程進入臨界區時,應立即進入。 
- 忙則等待:當已有進程進入臨界區時,表明資源在使用,應等待。 
- 有限等待:對要求訪問臨界資源的進程,應保證有限時間內能進入。 
- 讓權等待:當進程不能進入自己的臨界區時,應立即釋放處理機,以免進程陷入“忙等”。

用於進程同步的操作:

P操作:
①將信號量S的值減1,即S=S-1;
②如果 S>=0,則該進程繼續執行;否則該進程置爲等待狀態,排入等待隊列。

1)S:=S – 1//請求一個資源 
2)If S>=0, go on; if S<0, blocked //申請不成功(資源用完), 調用阻塞原語“讓權等待

V操作:
①將信號量S的值加1,即S=S+1; 
②如果S>0,則該進程繼續執行;否則釋放隊列中第一個等待信號量的進程。
1)S:=S + 1 //釋放一個資源 
2)If S>0, go on; 
   if S<=0,  the first blocked process in waiting queue blocked->ready, go on
	//表示在信號鏈表,仍有等待該資源 的進程,調用喚醒原語
  • 從物理意義上理解,P 操作相當於申請資源; V操作相當於釋放資源。
  • 信號量的值表示相應資源的使用情況。信號量S>=0時,S表示可用資 源的數量。執行一次P操作意味着請求分配一個資源,因此S的值減1; 當S<0時,表示已經沒有可用資源,S的絕對值表示當前等待該資源 的進程數。請求者必須等待其他進程釋放該類資源,才能繼續運行。 而執行一個V操作意味着釋放一個資源,因此S的值加1;若S<0,表 示有某些進程正在等待該資源,因此要喚醒一個等待狀態的進程, 使之運行下去。
  • 用信號量可以方便地解決n個進程互斥地 使用臨界區的問題。信號量的取值範圍是 +1~(1-n)。信號量的值爲負時,說明一 個進程正在臨界區執行,其它的正排在信號量等待隊列中等待,等待的進程數等於信號量值的絕對值 。
    例:若P、V操作的信號量初值爲1,當前 值爲-3,則表示3個等待進程。

典型的互斥機制:生產者-消費者問題(也稱爲受限緩衝區問題)
生產者-消費者問題是常見的數據共享問題,其中,兩個進程併發訪問具有固定 容量的共享緩衝區,因此也稱爲受限緩衝區問題(Bounded Buffer Problem)。 生成數據的線程/進程稱爲生產者線程/進程(producer thread/process);使 用生產者線程/進程生成的數據的線程/進程稱爲消費者線程/進程(consumer thread/process)。

  • 有一羣生產者進程在生產產品,並將這些產品提供給消費者進程去消費;
  • 生產者進程和消費者進程是多個並行的進程;
  • 如果這兩個進程沒有同步,可能引發下面的問題:
    ➢ 緩衝區溢出(buffer overrun)
    ➢ 緩衝區空閒(buffer under-run)

爲了正確地存取緩衝區,要求各生產者與消費者進程互斥地使用緩衝區。爲此,要設兩個同步信號量分別標識生產者進程和消費者進程 能否正確前進的標誌

  • 用empty表示空緩衝個數,初值爲n;
  • 用full表示裝滿產品的緩衝個數,初值爲0。
  • 再設置一個互斥使用臨界區的信號量mutex,初值爲1。

兩者的同步算法如下:

var mutex, empty,full:semaphore;
mutex=1;	//實現互斥訪問的信號量
empty:=n; full:=0; //空緩衝區和裝滿產品的緩衝區的個數
buffer:array[0..n-1] of product; //環形列隊緩衝區
in, out, goods:integer
in:=0; out:=0; //指向空緩衝區和裝滿產品的緩衝區

begin
	cobegin	//併發進程producer和comsumer
		producer;
		consumer;
	coend
end

生產及消費者進程:
在這裏插入圖片描述
注意事項:

  • 無論是生產者還是消費者,P操作的順序是重要的。應 該將互斥使用的信號量的P操作放在緊挨臨界區的位。
  • 如果把生產者進程中的兩個P操作交換次序,當緩衝區 滿時,生產者欲向緩衝區放產品時,將在P(empty)上等 待,但它已得到了使用緩衝區的權力。若此後,消費者 欲取產品時,由於申請使用緩衝區不成功,它將在 P(mutex)上等待。從而導致生產者等待消費者取走產品 ,而消費者卻在等待生產者釋放緩衝區,這種相互等待 是無休止的,從而造成系統死鎖。

一個進程必須按下述三個順序事件使用資源:

  • 請求資源:若請求不能立即滿足,則申請者等待。
  • 使用資源:獲得資源後,可使用它。
  • 釋放資源:使用完畢,將資源歸還系統。

死鎖:是指多個進程因競爭資源而造成的一種僵局,若無外 力作用,這些進程都將永遠不能向前推進。

死鎖產生原因:

  • 競爭資源。系統提供的資源不能滿足每個進程的需要
  • 多道程序運行時,進程推進順序不合法。進程在運行過程中, 請求和釋放資源的順序不當,也同樣會導致產生進程死鎖。

死鎖發生的必要條件(科夫曼條件,Coffman conditions):

  • 互斥:該條件表明,一個資源只能被一個進程佔用。這就意味着進程對共享資 源的訪問是互斥的。訪問嵌入式設備中的顯示硬件就是其典型實例。
  • 佔用並等待:該條件表明,進程佔用共享資源,從而鎖定共享資源的訪問控制, 然後等待其他進程佔用的其他共享資源。
  • 資源不可搶佔:該條件表明,對於進程當前佔用的共享資源,操作系統不能強 行從該進程獲取資源;只有該進程自動釋放資源後,該共享資源纔是可用的。
  • 循環等待:該條件表明,第一個進程正在等待第二個進程佔用的資源,同時第 二個進程也正在等待第一個進程佔用的資源。一般來說,可能存在一組等待進 程P0、P1、…Pn;其中P0正在等待P1佔用的資源,P1正在等待P0佔用的資 源,…,Pn正在等待P0佔用的資源,P0正在等待Pn佔用的資源,等等。這就形 成了循環等待。

死鎖的處理:(操作系統可以採取下面策略用於應對死鎖)

  • 忽略死鎖:該策略總是假定系統設計中不存在死鎖。UNIX就是遵循上述原則的 操作系統實例。
    • 鴕鳥算法
  • 檢測與修復:該策略建議對死鎖條件進行檢測,並恢復到正常運行狀態。
    • 倒車(back up cars)技術
  • 避免死鎖:如果操作系統能夠合理地調配資源,那麼可以避免死鎖的產生。類 似於十字路口的交通燈機制,用於避免發生交通阻塞。
  • 防止死鎖:如果解除產生死鎖的四個條件中的一個,就能有效防止死鎖產生。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章