linux鎖學習記錄

2021-07-26 11:37:28 字數 1670 閱讀 6672

臨界區和競爭條件:

所謂的臨界區,就是訪問和操作共享資料的額**段,多個執行執行緒併發訪問同乙個資源通常是不安全的。為了避免在臨界區中併發的執行,必須保證這些**原子的執行。如果兩個執行執行緒有可能處於同一臨界區中同事執行,那麼這就是程式的bug,如果情況真的發生,就稱之為競爭條件。這種情況出現的機會往往非常小。

這樣,避免併發和防止競爭條件成為同步。

鎖是採用原子操作實現的,而原子操作不存在競爭,

造成併發執行的原因

使用者空間之所以需要同步,是因為使用者程式會被排程程式搶占和重新排程。由於使用者程序可能在任何時刻被搶占,而排程程式完全可能選擇另乙個高優先順序的程序到處理器上執行,所以就會使得乙個程式正在處於臨界區時,被非自願的搶占了。如果重新排程的程序隨後也進入同乙個臨界區,前後兩個程序相互之間就會產生競爭。另外,因為訊號處理是非同步發生的,所以,即使是單執行緒的多個程序共享檔案,或者在乙個程式內部處理訊號,也有可能產生競爭條件。

核心中有類似可能造成併發執行的原因。

中斷——幾乎可以在任何時刻非同步,打斷當前正在執行的**。

軟中斷和tasklet——核心能在任何時刻喚醒或者重新排程軟中斷和tasklet。打斷當前正在執行的**

核心搶占——核心具有搶占性。

睡眠以及與使用者空間同步。

對稱多處理——兩個或多個處理器其可以同時執行**

因此存在如下的bug:

如果在一段核心**操作某一資源的時候系統產生了乙個中斷,而且該中斷的處理程式還要訪問這一資源,這就是乙個bug.

如果一段核心**在訪問乙個共享資源期間可以被搶占,這也是乙個bug.

如果核心**在臨界區里睡眠,那簡直就是故障歡迎競爭條件的

實際上,真正有挑戰性的地方在於辨認出真正需要共享的資料和相應的臨界區,記住,在開始設計**的時候就要考慮加入鎖。

在編寫**的開始階段就要設計恰當的鎖。

重要的是了解需要保護寫什麼。

對於大對數的核心資料來說都是需要加鎖的。如果有其他執行執行緒可以訪問這些資料,那麼這些資料就要加上某種形式的鎖。切記,是要給資料枷鎖而不是要給**加鎖。

在編寫核心**的同時,需要考慮如下的問題:

這個資料是不是全域性的,除了當前進執行緒以外,其他執行緒能不能訪問他。

這個資料會不會在程序上下文和中斷上下文中共享。

程序在訪問資料時可不可能被搶占,被排程的程式會不會訪問同一資料

當前程序是不是會睡眠在某些資源上,如果會的話,此時的資料處於何種狀態

如何防止資料失控

如果函式在另乙個處理器上被排程還會怎麼樣

如何確保**遠離併發的威脅?

死鎖死鎖的產生需要一定的條件,要有乙個或多個執行的執行緒和乙個或多個資源。每個執行緒都在等待其中的乙個資源,但是所有的資源都已將被占用。執行緒之間相互等待。但他們永遠不會釋放已經占有的資源。

可以用一些簡單的規則來幫助避免死鎖

使用巢狀的鎖時必須保證以相同的順序獲取鎖,這樣可以阻止致命擁抱型別的鎖。

防止發生飢餓。

不要重複請求同乙個鎖

設計應力求簡單。

在**中使用鎖的地方,對鎖的獲取順序加上順序是個良好的習慣。

爭用和擴充套件性:

鎖的爭用會降低系統的效能,高度爭用的鎖會成為系統的瓶頸。

擴充套件性是對系統可擴充套件程度的乙個量度。

在設計之初加鎖方案應該力求簡單,僅當需要時再進一步細化方案

精髓在於力求簡單。

記錄就到這裡

愛你yz

linux 檔案記錄鎖

1.什麼是檔案記錄鎖?是對檔案某個範圍的鎖定 2.檔案記錄鎖的功能?當乙個程序正在讀或者修改檔案的某個部分的時候,它可以阻止其他程序修改同一檔案區 3.檔案記錄鎖的函式介面?fcntl 此系統呼叫可以用來對已開啟的檔案描述符進行各種控制操作以改變已開啟檔案的各種屬性,根據傳入不同的操作型別命令 cm...

UNIX LINUX程式設計學習之檔案鎖 記錄鎖

鎖定中的幾個概念 檔案鎖定的是整個檔案,而記錄鎖定只鎖定檔案的某一特定部分。unix 的記錄指的是從檔案的某一相對位置開始的一段連續的位元組流,它不同於其它以強制性記錄結構阻止檔案的作業系統,因此,unix 記錄鎖更恰當的稱呼應該是範圍鎖,它是對檔案某個範圍的鎖定。檔案和記錄鎖定可分為諮詢式鎖定和強...

LINUX 互斥鎖 學習

posix下抽象了乙個鎖型別的結構 ptread mutex t。通過對該結構的操作,來判斷資源是否可以訪問。顧名思義,加鎖 lock 後,別人就無法開啟,只有當鎖沒有關閉 unlock 的時候才能訪問資源。即物件互斥鎖的概念,來保證共享資料操作的完整性。每個物件都對應於乙個可稱為 互斥鎖 的標記,...