歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux綜合 >> Linux內核 >> linux內核之內核同步

linux內核之內核同步

日期:2017/3/3 12:59:34   编辑:Linux內核

首先簡單說明一下內核為什麼要進行同步

同步的主要目的是為了解決資源競爭的問題,特別是在smp體系結構,內核可搶占模式下,搶占無處不在,多核並行執行程序

隨時隨地都有可能訪問臨界資源,如果不好好處理,必然會出現很多問題。

比如,在單核情況下,某個進程搜索task鏈表,另一個進程插入或刪除或修改task鏈表,那麼可能會出現同時(內核搶占)訪問task鏈表的情況,那麼搜索task的進程可能就會有錯誤的結果,

再比如,在多核情況下,還是上面的情況,兩個進程訪問task鏈表,並且在兩個CPU上,那麼會出現真正的同時訪問task的可能,更加容易出錯。

更不要說多核內核可搶占情況下,出現錯誤的可能會更大。

所以,在訪問可能會被其他進程訪問的資源時,需要做到同步。需要注意的事,在編碼階段和開發前期就要考慮好各種同步情況,一旦在開發結束後發現同步bug將會非常難以調試(因為不容易重現)。

而原子操作與鎖能夠很好的解決這個問題

內核在處理同步問題上有幾種非常好用的方法,下面我慢慢介紹

原子操作一般用於對整形數據的操作,保證操作過程中不會被打斷

自旋鎖

自旋鎖之間的代碼能保證不被競爭,但是自旋鎖不能睡眠,所以自旋鎖最好用在耗時少且不能睡眠的過程中,比如中斷(注意,自旋鎖用來鎖數據而不是代碼)

信號量

讀寫信號量

互斥體

一般情況下,互斥體能完全代替信號量,只有當有特殊要求,能發出多個競爭資源時用信號量

完成變量

互斥變量能取代完全變量

順序和屏障

還有 大內核鎖 順序鎖 禁止內核搶占等方法

但是用少這裡就不介紹了

最常用的還是自旋鎖和互斥信號量還有原子操作

Copyright © Linux教程網 All Rights Reserved