計算機作業系統鎖機制.
在多執行緒編程中,作業系統引入了鎖機制,通過鎖機制,能夠保證在多核多執行緒環境中,在某一個時間點上,只能有一個執行緒進入臨界區代碼,從而保證臨界區中操作資料的一致性,
所謂的鎖,可以理解為記憶體中的一個整型數,擁有兩種狀態:空閑狀態和上鎖狀態,加鎖時,判斷鎖是否空閑,如果空閑,修改為上鎖狀態,回傳成功;如果已經上鎖,則回傳失敗,解鎖時,則把鎖狀態修改為空閑狀態,
加鎖程序用如下偽碼表示:
1、read lock;
2、判斷lock狀態;
3、如果已經加鎖,失敗回傳;
4、把鎖狀態設定為上鎖;
5、回傳成功,
雖然每一步是原子性的,但是每一步之間卻是可以中斷的,比如行程A在執行完2后發生中斷,中斷中行程B也執行了加鎖程序,回傳中斷后就會發生兩個行程都會加鎖,
對于這個問題,計算機已經解決,方法是采用原子級匯編指令test and set 和swap,
死鎖的概念.
死鎖: 是指兩個或兩個以上的行程在執行程序中,因爭奪資源而造成的一種互相等待的現象,若無外力作用,它們都將無法推進下去.此時稱系統處于死鎖狀態或系統產生了死鎖,這些永遠在互相等待的行程稱為死鎖行程.
比如 兩只羊過獨木橋,行程比作羊,資源比作橋,若兩只羊互不相讓,爭著過橋,就產生死鎖,
死鎖的原因.
主要原因(1) 因為系統資源不足,(2) 行程運行推進的順序不合適,保證有先后順序,(3) 資源分配不當等,
死鎖的必要條件.
產生死鎖的四個必要條件:
(1) 互斥條件:一個資源每次只能被一個行程使用,
(2) 請求與保持條件:一個行程因請求資源而阻塞時,對已獲得的資源保持不放,
(3) 不剝奪條件: 行程已獲得的資源,在末使用完之前,不能強行剝奪,
(4) 回圈等待條件:若干行程之間形成一種頭尾相接的回圈等待資源關系,存在一個行程等待序列{P1,P2,…,Pn},其中P1等待P2所占有的某一資源,P2等待P3所占有的某一 源,……,而Pn等待P1所占有的的某一資源,形成一個行程回圈等待環,
這四個條件是死鎖的必要條件,只要系統發生死鎖,這些條件必然成立,而只要上述條件之一不滿足,就不會發生死鎖,
解決死鎖的四個方式.
1)忽略該問題,例如鴕鳥演算法,該演算法可以應用在極少發生死鎖的的情況下,為什么叫鴕鳥演算法呢,(鴕鳥策略)
2)檢測死鎖并且恢復,(檢測與解除策略)
3)仔細地對資源進行動態分配,以避免死鎖,(避免策略)
4)通過破除死鎖四個必要條件之一,來防止死鎖產生,(預防策略)
C++多執行緒開發中,容易出現死鎖導致程式掛起的現象,
解決步驟分為三步:
1、檢測死鎖執行緒,
2、列印執行緒資訊,
3、修改死鎖程式,
行程(Process)和執行緒(Thread).
行程是具有一定獨立功能的程式關于某個資料集合上的一次運行活動,行程是系統進行資源分配和調度的一個獨立單位,擁有獨立的記憶體單元,執行緒是行程的一個物體,是CPU調度和分派的基本單位,它是比行程更小的能獨立運行的基本單位,但是不能獨立運行,必須依存在應用程式中,由應用程式提供多個執行緒執行控制,執行緒自己基本上不擁有系統資源,只擁有一點在運行中必不可少的資源(如程式計數器,一組暫存器和堆疊),但是它可與同屬一個行程的其他的執行緒共享行程所擁有的全部資源,一個執行緒可以創建和撤銷另一個執行緒,同一個行程中的多個執行緒之間可以并發執行,
行程與應用程式的區別在于應用程式作為一個靜態檔案存盤在計算機系統的硬碟等存盤空間中,而行程則是處于動態條件下由作業系統維護的系統資源管理物體,
行程的狀態轉換圖,及導致轉換的事件.
三個狀態:
1)就緒狀態 行程已獲得除處理機外的所需資源,等待分配處理機資源,只要分配到CPU就可執行,在某一時刻,可能有若干個行程處于該狀態,
2)運行狀態 占用處理機資源運行,處于此狀態的行程的數目小于等于CPU的數目,
3)阻塞狀態 由于行程等待某種條件(如I/O操作或行程同步),在條件滿足之前無法繼續執行,該事件發生前即使把處理機分配給該行程,也無法運行,
原文鏈接:https://blog.csdn.net/lz20120808/article/details/51707247
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/20699.html
標籤:Windows
下一篇:Windows終端利器Cmder
