内核中的竞争状态和互斥(简述)
生活随笔
收集整理的這篇文章主要介紹了
内核中的竞争状态和互斥(简述)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
以下內容源于朱有鵬《物聯網大講堂》課程的學習,如有侵權,請告知刪除。
一、概念
(1)競爭狀態(簡稱竟態);
(2)臨界段(某一段代碼,該代碼有可能造成并發,因此應該添加鎖。這段代碼應該盡可能地短)、互斥鎖、死鎖(由于互斥鎖使用不對,導致的后果);
(3)同步與并發(多CPU、(單cpu下)多任務、中斷)。
二、解決竟態的方法
(1)原子操作(automic_t,即不可分割的操作(以前認為原子不可以分割))
- 操作要么不開始,要么開始后就不會被打斷。
(2)信號量、互斥鎖;
- 程序可以休眠,即當前代碼運行條件不滿足,因此把cpu交出來,等到條件滿足時再使用cpu。
(3)自旋鎖;
- 程序不可以休眠,不會讓出CPU。這段時間很短,因此可以等待。
- (2)(3)可以“占用籃球場(CPU)與否”的例子來理解。
三、自旋鎖和信號量的使用要點
(1)自旋鎖不能遞歸
- 已經拿到自旋鎖后,不能再次獲取該鎖。
(2)自旋鎖可以用在中斷上下文(即中斷處理程序)(信號量不可以,因為當運行條件不滿足時,可能造成睡眠),但是在中斷上下文中獲取自旋鎖之前要先禁用本地中斷;
- 中斷上下文不能使用信號量,因為中斷上下文不參與調度,一旦開始就應該執行完,不應該在運行階段交出cpu。
(3)自旋鎖的核心要求
- 擁有自旋鎖的代碼必須不能睡眠,要一直持有CPU直到釋放自旋鎖;
(4)
- 信號量和讀寫信號量適合于保持時間較長的情況,它們會導致調用者睡眠,因此只能在進程上下文使用,而自旋鎖適合于保持時間非常短的情況,它可以在任何上下文使用。
- 如果被保護的共享資源只在進程上下文訪問,使用信號量保護該共享資源非常合適;如果對共享資源的訪問時間非常短,自旋鎖也可以。但是如果被保護的共享資源需要在中斷上下文訪問(包括底半部即中斷處理句柄和頂半部即軟中斷),就必須使用自旋鎖。
- 自旋鎖保持期間是不能被搶占的(所謂搶占,即優先級比其高),而信號量和讀寫信號量保持期間是可以被搶占的。
- 自旋鎖只有在內核可搶占或SMP(多處理器)的情況下才真正需要,在單CPU且不可搶占的內核下,自旋鎖的所有操作都是空操作。
總結
以上是生活随笔為你收集整理的内核中的竞争状态和互斥(简述)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 大数据生态
- 下一篇: TCP客户端和服务端