Linux核心 同步

2021-10-23 16:13:58 字數 1913 閱讀 5010

核心同步方法

2.自旋鎖

3.訊號量

4.互斥體

5.順序和屏障

6.其它

1.從2.0開始,linux開始支援多處理器

2.所謂臨界區就是訪問和操作共享資料的**段

3.我們應該不讓兩個執行執行緒在同乙個臨界區同時執行

4.i++的機器指令步驟

5.核心為我們實現了一些原子操作的介面

6.乙個鎖被高度爭用,會嚴重降低系統效能

7.鎖爭用嚴重時,加鎖太粗不好,鎖爭用不嚴重時,加鎖太細也不好,在小型機上,cpu核數較少,爭用也較少,加鎖太細有時也不好

在單處理器上,使用者程序可以被搶占並重新排程,如何被搶占的程序在臨界區,搶占的程序有去了臨界區,就會產生競爭,這種叫偽併發

在多處理器上,程序可以同時執行,叫做真併發

對核心而言,如果核心操作某個資源的時候,來了個中斷,中斷處理程式還要訪問這個資源,這就是個併發問題

程序互相等待資源,誰都無法執行,預防死鎖最基本的是力求簡單,順序加鎖

原子操作是其它同步方法的基石,核心提供了兩組原子操作介面

⑴原子整數操作

1.針對整數的原子操作只能對atomic_t型別的資料進行處理,而沒有直接使用c語言的int型別,但是我們可以將它轉換成int型別

2.原子整數操作最常見的操作就是計數器

3.atomic_t有32位和64位實現,為了提高移植性,我們應該使用32位的實現

⑵原子位操作

原子位操作函式是對普通的記憶體位址進行訪問,它的引數是乙個指標和乙個位號,只要指標指向了乙個資料,我們就可以對資料進行原子性操作

1.linux核心中最常見的鎖是自旋鎖,如果乙個執行緒試圖獲得乙個被占用的鎖,就會一直自旋等待鎖重新可用,自旋鎖等待的過程會浪費處理器時間(★),不適合長期持有

2.中斷處理程式不可以睡眠,所以不能使用訊號量製作的鎖,可以使用自旋鎖

3.在中斷處理程式中使用鎖時,要先禁止當預處理器中斷,防止中斷處理器打斷持有鎖的核心**,但是它又獲取不到鎖,所以一直自旋,但是鎖的持有者又不可能在中斷處理程式完成前釋放鎖,就會造成死鎖,如果再不同處理器那麼沒有這個問題,所以只需禁止當預處理器中斷

4.自旋鎖的方法列表:

5.讀/寫自旋鎖,可以同時讀,但是不能夠同時讀寫,和同時寫,另外不要在讀鎖裡面巢狀寫鎖,因為寫鎖會自旋到讀鎖釋放鎖,這樣會死鎖

1.訊號量適合加鎖時間比較長,或者**在持有鎖時會睡眠的情況

2.若果有乙個任務試圖獲得乙個已經被占用的訊號量的時候,就讓出cpu去乙個等待佇列睡眠,訊號量釋放時喚醒這個任務

3.由於執行緒回去睡眠,所以在中斷上下文中不能使用,因為中斷上下文中線程無法排程

4.占用訊號量的時候不能占有自旋鎖

5.訊號量的同時持有鎖數量可以有多個

6.訊號量方法列表:

7.訊號量也有讀寫訊號量,讀寫訊號量都是互斥訊號量

互斥體是指任何可以睡眠的強制互斥鎖,比如乙個二元訊號量,任何時候只有乙個任務可以持有

什麼時候使用自旋鎖,什麼時候使用互斥體:

為了防止指令重排序,我們可以加入記憶體屏障機制

在單執行緒情況下,指令重排序不會有問題,但是在多處理器情況下就會有問題了,所以linux核心提供了防止重排序的機制

1.linux也有類似於wait,notify的功能,叫做完成變數

2.linux2.6版本引入了順序鎖,寫入時將計數+1,讀取前後都讀取計數,如果計數相同,說明沒有被打斷,如果讀很多,寫很少但是寫優先的時候可以考慮使用

Linux核心同步

在linux核心裡記憶體可以和硬碟空間通用的,當記憶體利用很少時,資料可以存到記憶體裡,反之硬碟空間可以用來當記憶體用但是有個共同點資料總是現在記憶體裡操作再寫回到硬碟上的。由於這個原因,塊儲存裝置被當成後備儲存器。linux 提供了兩種操作的方法 1 後台程序不停的檢查系統記憶體週期性的寫操作 2...

Linux核心同步方法

1 原子操作,是其它同步方法的基礎。2 自旋鎖,執行緒試圖獲取乙個已經被別人持有的自旋鎖,當前執行緒處於忙等待,占用cpu資源。3 讀寫自旋鎖,根據通用性和針對性的特點,普通自旋鎖在特定場景下的表現會退化。因此,提供了讀寫自旋鎖,讀鎖可以加讀鎖,不能加寫鎖,寫鎖不能加任何鎖。4 需要注意的幾項 普通...

Linux核心學習筆記 核心同步

linux核心中執行的程式,時刻都要防止併發引起的競態。這將會導致資料結構被破壞,嚴重的時候會引起核心崩潰。所以核心同步技術對核心開發的驅動程式來說非常重要。不懂核心同步技術的人,是寫不出安全健壯的核心驅動程式來的。在學習核心同步技術之前需要掌握一下幾個概念。1 並行,併發與競態 在smp執行的li...