jinfeng_wang

          G-G-S,D-D-U!

          BlogJava 首頁 新隨筆 聯系 聚合 管理
            400 Posts :: 0 Stories :: 296 Comments :: 0 Trackbacks
          http://blog.csdn.net/dong976209075/article/details/8004325

          理論上:

          mutex和spinlock都是用于多進程/線程間訪問公共資源時保持同步用的,只是在lock失敗的時候處理方式有所不同。首先,當一個thread 給一個mutex上鎖失敗的時候,thread會進入sleep狀態,從而讓其他的thread運行,其中就包裹已經給mutex上鎖成功的那個thread,被占用的lock一旦釋放,就會去wake up 那個sleep的thread。其次,當一個thread給一個spinlock上鎖失敗的時候,thread會在spinlock上不停的輪訊,直到成功,所以他不會進入sleep狀態(當然,時間片用完了,內核會自動進行調度)。


          存在的問題:

          無論是mutex還是spinlock,如果一個thread去給一個已經被其他thread占用的鎖上鎖,那么從此刻起到其他thread對此鎖解鎖的時間長短將會導致mutex和spinlock出現下面的問題。

          mutex的問題是,它一旦上鎖失敗就會進入sleep,讓其他thread運行,這就需要內核將thread切換到sleep狀態,如果mutex又在很短的時間內被釋放掉了,那么又需要將此thread再次喚醒,這需要消耗許多CPU指令和時間,這種消耗還不如讓thread去輪訊。也就是說,其他thread解鎖時間很短的話會導致CPU的資源浪費。

          spinlock的問題是,和上面正好相反,如果其他thread解鎖的時間很長的話,這種spinlock進行輪訊的方式將會浪費很多CPU資源。


          解決方法:

          對于single-core/single-CPU,spinlock將一直浪費CPU資源,如果采用mutex,反而可以立刻讓其他的thread運行,可能去釋放mutex lock。對于multi-core/mutil-CPU,會存在很多短時間被占用的lock,如果總是去讓thread sleep,緊接著去wake up,這樣會浪費很多CPU資源,從而降低了系統性能,所以應該盡量使用spinlock。


          現實情況:

          由于程序員不太可能確定每個運行程序的系統CPU和core的個數,所以也不可能去確定使用那一種lock。因此現在的操作系統通常不太區分mutex和spinlock了。實際上,大多數現代操作系統已經使用了混合mutex(hybrid mutex)和混合spinlock(hybrid spinlock)。說白了就是將兩者的特點相結合。


          hydrid mutex:在一個multi-core系統上,hybrid mutex首先像一個spinlock一樣,當thread加鎖失敗的時候不會立即被設置成sleep,但是,當過了一定的時間(或則其他的策略)還沒有獲得lock,就會被設置成sleep,之后再被wake up。而在一個single-core系統上,hybrid mutex就不會表現出spinlock的特性,而是如果加鎖失敗就直接被設置成sleep。


          hybrid spinlock:和hybrid mutex相似,只不過,thread加鎖失敗后在spinlock一段很短的時間后,會被stop而不是被設置成sleep,stop是正常的進程調度,應該會比先讓thread sleep然后再wake up的開銷小一些。


          總結:

          寫程序的時候,如果對mutex和spinlock有任何疑惑,請選擇使用mutex。




          原文參考:http://stackoverflow.com/questions/5869825/when-should-one-use-a-spinlock-instead-of-mutex

          posted on 2016-12-14 13:52 jinfeng_wang 閱讀(103) 評論(0)  編輯  收藏 所屬分類: 2016-thinking
          主站蜘蛛池模板: 天水市| 玉林市| 尼玛县| 高要市| 宁远县| 张家口市| 姚安县| 汤阴县| 婺源县| 富源县| 平度市| 屏南县| 孟州市| 瓦房店市| 翁牛特旗| 宁河县| 叙永县| 林甸县| 天津市| 林芝县| 昌邑市| 册亨县| 武义县| 尼木县| 盱眙县| 三原县| 奈曼旗| 公安县| 尖扎县| 遵化市| 固始县| 龙陵县| 密云县| 大洼县| 亳州市| 云和县| 溧水县| 锡林浩特市| 宁德市| 昆山市| 宝坻区|