(筆記)Linux內核學習(六)之併發和同步概念

一 臨界區和競爭條件數據結構

       臨界區:訪問和操做共享數據的代碼段。併發

       競爭條件:多個執行線程處於同一個臨界區中。性能

    

 

  處於競爭條件:形成訪問的數據或者資源不一致狀態:大數據

對資源i的訪問:ProcessA和B訪問後獲得正確的結果應該是9:spa

                    

 

進程是併發執行,有可能獲得的結果是:8線程

     

    

 

防止這種狀況的發生:保證對資源的訪問原子操做。設計

二 加鎖blog

       鎖:採用原子操做實現,原子操做不存在競爭。進程

      

    

 

形成併發緣由:資源

  l  中斷:隨時能夠打斷當前執行的進程代碼;

  l  軟中斷和tasklet:任什麼時候刻能喚醒調度軟中斷和tasklet,打斷當前正在執行的代碼;

  l  內核搶佔:當前任務被搶佔;

  l  進程睡眠:喚醒調度程序,執行新的進程;

  l  多處理器:同時執行代碼。

 

  針對資源併發競爭條件的存在,須要對資源進行保護,保證資源的訪問操做是原子的。

須要弄清楚哪些數據須要被保護,要試圖弄清楚資源會不會被併發的訪問操做。

 

三 死鎖

       多個執行線程互相等待被對方佔用的資源,但永遠不會釋放各自擁有的資源,致使衆線程永遠沒法獲得執行。

    

 

出現死鎖是件很危險的事情,預防死鎖:

  l  加鎖順序保持一致;

  l  防止發生飢餓措施;

  l  不要重複請求同一個鎖;

  l  複雜加鎖方案形成死鎖機率較大——設計鎖力求簡單;

四 鎖的粒度

       加鎖粒度:描述加鎖保護的數據規模;

              過粗的鎖:保護大塊數據,如子系統全部數據結構;

              精細的鎖:保護小塊數據,一個大數據結構中的一個元素;

       在粗糙與精細之間須要平衡:精細的鎖複雜開銷大,良好擴展性:從單核到多核,爲提升性能,鎖得機制變得更細。

  保護數據不被併發的訪問,加鎖你的代碼。恰當的加鎖:知足不死鎖、可擴展、清晰簡潔。

相關文章
相關標籤/搜索