日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

Linux 核心--12.Linux內(nèi)核機(jī)制( 三 )




11.5Buzz 鎖
它使用更頻繁的名字叫自旋鎖 。這是一種保護(hù)數(shù)據(jù)結(jié)構(gòu)或代碼片段的原始方式 。在某個(gè)時(shí)刻只允許一個(gè)進(jìn)程訪問(wèn)臨界區(qū)內(nèi)的代碼 。Linux還同時(shí)將一個(gè)整數(shù)域作為鎖來(lái)限制對(duì)數(shù)據(jù)結(jié)構(gòu)中某些域的存取 。每個(gè)希望進(jìn)入 此區(qū)域的進(jìn)程都試圖將此鎖的初始值從0改成1 。如果當(dāng)前值是1則進(jìn)程將再次嘗試,此時(shí)進(jìn)程好象在一段緊循環(huán)代碼中自旋 。對(duì)包含此鎖的內(nèi)存區(qū)域的存取必須是原子性的,即檢驗(yàn)值是否為0并將其改變成1的過(guò)程不能被任何進(jìn)程中斷 。多數(shù)CPU結(jié)構(gòu)通過(guò)特殊指令提供對(duì)此方式的支持,同時(shí)我們可以在一個(gè)非緩沖主存中實(shí)現(xiàn)這個(gè)流言鎖 。

當(dāng)控制進(jìn)程離開(kāi)臨界區(qū)時(shí)它將遞減此Buzz鎖 。任何處于自旋狀態(tài)的進(jìn)程都可以讀取它,它們中最快的那個(gè)將遞增此值并進(jìn)入臨界區(qū) 。


11.6信號(hào)燈
信號(hào)燈被用來(lái)保護(hù)臨界區(qū)中的代碼和數(shù)據(jù) 。請(qǐng)記住每次對(duì)臨界區(qū)數(shù)據(jù), 如描敘某個(gè)目錄VFS inode的訪問(wèn), 是通過(guò)代表進(jìn)程的核心代碼來(lái)進(jìn)行的 。允許某個(gè)進(jìn)程擅自修改由其他進(jìn)程使用的臨界區(qū)數(shù)據(jù)是非常危險(xiǎn)的 。防止此問(wèn)題發(fā)生的一種方式是在被存取臨界區(qū)周?chē)褂胋uzz鎖,但這種簡(jiǎn)單的方式將降低系統(tǒng)性能 。Linux使用信號(hào)燈來(lái)迫使某個(gè)時(shí)刻只有唯一進(jìn)程訪問(wèn)臨界區(qū)代碼和數(shù)據(jù),其他進(jìn)程都必須等待資源被釋放才可使用 。這些等待進(jìn)程將被掛起而系統(tǒng)中其他進(jìn)程可以繼續(xù)運(yùn)行 。

一個(gè)Linux semaphore結(jié)構(gòu)包含了以下信息:


count
此域用來(lái)保存希望訪問(wèn)此資源的文件個(gè)數(shù) 。當(dāng)它為正數(shù)時(shí)表示資源可用 。負(fù)數(shù)和0表示進(jìn)程必須等待 。當(dāng)它初始值為1時(shí)表示一次僅允許一個(gè)進(jìn)程來(lái)訪問(wèn)此資源 。當(dāng)進(jìn)程需要此資源時(shí)它們必須將此count 值減1并且在使用完后將其加1 。
waking
這是等待此資源的進(jìn)程個(gè)數(shù),同時(shí)也是當(dāng)資源可利用時(shí)等待被喚醒的進(jìn)程個(gè)數(shù) 。
wait queue
當(dāng)進(jìn)程等待此資源時(shí),它們被放入此等待隊(duì)列 。
lock
訪問(wèn)waking域時(shí)使用的buzz鎖 。
假設(shè)此信號(hào)燈的初始值為1,第一個(gè)使用它的進(jìn)程看到此記數(shù)為正數(shù),然后它將其減去1而得到0 ?,F(xiàn)在此進(jìn)程 擁有了這些被信號(hào)燈保護(hù)的段代碼和資源 。當(dāng)此進(jìn)程離開(kāi)臨界區(qū)時(shí)它將增加此信號(hào)燈的記數(shù)值,最好的情況 是沒(méi)有其他進(jìn)程與之爭(zhēng)奪臨界區(qū)的控制權(quán) 。Linux將信號(hào)燈設(shè)計(jì)成能在多數(shù)情況下有效工作 。

如果此時(shí)另外一個(gè)進(jìn)程希望進(jìn)入此已被別的進(jìn)程占據(jù)的臨界區(qū)時(shí),它也將此記數(shù)減1 。當(dāng)它看到此記數(shù)值為-1 則它知道現(xiàn)在不能進(jìn)入臨界區(qū), 必須等待到此進(jìn)程退出使用臨界區(qū)為止 。在這個(gè)過(guò)程中Linux將讓這個(gè)等待 進(jìn)程睡眠 。等待進(jìn)程將其自身添加到信號(hào)燈的等待隊(duì)列中然后系統(tǒng)在一個(gè)循環(huán)中檢驗(yàn)waking域的值并當(dāng)waking非0時(shí)調(diào)用調(diào)度管理器 。

臨界區(qū)的所有者將信號(hào)燈記數(shù)值加1,但是如果此值仍然小于等于0則表示還有等待此資源的進(jìn)程在睡眠 。在 理想情況下此信號(hào)燈的記數(shù)將返回到初始值1而無(wú)需做其他工作 。所有者進(jìn)程將遞增waking記數(shù)并喚醒在此 信號(hào)燈等待隊(duì)列上睡眠的進(jìn)程 。當(dāng)?shù)却M(jìn)程醒來(lái)時(shí),它發(fā)現(xiàn)waking記數(shù)值已為1,那么它知道現(xiàn)在可以進(jìn)入臨界區(qū)了 。然后它將遞減waking記數(shù),將其變成0并繼續(xù) 。所有對(duì)信號(hào)燈waking域的訪問(wèn)都將受到使用信號(hào)燈 的buzz鎖的保護(hù) 。

推薦閱讀