cas自旋鎖原理 自旋鎖的自旋鎖-原理?
自旋鎖的自旋鎖-原理?自旋鎖自旋鎖類似于互斥鎖,只是自旋鎖不會(huì)導(dǎo)致調(diào)用者睡眠。如果一個(gè)自旋鎖被另一個(gè)執(zhí)行單元持有,調(diào)用者總是在那里循環(huán),看它是否被持有自旋鎖的持有者是否已經(jīng)釋放了鎖,因此得名“self
自旋鎖的自旋鎖-原理?
自旋鎖
自旋鎖類似于互斥鎖,只是自旋鎖不會(huì)導(dǎo)致調(diào)用者睡眠。如果一個(gè)自旋鎖被另一個(gè)執(zhí)行單元持有,調(diào)用者總是在那里循環(huán),看它是否被持有
自旋鎖的持有者是否已經(jīng)釋放了鎖,因此得名“self spin”。它的功能是解決資源的互斥使用問(wèn)題。由于自旋鎖不會(huì)導(dǎo)致調(diào)用者睡眠,所以自旋鎖的效率比互斥鎖高很多。雖然它的效率高于互斥鎖,但它也有一些缺點(diǎn):1。自旋鎖總是占用CPU。它運(yùn)行所有的時(shí)間-自旋沒(méi)有得到鎖,所以它占用CPU。如果不能在短時(shí)間內(nèi)獲得鎖,無(wú)疑會(huì)降低CPU效率。
2. 使用自旋鎖時(shí),可能會(huì)導(dǎo)致死鎖。遞歸調(diào)用時(shí),可能導(dǎo)致死鎖。調(diào)用其他一些函數(shù)也可能導(dǎo)致死鎖,例如copyuutouuser()、copyufromuuser()、kmalloc()等,因此使用自旋鎖要謹(jǐn)慎。只有當(dāng)內(nèi)核是搶占式或SMP時(shí),才真正需要自旋鎖。在單CPU非搶占式內(nèi)核中,自旋鎖的操作為空。旋轉(zhuǎn)鎖適用于鎖用戶在短時(shí)間內(nèi)保持鎖。
互斥:線程將切換上下文,搶占CPU并將信號(hào)從休眠發(fā)送到運(yùn)行。
自旋鎖:線程總是在運(yùn)行(lock> unlock),死循環(huán)檢測(cè)鎖標(biāo)志位,機(jī)制并不復(fù)雜。
互斥鎖是一種睡眠等待鎖。例如,在雙核機(jī)器上,有兩個(gè)線程(線程a和線程b),分別在core0和
core1上運(yùn)行。假設(shè)線程a想要通過(guò)pthreadmutexLock操作來(lái)獲得關(guān)鍵區(qū)域的鎖。此時(shí),鎖被線程B持有,那么線程a將被阻塞
既然它是為了保護(hù)變量,那么它當(dāng)然是一個(gè)自旋鎖。我從來(lái)沒(méi)有見(jiàn)過(guò)一個(gè)變量可以用作兩個(gè)變量。我認(rèn)為你理解這個(gè)代碼有問(wèn)題。使用自旋鎖定和自旋鎖定解鎖的目的是為了確保程序運(yùn)行時(shí)對(duì)XXX進(jìn)行鎖定操作,不會(huì)有其他進(jìn)程更改此值,是為了確保數(shù)據(jù)的準(zhǔn)確性。您可以想象,如果沒(méi)有自旋鎖,代碼將運(yùn)行什么問(wèn)題。假設(shè)a、B兩個(gè)進(jìn)程同時(shí)打開(kāi)訪問(wèn),不使用自旋鎖,則XXXuulock=0,進(jìn)程a判斷是否(XXX)如果設(shè)備沒(méi)有使用,它將繼續(xù)下面的XXXucount操作,但如果此時(shí)CPU切換進(jìn)程,當(dāng)Count變?yōu)?時(shí),進(jìn)程還沒(méi)有時(shí)間放入XXXuu,進(jìn)程開(kāi)始運(yùn)行。然后B進(jìn)程也會(huì)認(rèn)為設(shè)備沒(méi)有被使用,它會(huì)執(zhí)行后續(xù)的操作。這樣,兩個(gè)進(jìn)程將同時(shí)訪問(wèn)設(shè)備。當(dāng)然,open和release可以同時(shí)訪問(wèn),只有當(dāng)spin正在運(yùn)行時(shí),鎖定時(shí),稍后訪問(wèn)的進(jìn)程才會(huì)被阻塞。假設(shè)進(jìn)程a訪問(wèn)open,進(jìn)程B訪問(wèn)release。您可以理解這種情況,因?yàn)檫M(jìn)程a和進(jìn)程B同時(shí)訪問(wèn)open函數(shù)。也許你能更好地理解這段代碼。因?yàn)閛pen和release在使用自旋鎖時(shí)使用相同的方法。自旋鎖與CPU系統(tǒng)無(wú)關(guān)。無(wú)論是單CPU還是多CPU,運(yùn)行結(jié)果都是一樣的。這種邏輯關(guān)系很難解釋。我不知道你是否明白我的意思。
linux自旋鎖使用時(shí)需要注意的幾個(gè)地方?
在X86平臺(tái)上,自旋鎖主要由處理器的鎖指令前綴實(shí)現(xiàn)。當(dāng)一個(gè)線程的指令訪問(wèn)內(nèi)存時(shí),其他線程的指令不能訪問(wèn)內(nèi)存。因此,在spinlock的初始化階段,lock變量中的值K被分配給1。鎖定時(shí),使用lock decl(x)指令將變量更改為互斥的0,并詢問(wèn)結(jié)果0是否分配給EFLAGS寄存器的相應(yīng)位。只有鎖定的線程會(huì)導(dǎo)致0,而其他線程不會(huì)。然后,通過(guò)判斷相應(yīng)的位來(lái)判斷是否加鎖。否則,循環(huán)將執(zhí)行l(wèi)ock decl(x),直到添加它為止。其中x是變量的地址。這是GCC的at&t語(yǔ)法的匯編。
spinlock自旋鎖是如何實(shí)現(xiàn)的?
自旋鎖使用原子指令操作內(nèi)存,內(nèi)存是所有內(nèi)核共享的空間。
中斷控制器的每個(gè)核心都有一個(gè),因此關(guān)閉中斷只能使核心不產(chǎn)生中斷。
如果我們想進(jìn)行核間鎖定,我們必須使用自旋鎖(不使用內(nèi)核結(jié)構(gòu))。
自旋鎖的機(jī)制非常簡(jiǎn)單,即在內(nèi)存中交換一個(gè)字的原子。如果交換成功,那么您就擁有了鎖。其他核也可以立即被“觀察到”。
如果交換失敗,則表示其他線程已經(jīng)有鎖,此線程將繼續(xù)嘗試,直到成功為止。
c 和nginx的自選鎖是真的自旋鎖么?
學(xué)習(xí)復(fù)雜技術(shù)必須通過(guò)簡(jiǎn)單的生活實(shí)例來(lái)理解,加深記憶,否則你永遠(yuǎn)不會(huì)掌握
!鎖用于高并發(fā)多線程模型,解決共享資源的安全問(wèn)題!防止數(shù)據(jù)錯(cuò)誤
!讓我們用例子來(lái)討論這些鎖定機(jī)制:2。條件鎖:也稱為條件變量鎖。當(dāng)兩個(gè)人去酒店吃飯,當(dāng)你去廁所,你發(fā)現(xiàn)有人(其他線程正在執(zhí)行)敲門(mén)。里面的人說(shuō):你先去吃飯,等我,我叫你哈!然后你回去等著?。](méi)有競(jìng)爭(zhēng)),等他準(zhǔn)備好給你打電話(喚醒線程),你就可以繼續(xù)執(zhí)行了
!4. 旋轉(zhuǎn)鎖:同一個(gè)場(chǎng)景,同一個(gè)坑!一個(gè)人已經(jīng)占了坑,但你很匆忙。你得把褲子拉出來(lái)。你該怎么辦?一直敲門(mén)(循環(huán)搜索看看你能不能拿到鎖),然后說(shuō),我趕時(shí)間!直到里面的人厭倦了出來(lái),你才進(jìn)去好好上廁所(執(zhí)行線程)!你一直在敲門(mén)(一直在使用CPU資源)
!有定時(shí)鎖、輪詢鎖、對(duì)象鎖、類鎖、顯示鎖、隱式鎖等。下次再舉個(gè)例子吧!別問(wèn)我為什么,因?yàn)槟氵€沒(méi)注意到我