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 閱讀(109) 評論(0)  編輯  收藏 所屬分類: 2016-thinking
          主站蜘蛛池模板: 苏尼特右旗| 金华市| 长垣县| 保德县| 平顺县| 深圳市| 浏阳市| 双柏县| 泉州市| 柏乡县| 沁水县| 惠州市| 兰坪| 阜城县| 江源县| 出国| 松江区| 公主岭市| 钟祥市| 常山县| 呼图壁县| 巴中市| 萍乡市| 阿合奇县| 邵东县| 天峨县| 大石桥市| 咸阳市| 清远市| 山丹县| 仪征市| 璧山县| 藁城市| 静安区| 尉犁县| 衡水市| 嫩江县| 陈巴尔虎旗| 视频| 安新县| 保定市|