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

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

第十一章 核心機(jī)制

本章主要描敘Linux核心為使核心其他部分能有效工作而提供的幾個(gè)常用任務(wù)與機(jī)制 。


11.1底層部分處理機(jī)制





圖11.1 底層部分處理機(jī)制數(shù)據(jù)結(jié)構(gòu)

某些特殊時(shí)刻我們并不愿意在核心中執(zhí)行一些操作 。例如中斷處理過程中 。當(dāng)中斷發(fā)生時(shí)處理器將停止當(dāng)前的工作, 操作系統(tǒng)將中斷發(fā)送到相應(yīng)的設(shè)備驅(qū)動(dòng)上去 。由于此時(shí)系統(tǒng)中其他程序都不能運(yùn)行, 所以設(shè)備驅(qū)動(dòng)中的中斷處理過程不宜過長(zhǎng) 。有些任務(wù)最好稍后執(zhí)行 。Linux底層部分處理機(jī)制可以讓設(shè)備驅(qū)動(dòng)和Linux核心其他部分將這些工作進(jìn)行排序以延遲執(zhí)行 。圖11.1給出了一個(gè)與底層部分處理相關(guān)的核心數(shù)據(jù)結(jié)構(gòu) 。

系統(tǒng)中最多可以有32個(gè)不同的底層處理過程;bh_base是指向這些過程入口的指針數(shù)組 。而bh_active和 bh_mask用來表示那些處理過程已經(jīng)安裝以及那些處于活動(dòng)狀態(tài) 。如果bh_mask的第N位置位則表示bh_base的 第N個(gè)元素包含底層部分處理例程 。如果bh_active的第N位置位則表示第N個(gè)底層處理過程例程可在調(diào)度器認(rèn) 為合適的時(shí)刻調(diào)用 。這些索引被定義成靜態(tài)的;定時(shí)器底層部分處理例程具有最高優(yōu)先級(jí)(索引值為0), 控制臺(tái)底層部分處理例程其次(索引值為1) 。典型的底層部分處理例程包含與之相連的任務(wù)鏈表 。例如 immediate底層部分處理例程通過那些需要被立刻執(zhí)行的任務(wù)的立即任務(wù)隊(duì)列(tq_immediate)來執(zhí)行 。

有些核心底層部分處理過程是設(shè)備相關(guān)的,但有些更加具有通用性:


TIMER
每次系統(tǒng)的周期性時(shí)鐘中斷發(fā)生時(shí)此過程被標(biāo)記為活動(dòng),它被用來驅(qū)動(dòng)核心的定時(shí)器隊(duì)列機(jī)制 。
CONSOLE
此過程被用來處理進(jìn)程控制臺(tái)消息 。
TQUEUE
此過程被用來處理進(jìn)程tty消息 。
NET
此過程被用來做通用網(wǎng)絡(luò)處理 。
IMMEDIATE
這是被幾個(gè)設(shè)備驅(qū)動(dòng)用來將任務(wù)排隊(duì)成稍后執(zhí)行的通用過程 。
當(dāng)設(shè)備驅(qū)動(dòng)或者核心中其他部分需要調(diào)度某些工作延遲完成時(shí),它們將把這些任務(wù)加入到相應(yīng)的系統(tǒng)隊(duì)列中去,如定時(shí)器隊(duì)列,然后對(duì)核心發(fā)出信號(hào)通知它需要調(diào)用某個(gè)底層處理過程 。具體方式是設(shè)置bh_active中的某些位 。如果設(shè)備驅(qū)動(dòng)將某個(gè)任務(wù)加入到了immediate隊(duì)列并希望底層處理過程運(yùn)行和處理它,可將第8位置1 。每次系統(tǒng)調(diào)用結(jié)束返回調(diào)用進(jìn)程前都要檢查bh_active 。如果有位被置1則調(diào)用處于活動(dòng)狀態(tài)的底層處理過程 。檢查的順序是從0位開始直到第31位 。

每次調(diào)用底層處理過程時(shí)bh_active中的對(duì)應(yīng)位將被清除 。bh_active是一個(gè)瞬態(tài)變量,它僅僅在調(diào)用調(diào)度管理器時(shí)有意義;同時(shí)它還可以在空閑狀態(tài)時(shí)避免對(duì)底層處理過程的調(diào)用 。


11.2任務(wù)隊(duì)列



圖 11.2: 一個(gè)任務(wù)隊(duì)列


任務(wù)隊(duì)列是核心延遲任務(wù)啟動(dòng)的主要手段 。Linux 提供了對(duì)隊(duì)列上任務(wù)排隊(duì)以及處理它們的通用機(jī)制 。

任務(wù)隊(duì)列通常和底層處理過程一起使用;底層的定時(shí)器隊(duì)列處理過程運(yùn)行時(shí)對(duì)定時(shí)器隊(duì)列進(jìn)行處理 。任務(wù)隊(duì)列的結(jié)構(gòu)很簡(jiǎn)單,如圖11.2 所示,它由一個(gè)tq_struct結(jié)構(gòu)鏈表構(gòu)成,每個(gè)節(jié)點(diǎn)中包含處理過程的地址指針以及指向數(shù)據(jù)的指針 。

處理任務(wù)隊(duì)列上元素時(shí)將用到這些過程,同時(shí)此過程還將用到指向這些數(shù)據(jù)的指針 。

核心的所有部分,如設(shè)備驅(qū)動(dòng), 都可以創(chuàng)建與使用任務(wù)隊(duì)列 。但是核心自己創(chuàng)建與管理的任務(wù)隊(duì)列只有以下三個(gè):

timer
此隊(duì)列用來對(duì)下一個(gè)時(shí)鐘滴答時(shí)要求盡快運(yùn)行的任務(wù)進(jìn)行排隊(duì) 。每個(gè)時(shí)鐘滴答時(shí)都要檢查此隊(duì)列看是否為空,如果不為空則定時(shí)器底層處理過程將激活此任務(wù) 。當(dāng)調(diào)度管理器下次運(yùn)行時(shí)定時(shí)器隊(duì)列底層處理過程將和其他底層處理過程一道對(duì)任務(wù)隊(duì)列進(jìn)行處理 。這個(gè)隊(duì)列不能和系統(tǒng)定時(shí)器相混淆 。

推薦閱讀