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