《Linux核心設計與實現》讀書筆記(九)- 核心同步介紹

來源:互聯網
上載者:User

存在共用資源(共用一個檔案,一塊記憶體等等)的時候,為了防止並發訪問時共用資源的資料不一致,引入了同步機制。

主要內容:

  1. 同步的概念
  2. 同步的方法-加鎖
  3. 死結
  4. 鎖的粒度

 

1. 同步的概念

瞭解同步之前,先瞭解另外2個概念:

  • 臨界區   - 也稱為臨界段,就是訪問和操作共用資料的程式碼片段。
  • 競爭條件 - 2個或2個以上線程在臨界區裡同時執行的時候,就構成了競爭條件。

 

所謂同步,其實防止在臨界區中形成競爭條件。

如果臨界區裡是原子操作(即整個操作完成前不會被打斷),那麼自然就不會出競爭條件。

但在實際應用中,臨界區中的代碼往往不會那麼簡單,所以為了保持同步,引入了鎖機制。

 

2. 同步的方法-加鎖

為了給臨界區加鎖,保證臨界區資料的同步,首先瞭解一下核心中哪些情況下會產生並發。

 

核心中造成競爭條件的原因:

競爭原因

說明

中斷 中斷隨時會發生,也就會隨時打斷當前執行的代碼。如果中斷和被打斷的代碼在相同的臨界區,就產生了競爭條件
非強制中斷和tasklet 非強制中斷和tasklet也會隨時被核心喚醒執行,也會像中斷一樣打斷正在執行的代碼
核心搶佔 核心具有搶佔性,發生搶佔時,如果搶佔的線程和被搶佔的線程在相同的臨界區,就產生了競爭條件
睡眠及使用者空間的同步 使用者進程睡眠後,發送器會喚醒一個新的使用者進程,新的使用者進程和睡眠的進程可能在同一個臨界區中
對稱式多處理 2個或多個處理器可以同時執行相同的代碼

 

為了在編寫核心代碼時避免出現競爭條件,在編寫代碼之前就要考慮好臨界區在哪,以及怎麼加鎖

在編寫完代碼後再加鎖是非常困難的,很可能還會導致部分代碼重寫。

 

編寫核心代碼時,時時記著下面這些問題:

  1. 這個資料是不是全域的?除了當前線程以外,其他線程能不能訪問它?
  2. 這個資料會不會在進程上下文或者中斷上下文中共用?它是不是要在兩個不同的中斷處理常式中共用?
  3. 進程在訪問資料時可不可能被搶佔?被調度的新程式會不會訪問同一資料?
  4. 當前進程會不會睡眠(或者阻塞)在某些資源上,如果是,它會讓共用資料處於何種狀態?
  5. 怎樣防止資料失控?
  6. 如果這個函數又在另一個處理器上被調度將會發生什嗎?

 

3. 死結

死結就是所有線程都在相互等待釋放資源,導致誰也無法繼續執行下去。

下面一些簡單的規則可以協助我們避免死結:

  1. 如果有多個鎖的話,盡量確保每個線程都是按相同的順序加鎖,按加鎖相反的順序解鎖。(即加鎖a->b->c,解鎖c->b->a)
  2. 防止發生饑餓。即設定一個逾時時間,防止一直等待下去。
  3. 不要重複請求同一個鎖。
  4. 設計應力求簡單。加鎖的方案越複雜就越容易出現死結。

 

4. 鎖的粒度

在加鎖的時候,不僅要避免死結,還需要考慮加鎖的粒度。

鎖的粒度對系統的可擴充性有很大影響,在加鎖的時候,要考慮一下這個鎖是否會被多個線程頻繁的爭用。

如果鎖有可能會被頻繁爭用,就需要將鎖的粒度細化。

細化後的鎖在多處理器的情況下,效能會有所提升。

 

舉個例子說明一下:比如給一個鏈表加鎖,同時有A,B,C 3個線程頻繁訪問這個鏈表。

那麼當A,B,C 3個線程同時訪問這個鏈表時,如果A獲得了鎖,那麼B,C線程只能等待A釋放了鎖後才能訪問這個鏈表。

 

如果A,B,C 3個線程訪問的是這個鏈表的不同節點(比如A是修改節點listA,B是刪除節點listB,C是追加節點listC),

並且這3個節點不是連續的,那麼3個線程同時運行是不會有問題的。

 

這種情況下就可以細化這個鎖,把加在鏈表上的鎖去掉,改成把鎖加在鏈表的每個節點上。(也就是鎖粒度的細化)

那麼,上述的情況下,A,B,C 3個線程就可以同時訪問各自的節點,特別是在多處理器的情況下,效能會有顯著提高。

 

最後還有一點需要提醒的是,鎖的粒度越細,系統開銷越大,程式也越複雜,所以對於爭用不是很頻繁的鎖,就沒有必要細化了。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.