不再安全的 OSSpinLock

2021-07-16 09:43:44 字數 1559 閱讀 7047

osspinlock 的問題

2015-12-14 那天, swift-dev 

郵件列表裡 有人在討論 weak 屬性的執行緒安全問題,其中有幾位蘋果工程師透露了自旋鎖的問題,對話內容大致如下:

新版 ios 中,系統維護了 5 個不同的執行緒優先順序 /qos: background , utility , default , user-initiated , user-interactive 。高優先順序執行緒始終會在低優先順序執行緒前執行,乙個執行緒不會受到比它更低優先順序執行緒的干擾。這種執行緒排程演算法會產生潛在的優先順序反轉問題,從而破壞了 spin lock 。

具體來說,如果乙個低優先順序的執行緒獲得鎖並訪問共享資源,這時乙個高優先順序的執行緒也嘗試獲得這個鎖,它會處於 spin lock 的忙等狀態從而占用大量 cpu 。此時低優先順序執行緒無法與高優先順序執行緒爭奪 cpu 時間,從而導致任務遲遲完不成、無法釋放 lock 。這並不只是理論上的問題, libobjc 已經遇到了很多次這個問題了,於是蘋果的工程師停用了 osspinlock 。

蘋果工程師 greg parker 提到,對於這個問題,一種解決方案是用 truly unbounded backoff 演算法,這能避免 livelock 問題,但如果系統負載高時,它仍有可能將高優先順序的執行緒阻塞數十秒之久;另一種方案是使用 handoff lock 演算法,這也是 libobjc 目前正在使用的。鎖的持有者會把執行緒 id 儲存到鎖內部,鎖的等待者會臨時貢獻出它的優先順序來避免優先順序反轉的問題。理論上這種模式會在比較複雜的多鎖條件下產生問題,但實踐上目前還沒有遇到問題。

libobjc 裡用的是 mach 核心的 thread_switch() 然後傳遞了乙個 mach thread port 來避免優先順序反轉,另外它還用了乙個私有的引數選項,所以開發者無法自己實現這個鎖。另一方面,由於二進位制相容問題, osspinlock 也不能有改動。

最終的結論就是,除非開發者能保證訪問鎖的執行緒全部都處於同一優先順序,否則 ios 系統中所有型別的自旋鎖都不能再使用了。

為了找到乙個替代方案,我做了乙個簡單的效能測試,對比了一下幾種能夠替代 osspinlock 鎖的效能。測試是在 iphone6 、 ios9 上跑的,**在 這裡 。我嘗試了不同的迴圈次數,結果並不都一樣,我猜這可能是與 cpu cache 有關,所以這個結果只能當作乙個定性分析。

可以看到除了 osspinlock 外, dispatch_semaphore 和 pthread_mutex 效能是最高的。有 訊息 稱,蘋果在新系統中已經優化了 pthread_mutex 的效能,所以它看上去和 osspinlock 差距並沒有那麼大了。

蘋果google

google/ protobuf 內部的 spinlock 被全部 替換為 dispatch_semaphore ,詳情可以看這個提交:  。用 dispatch_semaphore 而不用 pthread_mutex 應該是出於效能考慮。

其他專案

因為 osspinlock 出現這種問題的機率很小,也沒有引起很大的重視,我所能找到的也只有 reactivecocoa 在討論這個問題。

改變心態 讓技術安全工作不再枯燥

每天技術安全工作者,都要進行合理其仔細的工作規劃。一般情況下,大家上午的創造思維就是十分活躍的,技術安全工作中強度較高且較難的工作,都可安排在上午完成。為保證技術安全群體的工作效率,大家還要進行必要午休。在 下午工作低沉期 的時候,大家就會遇到困倦的問題,因此必要工作間隙休息就是十分關鍵的。通過短暫...

安全專家稱不再向廠商免費提供漏洞資訊

北京時間3月25日訊息,據國外 報道,日前三個業界知名安全專家稱,對於商用產品中發現的漏洞資訊,不再向廠商免費提供。安全專家迪諾 佐威 dino dai zovi 查理 公尺勒 charlie miller 和亞歷克斯 索特威 alex sotirov 表示,不再向廠商免費提供其產品中的安全漏洞資訊...

HTTPS加密連線不再安全 新攻擊可輕鬆繞過

http,即超文字傳輸協議,是網際網路上應用最為廣泛的一種網路協議。然而http協議以明文方式傳送內容,不提供任何方式的資料加密,這導致這種方式特別不安全。對此便衍生出能夠為資料傳輸提供安全的https 超文字加密傳輸協議 https一度成為各大 推崇的主流加密協議。https加密連線也不再安全 不...