1. 程式人生 > >進程互斥於同步

進程互斥於同步

進程互斥 理解 優先 資源 退出 cfs 不支持 最終 內容

一、理解並行和並發的關系

(一)、程序的並發執行是指一組程序的執行在時間上是重疊的,所謂時間重疊是指一個程序執行第一條指令是在另一個程序完最後一條指令之前開始的,或者說,多個程序處於都已開始但未執行完成狀態。

    比如:你在吃飯的同時受到一條微信,你放下了筷子回信息,等信息回完之後你拿起筷子繼續吃飯,這說明你是支持並發的。

(二)、並行是指在時間上是同步的,即“同時”。

    比如:你在吃飯的時受到一天微信消息,沒有放下筷子而回微信消息,這說明你是支持並行的。

(三)、並發是指你有處理多個任務的能力,但不一定要同時;並行是指你有同時處理多個任務的能力,二者的關鍵在於是否同時;

    比如:你在吃飯的同時受到一條微信消息,要把飯吃完才能回消息,說明你既不支持並發又不支持並行。

二、進程間有哪幾種關系?分別要采取什麽策略?

(一)競爭關系。進程互斥是指若幹進程因互相爭奪獨占資源而產生的競爭制約關系。

    比如:若幹名同學去圖書館借書是間接制約,即互斥關系,其中書是臨界資源。

    資源競爭會引發兩個控制問題,一個是死鎖,一個是饑餓。解決饑餓問題的最簡單策略是FCFS資源分配策略,等待最久的進程會是下一個被調度的進程,隨著時間流逝,每個進程都會有機會變成最“老”進程,因而能獲得資源並完成任務。

(二)協作關系。進程同步是指為完成共同任務的並發進程給予某個條件來協調其活動,因為需要在某些位置上排定執行的先後次序而等待、傳遞信號或消息所產生的協作制約關系。

    比如:流水線生產的各道工序是直接制約,需要互相合作,每道工序的開始都依賴前一道工序的完成。

    進程間的協作可以是雙方不知道對方的名字的間接協作,如通過訪問共享資源進行松散式協作;也可以是雙方知道對方名字,通過通信機制進行的緊密協作,允許進程協同工作有利於共享信息、加快計算速度、實現模塊化的程序設計。

三、為什麽說進程互斥也是一種同步?

在操作系統中,當某一進程正在訪問某一存儲區域時,就不允許其他進程進行讀寫或者修改該存儲區的內容,否則就會發生後果無法估計的錯誤。進程之間的這種相互制約的關系成為進程互斥。

並發進程在一些關鍵點上可能需要互相等待與互通消息,這種相互制約的等待與互通信息稱為進程同步。

實際上進程互斥也是一種同步,他協調多個進程互斥進入同一個臨界資源對應的臨界區。

四、解釋死鎖與“饑餓”,並說明兩者關系。

(一)死鎖:死鎖的產生一定是我們在為了確保同步多線程多進程的時候為臨界資源加鎖(互斥鎖,信號量)造成的。因為一但加鎖就會有不可剝奪的資源產生,這也是死鎖產生的最重要的條件。
(二)死鎖產生的必要條件:
    互斥(臨界資源):一個資源某一時刻只能一個進程占用
    不可搶占(鎖的本質):別人用著沒用完你不能搶
    占有與請求:占有一個資源時候請求別的資源
    循環:在上述三個條件下,由於運行時間巧合產生死鎖A占用a資源申請b阻塞住,B占有b申請a被阻塞住了。


(三)饑餓:是指系統不能保證某個進程的等待時間上界,從而使該進程長時間等待,當等待時間給進程推進和響應帶來明顯影響時,稱發生了進程饑餓。當饑餓到一定程度的進程所賦予的任務即使完成也不再具有實際意義時稱該進程被餓死。(兩個以上優先級高的線程一直生產消費通過臨界資源,一個線程旁邊看,忙等待)

(四)相同點:二者都是由於競爭資源(未解決則會加鎖)而引起的。

(五)不同點:從進程狀態考慮,死鎖進程都處於等待狀態,忙等待(處於運行或就緒狀態)的進程並非處於等待狀態,但卻可能被餓死;
    1、死鎖進程等待永遠不會被釋放的資源,餓死進程等待會被釋放但卻不會分配給自己的資源,表現為等待時限
    2、沒有上界(排隊等待或忙式等待);
    3、死鎖一定發生了循環等待,而餓死則不然。這也表明通過資源分配圖可以檢測死鎖存在與否,但卻不能檢測是否有進程餓死;
    4、死鎖一定涉及多個進程,而饑餓或被餓死的進程可能只有一個。
    5、在饑餓的情形下,系統中有至少一個進程能正常運行,只是饑餓進程得不到執行機會。而死鎖則可能會最終使整個系統陷入死鎖並崩潰。
五、什麽是臨界區?如何解決進程對臨界資源的訪問沖突?

(一)每個進程中訪問臨界資源的那段程序稱為臨界區(臨界資源是一次僅允許一個進程使用的共享資源)。每次只準許一個進程進入臨界區,進入後不允許其他進程進入。

(二)1、如果有若幹進程要求進入空閑的臨界區,一次僅允許一個進程進入;

   2、任何時候,處於臨界區內的進程不可多於一個。如已有進程進入自己的臨界區,則其它所有試圖進入臨界區的進程必須等待;

   3、進入臨界區的進程要在有限時間內退出,以便其它進程能及時進入自己的臨界區;

   4、如果進程不能進入自己的臨界區,則應讓出CPU,避免進程出現“忙等”現象。

進程互斥於同步