計算機操做系統鎖機制.算法
在多線程編程中,操做系統引入了鎖機制。經過鎖機制,可以保證在多核多線程環境中,在某一個時間點上,只能有一個線程進入臨界區代碼,從而保證臨界區中操做數據的一致性。編程
所謂的鎖,能夠理解爲內存中的一個整型數,擁有兩種狀態:空閒狀態和上鎖狀態。加鎖時,判斷鎖是否空閒,若是空閒,修改成上鎖狀態,返回成功;若是已經上鎖,則返回失敗。解鎖時,則把鎖狀態修改成空閒狀態。
加鎖過程用以下僞碼錶示:
一、read lock;
二、判斷lock狀態;
三、若是已經加鎖,失敗返回;
四、把鎖狀態設置爲上鎖;
五、返回成功。
雖然每一步是原子性的,可是每一步之間倒是能夠中斷的。好比進程A在執行完2後發生中斷,中斷中進程B也執行了加鎖過程,返回中斷後就會發生兩個進程都會加鎖。
對於這個問題,計算機已經解決,方法是採用原子級彙編指令test and set 和swap。多線程
死鎖的概念.併發
死鎖: 是指兩個或兩個以上的進程在執行過程當中,因爭奪資源而形成的一種互相等待的現象,若無外力做用,它們都將沒法推動下去.此時稱系統處於死鎖狀態或系統產生了死鎖,這些永遠在互相等待的進程稱爲死鎖進程.
好比 兩隻羊過獨木橋。進程比做羊,資源比做橋。若兩隻羊各執己見,爭着過橋,就產生死鎖。操作系統
死鎖的緣由..net
主要緣由(1) 由於系統資源不足。(2) 進程運行推動的順序不合適,保證有前後順序。(3) 資源分配不當等。線程
死鎖的必要條件.blog
產生死鎖的四個必要條件:
(1) 互斥條件:一個資源每次只能被一個進程使用。
(2) 請求與保持條件:一個進程因請求資源而阻塞時,對已得到的資源保持不放。
(3) 不剝奪條件: 進程已得到的資源,在末使用完以前,不能強行剝奪。
(4) 循環等待條件:若干進程之間造成一種頭尾相接的循環等待資源關係。存在一個進程等待序列{P1,P2,…,Pn},其中P1等待P2所佔有的某一資源,P2等待P3所佔有的某一 源,……,而Pn等待P1所佔有的的某一資源,造成一個進程循環等待環。
這四個條件是死鎖的必要條件,只要系統發生死鎖,這些條件必然成立,而只要上述條件之一不知足,就不會發生死鎖。進程
解決死鎖的四個方式.
1)忽略該問題。例如鴕鳥算法,該算法能夠應用在極少發生死鎖的的狀況下。爲何叫鴕鳥算法呢,(鴕鳥策略)
2)檢測死鎖而且恢復。(檢測與解除策略)
3)仔細地對資源進行動態分配,以免死鎖。(避免策略)
4)經過破除死鎖四個必要條件之一,來防止死鎖產生。(預防策略)事件
C++多線程開發中,容易出現死鎖致使程序掛起的現象。
解決步驟分爲三步:
一、檢測死鎖線程。
二、打印線程信息。
三、修改死鎖程序。
進程(Process)和線程(Thread).
進程是具備必定獨立功能的程序關於某個數據集合上的一次運行活動,進程是系統進行資源分配和調度的一個獨立單位。擁有獨立的內存單元。線程是進程的一個實體,是CPU調度和分派的基本單位,它是比進程更小的能獨立運行的基本單位。可是不能獨立運行,必須依存在應用程序中,由應用程序提供多個線程執行控制。線程本身基本上不擁有系統資源,只擁有一點在運行中必不可少的資源(如程序計數器,一組寄存器和棧),可是它可與同屬一個進程的其餘的線程共享進程所擁有的所有資源。一個線程能夠建立和撤銷另外一個線程,同一個進程中的多個線程之間能夠併發執行。
進程與應用程序的區別在於應用程序做爲一個靜態文件存儲在計算機系統的硬盤等存儲空間中,而進程則是處於動態條件下由操做系統維護的系統資源管理實體。
進程的狀態轉換圖,及致使轉換的事件.
三個狀態:
1)就緒狀態 進程已得到除處理機外的所需資源,等待分配處理機資源,只要分配到CPU就可執行。在某一時刻,可能有若干個進程處於該狀態。
2)運行狀態 佔用處理機資源運行,處於此狀態的進程的數目小於等於CPU的數目。
3)阻塞狀態 因爲進程等待某種條件(如I/O操做或進程同步),在條件知足以前沒法繼續執行。該事件發生前即便把處理機分配給該進程,也沒法運行。
原文連接:https://blog.csdn.net/lz20120808/article/details/51707247