首先簡單說明一下內核為什麼要進行同步
同步的主要目的是為了解決資源競爭的問題,特別是在smp體系結構,內核可搶占模式下,搶占無處不在,多核並行執行程序
隨時隨地都有可能訪問臨界資源,如果不好好處理,必然會出現很多問題。
比如,在單核情況下,某個進程搜索task鏈表,另一個進程插入或刪除或修改task鏈表,那麼可能會出現同時(內核搶占)訪問task鏈表的情況,那麼搜索task的進程可能就會有錯誤的結果,
再比如,在多核情況下,還是上面的情況,兩個進程訪問task鏈表,並且在兩個CPU上,那麼會出現真正的同時訪問task的可能,更加容易出錯。
更不要說多核內核可搶占情況下,出現錯誤的可能會更大。
所以,在訪問可能會被其他進程訪問的資源時,需要做到同步。需要注意的事,在編碼階段和開發前期就要考慮好各種同步情況,一旦在開發結束後發現同步bug將會非常難以調試(因為不容易重現)。
而原子操作與鎖能夠很好的解決這個問題
內核在處理同步問題上有幾種非常好用的方法,下面我慢慢介紹
原子操作一般用於對整形數據的操作,保證操作過程中不會被打斷
自旋鎖
自旋鎖之間的代碼能保證不被競爭,但是自旋鎖不能睡眠,所以自旋鎖最好用在耗時少且不能睡眠的過程中,比如中斷(注意,自旋鎖用來鎖數據而不是代碼)
信號量
讀寫信號量
互斥體
一般情況下,互斥體能完全代替信號量,只有當有特殊要求,能發出多個競爭資源時用信號量
完成變量
互斥變量能取代完全變量
順序和屏障
還有 大內核鎖 順序鎖 禁止內核搶占等方法
但是用少這裡就不介紹了
最常用的還是自旋鎖和互斥信號量還有原子操作