<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

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

      存在共享資源(共享一個文件,一塊內存等等)的時候,為了防止并發訪問時共享資源的數據不一致,引入了同步機制。

      主要內容:

      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個線程就可以同時訪問各自的節點,特別是在多處理器的情況下,性能會有顯著提高。

       

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

      posted @ 2013-04-24 17:56  wang_yb  閱讀(5444)  評論(5)    收藏  舉報
      主站蜘蛛池模板: 亚洲成av人片色午夜乱码| 欧美成年性h版影视中文字幕| 国产精品爽爽va在线观看网站| 国产综合色产在线精品| 无码h黄肉动漫在线观看| 久久久久久九九99精品| 久久99国产精品尤物| 国精产品一区一区三区mba下载 | 欧美人成在线播放网站免费| 精品国产一区二区三区卡| 99久久精品视香蕉蕉| 欧美成人精品手机在线| 久久亚洲人成网站| 又色又污又爽又黄的网站| 奶头好大揉着好爽视频| 无码人妻aⅴ一区二区三区蜜桃 | 思思久99久女女精品| 精品午夜福利在线观看| 久久精品国产99久久久古代 | XXXXXHD亚洲日本HD| 欧美人与zoxxxx另类| 国产精品老熟女乱一区二区| 亚洲真人无码永久在线| 久久人人97超碰人人澡爱香蕉| 久久se精品一区精品二区国产| 国产国产久热这里只有精品| 国产欧美日韩免费看AⅤ视频| 亚洲午夜福利网在线观看| 精品无码专区久久久水蜜桃| 亚洲卡1卡2卡3精品| 偷拍一区二区三区在线视频| 无码国内精品人妻少妇| 精品亚洲欧美无人区乱码| 成人无码潮喷在线观看| 这里只有精品在线播放 | 国产精品国产三级在线专区| 国产精品美女久久久久久麻豆| 长丰县| 国产综合色在线精品| 国产伦码精品一区二区| 免费黄色大全一区二区三区|