核心同步介紹

2021-04-23 08:34:27 字數 2176 閱讀 7879

1.臨界區和競爭條件

所謂臨界區(critical region)就是訪問和操作共享資料的**段。為了避免在臨界區中併發訪問,必須保證這些**是原子地執行,即**在執行結束前不可被打斷,就如同整個臨界區是乙個不可分割的指令一樣。

如果兩個執行執行緒有可能處於同乙個臨界區中,稱為競爭條件(race condition)。

避免併發和防止競爭條件被稱為同步(synchronization)。

2.加鎖

共享資源是簡單變數的話,一些體系結構提供簡單的原子指令實現算術運算和比較之類的原子操作。比如要進行i++,多數處理器都提供了指令來原子地讀變數、增加變數然後再寫回變數。當共享資源是乙個複雜的資料結構時,競爭條件往往會使該資料結構遭到破壞。鎖機制可以防止併發執行,並且保護佇列不受競爭條件的影響。鎖的使用是自願的、非強制的,它完全屬於一種程式設計者自選的程式設計手段。

鎖有多種多樣的形式,而且加鎖的粒度範圍也各不相同。各種鎖機制之間的區別主要在於當鎖被爭用時(已被使用)的行為表現-----簡單的忙等或者使當前任務睡眠直到鎖可以用為止。

鎖採用原子操作實現的,而原子操作不存在競爭,其實現是與具體的體系結構密切相關的。幾乎所有的處理器都實現了測試和設定指令,這一指令測試整數的值,如果其值為0,就設定一新值。0意味著開鎖。

3.造成併發的原因

中斷       中斷幾乎可以在任何時刻非同步發生,也就是可能隨時打斷當前正在執行的**。

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

核心搶占      因為核心具有搶占性,所以核心中的任務可能會被另一任務搶占。

睡眠及使用者空間的同步      在核心執行的程序可能會睡眠,這就會喚醒排程程式從而導致排程乙個新的使用者程序執行。

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

在**的開始階段就要設計恰當的鎖!!

中斷安全**(interrupt-safe)   在中斷處理程式中能避免併發訪問的安全**

smp安全**(smp-safe)    在對稱多處理機中能避免併發訪問的安全**

搶占安全**(preempt-safe)  在核心搶占時能避免併發訪問的安全**。

4.保護的物件

執行執行緒的區域性資料僅僅被它本身訪問故不需要保護。

大部分核心資料結構都要加鎖!!如果有其他執行執行緒可以訪問這些資料,那麼就給這些資料加上某種形式的鎖;如果任何其他什麼東西能看到他,那麼就加鎖。

要給資料加鎖而不是**加鎖!!

在編寫核心**時,要對自己提出下面的問題:

這個資料是不是全域性的?除了當前執行緒,其他執行緒能不能訪問它?

這個資料會不會在程序上下文和中斷上下文中共享?它是否在兩個不同的中斷處理程式中共享?

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

當前程序是不是會睡眠(阻塞)在某些資源上?如果是,它會讓共享資料處於何種狀態?

怎樣費那個值資料失控?

如果這個函式又在另乙個處理器上被排程將會發生什麼呢?

你要對這些**作甚麼?

幾乎訪問所有的核心全域性變數和共享資料都要某種形式的同步方法。

5.死鎖

死鎖產生的條件:要有乙個或多個執行執行緒和乙個或多個資源,每個執行緒都在等待其中的乙個資源,但所有資源都已被占用。所以執行緒相互等待,但它們永遠不會釋放已經占有的資源。於是任何執行緒都無法繼續,死鎖發生。

自死鎖:如果乙個執行執行緒試圖去獲得乙個自己已經持有的鎖,它不得不等待鎖被釋放。但因為它正在忙著等待這個鎖,所以自己永遠也不會有機會釋放鎖,死鎖產生。

預防死鎖:

加鎖的順序是關鍵。使用巢狀的鎖時必須保證以相同的順序獲取鎖,這樣可以阻止致命擁抱型別的死鎖。最好能記錄下鎖的順序,以便其他人能照此順序使用。

防止發生飢餓。判斷這個**的執行是否會結束。如果a不發生,b要一直等待下去嗎?

不要重複請求同乙個鎖。

越複雜的加鎖方案越可能造成死鎖

。---設計應力求簡單。

儘管釋放鎖的順序與死鎖無關,但最好還是以獲得鎖的相反順序來釋放鎖。

6.爭用和擴充套件性

鎖的爭用(lock contention)是指當鎖正在被占用,有其他執行緒試圖奪得該鎖。

擴充套件性(scalability)是對系統可擴充套件成都的乙個度量。

加鎖的粒度用來描述加鎖保護的資料規模。乙個過粗的鎖保護大塊資料,比如乙個子系統的所有資料結構;乙個過細的鎖保護小塊資料,比如乙個大資料結構中的乙個元素。

九 核心同步介紹

9.1 臨界區和競爭條件 所謂臨界區就是訪問和操作共享資料的 段。如果兩個執行執行緒有可能處於同乙個臨界區中執行,那麼這就是程式中包含乙個bug,這種情況就是競爭條件。9.2.1 造成併發執行的原因 使用者空間之所以需要同步,是因為使用者程式會被排程程式搶占和重新排程,由於使用者程序可能在任何時刻被...

LINUX核心設計思想之核心同步介紹

併發共享資料是造成不穩定的一類隱患,而且這種錯誤一般難以跟蹤和排程 因此必須給核心同步以高度重視.8.1 臨界區和競爭條件 臨界區 訪問和操作共享資料的 段.同步 避免併發和防止競爭條件的策略.原子操作 確保每個事務的完整操作 是同步一種籠統策略說法.8.2 加鎖 鎖提供的就是這樣一種機制 它如同一...

linux核心設計與實現 核心同步介紹

小結 核心同步方法 順序和屏障 第10章 核心同步方法 臨界區 訪問和操作共享資料的 競爭條件 兩個執行執行緒有可能在同乙個臨界區中同時執行。同步 避免併發和防止競爭條件。鎖的形式和鎖的粒度各不相同,各個鎖機制之前的主要區別在於 當鎖被其他執行緒持有時,其他的行為表現。造成併發執行的原因 使用者空間...