您當前的位置:首頁 > 遊戲

程序,執行緒,互斥鎖和訊號量

作者:由 日拱一卒不期而至 發表于 遊戲時間:2022-09-20

瞭解過作業系統的大概都聽說過程序和執行緒的概念,那到底什麼是程序,什麼是執行緒,它們之間又有什麼關係呢?

簡單來說,程序是資源分配的最小單位,執行緒是排程執行的最小單位。一個程序可以包含一個或多個執行緒,這些執行緒共享所屬程序的資源(記憶體,CPU等)。

互斥鎖:

可以把程序想象成一套房子,房子裡的空間類似程序的記憶體空間,房間裡的設施類似程序的CPU處理資源。而執行緒就像是居住在這個房子裡的人們,房子裡可能住著一個人或多個人,當房子裡住有多個人時,這些人共享房子的空間及設施(浴室,廚房等)。那麼問題來了,房子裡的資源是有限的,如果有多個人想使用同一個資源,比如只有一間浴室,有兩個人在同一時間都想洗澡怎麼辦?我們一般會讓更緊急的那個人先洗,一個人在一個小時之後要去趕飛機,而另一個人沒有什麼緊急的事情,這種情況就是要趕飛機的人優先順序更高。那如果兩個人都有緊急的事呢?這個時候一般是讓先準備好浴巾和換洗衣服的人去洗(換句話說就是等待最長時間的人)。

回到執行緒之間的資源競爭情況是怎樣的呢?看起來和人們競爭房子裡資源的情況頗為相似。我們知道,一個特定時間只能有一個執行緒佔用CPU(多核CPU可以同時執行多個執行緒,但每個核在特定的時間只能執行一個執行緒), 執行緒之間怎麼去競爭有限的資源呢?一般情況下有兩個原則:

1。 優先順序更高的執行緒先執行

2。 優先順序相同的執行緒,讓等待更久的那個

執行緒先執行

讓我們再回到房子裡,一個人在浴室洗澡時如何確保不會被另外一個人打斷?很簡單,在浴室裡的人可以把門反鎖,只有當他洗完澡開啟門鎖,另外一個人才能進入浴室。總之浴室的狀態有且只有兩種,裡面沒人並且沒有上鎖;裡面有人並且門被上鎖。想進入浴室的人必須先確認門鎖的狀態,當沒有上鎖的時候才能進入。同樣的對於執行緒來說也是一樣,如果某個資源我們不希望被兩個或多個執行緒同時使用(比如兩個執行緒會執行相同的程式碼段),我們就可以使用互斥鎖(Mutex)。當某個執行緒需要訪問該資源時需要先獲取鎖並把Mutex上鎖,等訪問完畢再釋放Mutex。這樣當其他執行緒想訪問該共享資源時需要先獲取鎖的狀態,如果Mutex是上鎖的狀態,它就需要等Mutex釋放後才能獲取鎖然後訪問該資源。

訊號量:

讓我們考慮另外一種資源,這種資源同一時間可以被多個人使用。比如廚房,假設廚房內同時可以容納三個人。我們該怎麼管理廚房的使用呢?我們可以給廚房配備三把鑰匙,並且把三把鑰匙掛在廚房門外。當有人要進入廚房時就取下一把鑰匙進入廚房,然後把廚房門上鎖,出來的時候再把鑰匙重新掛到門外。這樣以來當有人想進入廚房時需要先看一下門外是否還有鑰匙,有的話就可以取下一把鑰匙並進入廚房,否則就只能在門外等待直到有人從廚房裡出來。如果有多人在門外等待的話,就要看這些人對使用廚房的緊急度以及等待時間的長短。

明眼的同學應該已經看出來了,這種機制在作業系統裡稱為訊號量(或訊號燈)。當某個資源可以同時被多個執行緒訪問時我們就可以使用訊號量,當一個執行緒想要訪問該資源時需要先看一下訊號量的值是否大於0,如果大於0就把訊號量的值減1(P操作),然後就可以訪問該資源,等訪問完後再把訊號量的值加1(V操作)。如果當前訊號量的值為0,想要訪問共享資源的執行緒只能等待其他執行緒訪問完畢後(執行V操作後)才能訪問。

對Linux, Qnx,Hypevisor或者智慧座艙感興趣的朋友歡迎關注公眾號“日拱一卒不期而至”,我們一起學習交流。

標簽: 執行緒  廚房  資源  訊號量  訪問