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

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


immediate
immediate 底層處理過程的優(yōu)先級(jí)低于定時(shí)器底層處理過程,所以此類型任務(wù)將延遲運(yùn)行 。
scheduler
此任務(wù)隊(duì)列直接由調(diào)度管理器來處理 。它被用來支撐系統(tǒng)中其他任務(wù)隊(duì)列,此時(shí)可以運(yùn)行的任務(wù)是一個(gè)處理任務(wù)隊(duì)列的過程,如設(shè)備驅(qū)動(dòng) 。
當(dāng)處理任務(wù)隊(duì)列時(shí),處于隊(duì)列頭部的元素將從隊(duì)列中刪除同時(shí)以空指針代替它 。這個(gè)刪除操作是一個(gè)不可中斷的原子操作 。隊(duì)列中每個(gè)元素的處理過程將被依次調(diào)用 。這個(gè)隊(duì)列中的元素通常使用靜態(tài)分配數(shù)據(jù) 。然而并沒有一個(gè)固有機(jī)制來丟棄已分配內(nèi)存 。任務(wù)隊(duì)列處理例程簡(jiǎn)單的指向鏈表中下一個(gè)元素 。這個(gè)任務(wù)才真正清除任何已分配的核心內(nèi)存 。


11.3定時(shí)器(TIMER)



圖11.3 系統(tǒng)定時(shí)器


操作系統(tǒng)應(yīng)該能夠在將來某個(gè)時(shí)刻準(zhǔn)時(shí)調(diào)度某個(gè)任務(wù) 。所以需要一種能保證任務(wù)較準(zhǔn)時(shí)調(diào)度運(yùn)行的機(jī)制 。希望支持每種操作系統(tǒng)的微處理器必須包含一個(gè)可周期性中斷它的可編程間隔定時(shí)器 。這個(gè)周期性中斷被稱為系統(tǒng)時(shí)鐘滴答,它象節(jié)拍器一樣來組織系統(tǒng)任務(wù) 。

Linux的時(shí)鐘觀念很簡(jiǎn)單:它表示系統(tǒng)啟動(dòng)后的以時(shí)鐘滴答記數(shù)的時(shí)間 。所有的系統(tǒng)時(shí)鐘都基于這種量度,在 系統(tǒng)中的名稱和一個(gè)全局變量相同-jiffies 。

Linux包含兩種類型的系統(tǒng)定時(shí)器,它們都可以在某個(gè)系統(tǒng)時(shí)間上被隊(duì)列例程使用,但是它們的實(shí)現(xiàn)稍有區(qū)別 。圖11.3畫出了這兩種機(jī)制 。

第一個(gè)是老的定時(shí)器機(jī)制,它包含指向timer_struct結(jié)構(gòu)的32位指針的靜態(tài)數(shù)組以及當(dāng)前活動(dòng)定時(shí)器的屏蔽碼 :time_active 。

此定時(shí)器表中的位置是靜態(tài)定義的(類似底層部分處理表bh_base) 。其入口在系統(tǒng)初始化時(shí)被加入到表中 。第二種是相對(duì)較新的定時(shí)器,它使用一個(gè)到期時(shí)間以升序排列的timer_list結(jié)構(gòu)鏈表 。

這兩種方法都使用jiffies作為終結(jié)時(shí)間,這樣希望運(yùn)行5秒的定時(shí)器將不得不將5秒時(shí)間轉(zhuǎn)換成jiffies 的單位并且將它和以jiffies記數(shù)的當(dāng)前系統(tǒng)時(shí)間相加從而得到定時(shí)器的終結(jié)時(shí)間 。在每個(gè)系統(tǒng)時(shí)鐘滴答時(shí),定時(shí)器的底層部分處理過程被標(biāo)記成活動(dòng)狀態(tài)以便調(diào)度管理器下次運(yùn)行時(shí)能進(jìn)行定時(shí)器隊(duì)列的處理 。定時(shí)器底層 部分處理過程包含兩種類型的系統(tǒng)定時(shí)器 。老的系統(tǒng)定時(shí)器將檢查timer_active位是否置位 。

如果活動(dòng)定時(shí)器已經(jīng)到期則其定時(shí)器例程將被調(diào)用同時(shí)它的活動(dòng)位也被清除 。新定時(shí)器位于timer_list結(jié)構(gòu)鏈表中的入口也將受到檢查 。每個(gè)過期定時(shí)器將從鏈表中清除,同時(shí)它的例程將被調(diào)用 。新定時(shí)器機(jī)制的優(yōu)點(diǎn)之一是能傳遞一個(gè)參數(shù)給定時(shí)器例程 。




11.4等待隊(duì)列
進(jìn)程經(jīng)常要等待某個(gè)系統(tǒng)資源 。例如某個(gè)進(jìn)程可能需要描敘文件系統(tǒng)中某個(gè)目錄的VFS inode但是此inode可 能不在buffer cache中 。此時(shí)這個(gè)進(jìn)程必須等到該inode從包含此文件系統(tǒng)的物理介質(zhì)中取出來才可以繼續(xù) 運(yùn)行 。



wait_queue
*task

*next
圖11.4 等待隊(duì)列


Linux核心使用一個(gè)非常簡(jiǎn)單的隊(duì)列:等待隊(duì)列(見圖11.4) 。它包含一個(gè)指向進(jìn)程task_struct結(jié)構(gòu)的指針以及等待隊(duì)列中下一個(gè)元素的指針 。加入到等待隊(duì)列中的進(jìn)程既可以是可中斷也可以是不可中斷的 。可中斷 進(jìn)程能夠被如定時(shí)器到期或者信號(hào)等時(shí)間中斷 。此等待進(jìn)程的狀態(tài)必須說明成是INTERRUPTIBLE還是 UNINTERRUPTIBLE 。由于進(jìn)程現(xiàn)在不能繼續(xù)運(yùn)行則調(diào)度管理器將接過系統(tǒng)控制權(quán)并選擇一個(gè)新進(jìn)程運(yùn)行而等待進(jìn)程將被掛起 。處理等待進(jìn)程時(shí),每個(gè)處于等待隊(duì)列中的進(jìn)程都被置為RUNNING狀態(tài) 。如果此進(jìn)程已經(jīng)從運(yùn)行隊(duì)列中刪除則它將被重新放入運(yùn)行隊(duì)列 。下次調(diào)度管理器運(yùn)行時(shí), 由于這些進(jìn)程不再等待所以它們都將是運(yùn)行候選者 。等待隊(duì)列可以用來同步對(duì)系統(tǒng)資源的訪問, 同時(shí)它們還被Linux用于信號(hào)燈的實(shí)現(xiàn)中 。

推薦閱讀