Linux基礎(chǔ)教程(清華課件)2_第1頁
Linux基礎(chǔ)教程(清華課件)2_第2頁
Linux基礎(chǔ)教程(清華課件)2_第3頁
Linux基礎(chǔ)教程(清華課件)2_第4頁
Linux基礎(chǔ)教程(清華課件)2_第5頁
已閱讀5頁,還剩147頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

清華大學(xué)出版社

上述兩種措施仍然沒有得到足夠的空閑頁面時(shí),系統(tǒng)

就要對(duì)所有進(jìn)程進(jìn)行掃描,尋找適合換出的候選進(jìn)

程。好的候選進(jìn)程應(yīng)該有一個(gè)或多個(gè)可以丟棄或換

出的頁面,系統(tǒng)選擇其中部分頁面丟棄或換出。

Linux系統(tǒng)采用記齡(aging)置換算法。Linux系統(tǒng)

根據(jù)訪問次數(shù)來決定是否適合換出,優(yōu)先換出那些

很長時(shí)間沒有訪問的頁面。與前兩種途徑相比,換

出或者丟棄其他進(jìn)程占用的頁面的效率最低。

總的來看,請(qǐng)求頁式存儲(chǔ)管理方法在進(jìn)程建立時(shí)只分

配少量內(nèi)存,通過頁面的交換來保證進(jìn)程運(yùn)行的時(shí)

候能夠得到需要的頁面,可以同時(shí)在內(nèi)存中安排多

個(gè)進(jìn)程。但是,內(nèi)存利用率的提高是以犧牲系統(tǒng)時(shí)

間開銷為代價(jià)換來的。

高華之學(xué)出版社

4.3Linux進(jìn)程調(diào)度

Linux系統(tǒng)中同時(shí)在內(nèi)存中安排多個(gè)進(jìn)程,這些進(jìn)程

相互之間競(jìng)爭(zhēng)處理機(jī)的使用權(quán)。系統(tǒng)的低級(jí)調(diào)度,

即進(jìn)程級(jí)調(diào)度就是要按照一定的策略,從所有處于

就緒狀態(tài)的進(jìn)程中選擇最應(yīng)該執(zhí)行的進(jìn)程,把CPU

分配給它,開始執(zhí)行。Linux系統(tǒng)的內(nèi)核級(jí)線程也

按照進(jìn)程來對(duì)待,使用進(jìn)程調(diào)度統(tǒng)一處理進(jìn)程和內(nèi)

核級(jí)線程。

4.3.1初始化過程及進(jìn)程樹

我們以Intel386系列計(jì)算機(jī)為例,介紹Linux系統(tǒng)的

啟動(dòng)過程,現(xiàn)假定系統(tǒng)已經(jīng)完成了正常安裝。打

開計(jì)算機(jī)電源,計(jì)算機(jī)首先從固化在主板ROM中

的BIOS開始啟動(dòng),BOIS對(duì)計(jì)算機(jī)的硬件進(jìn)行一系

列的檢測(cè),然后從指定設(shè)備的指定位置,把boot

loader讀入系統(tǒng)內(nèi)存并把控制權(quán)轉(zhuǎn)交給boot

loader,接著,在bootloader的控制下,系統(tǒng)啟動(dòng)

代碼被讀入內(nèi)存并進(jìn)行初始化工作,控制權(quán)轉(zhuǎn)交給

系統(tǒng)初始化代碼后,引導(dǎo)整個(gè)操作系統(tǒng)進(jìn)入內(nèi)存并

控制整個(gè)系統(tǒng),設(shè)置各種表格和數(shù)據(jù)結(jié)構(gòu),初始化

可運(yùn)行隊(duì)列的時(shí)候建立系統(tǒng)的0號(hào)進(jìn)程,然后創(chuàng)建

系統(tǒng)最初的進(jìn)程一一init進(jìn)程,該進(jìn)程的進(jìn)程號(hào)為

Io

清華大學(xué)出版社

init進(jìn)程啟動(dòng)內(nèi)核交換線程等系統(tǒng)內(nèi)核線程,然后根

據(jù)系統(tǒng)提供的參數(shù),啟動(dòng)相應(yīng)的終端管理進(jìn)程,在

每一個(gè)終端屏幕上顯示login字樣,等待用戶的登

錄,整個(gè)啟動(dòng)過程到此結(jié)束,參看圖4.3。用戶登

錄過程中,init進(jìn)程啟動(dòng)login進(jìn)程對(duì)用戶的賬號(hào)和

密碼進(jìn)行驗(yàn)證,通過之后,由login進(jìn)程啟動(dòng)shell命

令解釋進(jìn)程,為用戶提供操作系統(tǒng)的接口,接受用

戶的輸入,解釋執(zhí)行用戶命令,執(zhí)行過程中又會(huì)創(chuàng)

建新的進(jìn)程。

圖4.3Linux系統(tǒng)啟動(dòng)過程

清華大學(xué)出版社

Linux系統(tǒng)的所有進(jìn)程共同構(gòu)成一個(gè)完整的進(jìn)程樹,

如圖4.3所示。從init進(jìn)程開始,init進(jìn)程是所有其

他進(jìn)程的祖先。init產(chǎn)生終端管理進(jìn)程mingetty,

mingetty產(chǎn)生login,login產(chǎn)生用戶的shell進(jìn)程,然

后shell產(chǎn)生其他用戶進(jìn)程,因此,其他所有進(jìn)程都

是由init或者它的子孫創(chuàng)建而來。同樣,在進(jìn)程結(jié)

束之后,父進(jìn)程也要負(fù)責(zé)該進(jìn)程的最后回收工作,

如果某一個(gè)進(jìn)程創(chuàng)建了子進(jìn)程之后,由于某種原因

先于子進(jìn)程終止,由它創(chuàng)建的子進(jìn)程成為孤兒進(jìn)

程,孤兒進(jìn)程的祖父進(jìn)程就要負(fù)責(zé)回收工作,依此

類推。最后,在系統(tǒng)要關(guān)機(jī)之前,init進(jìn)程還要負(fù)

責(zé)結(jié)束所有的進(jìn)程,卸載所有文件系統(tǒng)并終止處理

器的指令執(zhí)行。

4.3.2進(jìn)程的組織

為了管理進(jìn)程,Linux系統(tǒng)采用多種方式來組織處于

各種狀態(tài)的進(jìn)程。

系統(tǒng)中每創(chuàng)建一個(gè)新的進(jìn)程,就給它分配一個(gè)進(jìn)程控

制塊(PCB),PCB是系統(tǒng)感知、控制進(jìn)程的靜

態(tài)實(shí)體。系統(tǒng)訪問PCB的頻率非常高,因此所有進(jìn)

程的PCB都直接存放在物理內(nèi)存中。Linux系統(tǒng)中

使用一個(gè)稱為task的數(shù)組來保存所有PCB的指針,

Linux通過task數(shù)組來管理系統(tǒng)中所有的進(jìn)程。每

一個(gè)進(jìn)程都有一個(gè)惟一標(biāo)識(shí)自己的進(jìn)程號(hào)PID,進(jìn)

程號(hào)和進(jìn)程在task數(shù)組中的位置(數(shù)組元素的下

標(biāo))之間是不同的。

害小匕一二學(xué)dp

/R-L人一廠UJ必丁一惻颯3踞加購呢^例■

同時(shí),系統(tǒng)中所有的進(jìn)程還構(gòu)成一個(gè)雙向循環(huán)隊(duì)列,

整個(gè)隊(duì)列通過進(jìn)程控制塊中的兩個(gè)指針next-task和

prev-task來維護(hù)。某個(gè)進(jìn)程在整個(gè)進(jìn)程樹中的位

置,也通過PCB中指針描述。

為了方便進(jìn)程的調(diào)度,系統(tǒng)把所有可運(yùn)行的進(jìn)程組織

成一個(gè)可運(yùn)行隊(duì)列,系統(tǒng)通過當(dāng)前(current)指針

來區(qū)別就緒狀態(tài)和執(zhí)行狀態(tài),每一個(gè)CPU都有一個(gè)

當(dāng)前指針,指向正在使用該CPU的進(jìn)程??蛇\(yùn)行隊(duì)

列也是一個(gè)雙向循環(huán)隊(duì)列,隊(duì)列中指向前后接點(diǎn)的

指針同樣存放在PCB中,它們是next-run和prev-

runo系統(tǒng)的調(diào)度函數(shù)根據(jù)一定的規(guī)則,查找整個(gè)

可運(yùn)行隊(duì)列,在其中尋找最值得執(zhí)行的進(jìn)程,給它

(或它們)分配CPU,投入執(zhí)行。

清華大學(xué)出版社

Linux系統(tǒng)內(nèi)部把所有進(jìn)程分為三類,空閑線程、內(nèi)

核線程和用戶進(jìn)程??臻e線程是系統(tǒng)中一個(gè)特殊的

具有標(biāo)志作用的進(jìn)程,它是task數(shù)組的0號(hào)元素

task\[O\],它的進(jìn)程號(hào)也是0,在源代碼中記作init-

task,只有當(dāng)整個(gè)系統(tǒng)中沒有進(jìn)程可以運(yùn)行時(shí),空

閑線程才會(huì)執(zhí)行,它始終位于系統(tǒng)可運(yùn)行隊(duì)列中,

也是該隊(duì)列的頭結(jié)點(diǎn),同時(shí)它也是所有進(jìn)程組成的

隊(duì)列的頭結(jié)點(diǎn)。內(nèi)核線程也是比較特殊的進(jìn)程,它

處于核心態(tài),沒有虛擬地址空間,擁有很高的優(yōu)先

權(quán),一般用來完成系統(tǒng)管理任務(wù),內(nèi)核交換進(jìn)程

kswapd就是其中之一。用戶進(jìn)程包括所有其他進(jìn)

程和線程,可以在用戶態(tài)和核心態(tài)兩種模式下運(yùn)

行。

港華少學(xué)出版社T!IHK

注意,空閑進(jìn)程init-task和系統(tǒng)中的1號(hào)進(jìn)程init在表

達(dá)上很相象,但二者完全不同,空閑進(jìn)程是進(jìn)程組

織、調(diào)度過程中的關(guān)鍵性標(biāo)志,它本身不完成任何

任務(wù),它不會(huì)退出也不會(huì)進(jìn)入等待狀態(tài),而init進(jìn)

程是系統(tǒng)啟動(dòng)后第一個(gè)有用的進(jìn)程,它負(fù)責(zé)啟動(dòng)系

統(tǒng)中相關(guān)進(jìn)程,在系統(tǒng)要關(guān)機(jī)之前,init進(jìn)程還要

負(fù)責(zé)結(jié)束所有的進(jìn)程,它是系統(tǒng)中整個(gè)進(jìn)程樹的祖

先。

4.3.3進(jìn)程調(diào)度時(shí)機(jī)

調(diào)度函數(shù)是Linux系統(tǒng)中執(zhí)行最為頻繁的一個(gè),它的

主要目標(biāo)就是選擇合適的進(jìn)程占有CPU,實(shí)現(xiàn)程序

的多道執(zhí)行,充分提高CPU的利用率。調(diào)度函數(shù)通

過對(duì)每個(gè)進(jìn)程PCB中相關(guān)信息查詢,按照一定的算

法,在可運(yùn)行隊(duì)列選擇進(jìn)程。如果選中的進(jìn)程并不

是當(dāng)前占有處理機(jī)的進(jìn)程,調(diào)度函數(shù)還負(fù)責(zé)保存當(dāng)

前進(jìn)程的執(zhí)行現(xiàn)場(chǎng)(進(jìn)程上下文),然后恢復(fù)選中

進(jìn)程的進(jìn)程上下文使之順利執(zhí)行。

Linux系統(tǒng)中沒有設(shè)置專門的調(diào)度進(jìn)程,在需要調(diào)度

的時(shí)候,調(diào)用一個(gè)特定的調(diào)度函數(shù)來完成調(diào)度功

能。一般來講,Linux系統(tǒng)中的進(jìn)程調(diào)度發(fā)生的時(shí)

機(jī)有下面幾種。

清華大學(xué)出版社

(1)用戶利用系統(tǒng)提供的函數(shù)調(diào)用創(chuàng)建一個(gè)新的進(jìn)程

時(shí),系統(tǒng)把它加到可運(yùn)行隊(duì)列中,返回該進(jìn)程的進(jìn)

程號(hào)。這時(shí),調(diào)度函數(shù)開始執(zhí)行,這樣的方案可以

保證系統(tǒng)具有很好的響應(yīng)特性。

(2)當(dāng)正在執(zhí)行的進(jìn)程申請(qǐng)某種暫時(shí)無法獲得的資源

或者為了與其他進(jìn)程保持同步,需要等待某個(gè)事件

的發(fā)生,進(jìn)程的PCB進(jìn)入相應(yīng)的等待事件隊(duì)列中,

進(jìn)程轉(zhuǎn)入等待狀態(tài);當(dāng)正在執(zhí)行的進(jìn)程完成了任

務(wù)或者得到特定的信號(hào)而退出,轉(zhuǎn)入僵死狀態(tài)。這

兩種進(jìn)程狀態(tài)轉(zhuǎn)換完成后,進(jìn)程主動(dòng)放棄CPU資

源,調(diào)用調(diào)度函數(shù),選擇新的進(jìn)程來使用CPU。這

種情況下,及時(shí)的調(diào)度在一定程度上可以提高CPU

資源的利用率。

清華大學(xué)出版社

(3)對(duì)于分時(shí)系統(tǒng),每個(gè)進(jìn)程執(zhí)行完一定的時(shí)間片之

后,就必須交出CPU資源,這時(shí),也要發(fā)生調(diào)度,

這樣的方案可以保證一定的公平性。

(4)我們知道,Linux系統(tǒng)提供了兩級(jí)保護(hù),用戶進(jìn)程

可以在用戶態(tài)和核心態(tài)這兩種處于不同保護(hù)模式的

情況下運(yùn)行,具有不同的特權(quán)級(jí)別,可以訪問的地

址空間不同。用戶進(jìn)程可以在這兩種模式之間進(jìn)行

切換,用戶態(tài)通過中斷或函數(shù)調(diào)用就可以轉(zhuǎn)入核心

態(tài),其中中斷是應(yīng)進(jìn)程外部發(fā)來的信息的要求而轉(zhuǎn)

入核心態(tài),函數(shù)調(diào)用則是進(jìn)程內(nèi)部要求轉(zhuǎn)入核心

態(tài)。而從核心態(tài)切換到用戶態(tài),則需要一定的硬件

支持。當(dāng)進(jìn)程從核心態(tài)返回到用戶態(tài)時(shí),將會(huì)調(diào)用

調(diào)度函數(shù),發(fā)生調(diào)度。

高華之學(xué)出版社JAUNIVEFISJTYPRESS

從本質(zhì)上來看,這些情況可以歸結(jié)為兩類時(shí)機(jī),一是

進(jìn)程本身自動(dòng)放棄處理機(jī)發(fā)生調(diào)度,這包括進(jìn)程轉(zhuǎn)

換到等待和僵死狀態(tài),這類調(diào)度是用戶進(jìn)程可以預(yù)

測(cè)的;二是由核心態(tài)轉(zhuǎn)入用戶態(tài)時(shí)發(fā)生調(diào)度,這類

調(diào)度發(fā)生最為頻繁。系統(tǒng)調(diào)用完成和內(nèi)核處理完中

斷之后系統(tǒng)是由核心態(tài)轉(zhuǎn)入用戶態(tài),時(shí)間片用完本

身也是系統(tǒng)發(fā)送的時(shí)鐘中斷,本質(zhì)上也是一種中

斷,而可運(yùn)行隊(duì)列加入新的進(jìn)程的工作只能由內(nèi)核

操作完成,無疑是發(fā)生于內(nèi)核態(tài)。

高華十字出版社

fGHUAUNIVERSITYPRESS

4.3.4進(jìn)程調(diào)度算法

操作系統(tǒng)所采用的進(jìn)程調(diào)度算法取決于系統(tǒng)最初的設(shè)

計(jì)目標(biāo),它決定了系統(tǒng)對(duì)資源,特別是CPU資源的

分配策略,直接決定著系統(tǒng)的特性。Linux系統(tǒng)采

用相當(dāng)簡(jiǎn)單但效率很高的調(diào)度算法,具有很好的響

應(yīng)特性,它提供了三種調(diào)度算法:POSIX操作系統(tǒng)

標(biāo)準(zhǔn)規(guī)定的用于實(shí)時(shí)進(jìn)程的先進(jìn)先出算法

(FIFO,FirstInFirstOut)和輪轉(zhuǎn)算法(RR,

RoundRobin),用于普通進(jìn)程的可搶占式動(dòng)態(tài)優(yōu)

先級(jí)算法(PreemptiveScheduling)。

清華大學(xué)出版社

Linux先進(jìn)先出調(diào)度算法按照實(shí)時(shí)進(jìn)程進(jìn)入可運(yùn)行隊(duì)

列的先后順序,依次把每一個(gè)進(jìn)程投入執(zhí)行,只有

前面的進(jìn)程執(zhí)行完成或者自動(dòng)放棄CPU(比如進(jìn)入

等待狀態(tài)),下一個(gè)進(jìn)程才可以執(zhí)行。這樣的算法

實(shí)現(xiàn)簡(jiǎn)單,在一般意義下也還算公平合理,但是,

如果一個(gè)執(zhí)行很短的進(jìn)程不小心排在一個(gè)執(zhí)行時(shí)間

很長的進(jìn)程之后,那就可能要花費(fèi)比執(zhí)行時(shí)間長很

多倍的時(shí)間來等待,顯然是不可接受的。Linux系

統(tǒng)的先進(jìn)先出算法同時(shí)也考慮了進(jìn)程的優(yōu)先級(jí),具

有相同優(yōu)先級(jí)的進(jìn)程采用FIFO算法,如果有更高

的優(yōu)先級(jí)出現(xiàn),調(diào)度函數(shù)就要選擇具有高優(yōu)先級(jí)的

進(jìn)程使用處理機(jī),在新進(jìn)程被加入到可運(yùn)行隊(duì)列之

后出現(xiàn)的調(diào)度時(shí)機(jī)實(shí)際就可以解決這種問題。

害小匕一;ifdp已行力十

/司-L人一廠UJ必丁一熱咖(0對(duì)!稱邕境電則!腳融題到2

Linux輪轉(zhuǎn)算法的基本原理是給每一個(gè)進(jìn)入可運(yùn)行隊(duì)

列的實(shí)時(shí)進(jìn)程分配固定大小的CPU處理時(shí)間(稱為

時(shí)間片),按照它們?cè)陉?duì)列中的順序依次開始執(zhí)

行,如果一個(gè)進(jìn)程的時(shí)間片用完之后還沒有完成要

求的任務(wù),它必須交出CPU的使用權(quán)并且重新排到

可運(yùn)行隊(duì)列的尾部,等待下一次調(diào)度,原來排在它

后面的進(jìn)程投入執(zhí)行。這樣的算法,可以保證每個(gè)

進(jìn)程就緒之后的等待時(shí)間和占用CPU的時(shí)間成比

例,更加公平。Linux系統(tǒng)使用的RR算法也考慮了

進(jìn)程的優(yōu)先級(jí),具有相同優(yōu)先級(jí)的進(jìn)程采用RR算

法,而具有更高優(yōu)先級(jí)的實(shí)時(shí)進(jìn)程擁有首先使用

CPU的權(quán)利。這樣的方案,可以保證具有高優(yōu)先級(jí)

的緊迫型實(shí)時(shí)進(jìn)程很快得到響應(yīng)。

從上面的描述可以看到,Linux提供的實(shí)際是軟件實(shí)

時(shí)。

Linux系統(tǒng)中,非實(shí)時(shí)進(jìn)程的調(diào)度采用搶占式動(dòng)態(tài)優(yōu)

先級(jí)算法。每個(gè)進(jìn)程擁有不變的靜態(tài)優(yōu)先級(jí)和可變

的動(dòng)態(tài)優(yōu)先級(jí),調(diào)度函數(shù)根據(jù)各進(jìn)程的優(yōu)先級(jí)來確

定權(quán)值,擁有最大權(quán)值的進(jìn)程被選中執(zhí)行,如果多

個(gè)進(jìn)程具有相同權(quán)值,則選取排在可運(yùn)行隊(duì)列最前

面的那一個(gè)。每一個(gè)進(jìn)程都分配一定的時(shí)間片,時(shí)

間片使用完之后,系統(tǒng)轉(zhuǎn)入調(diào)度函數(shù),等所有非實(shí)

時(shí)進(jìn)程的時(shí)間片都使用完之后,再按照各自的優(yōu)先

級(jí)給每個(gè)進(jìn)程重新分配時(shí)間片。

高華文學(xué)出版社

時(shí)間片是系統(tǒng)中比較關(guān)鍵的一個(gè)參數(shù),它的大小直接

影響系統(tǒng)的性能。1386系統(tǒng)采用段頁式存儲(chǔ)管理,

進(jìn)程的切換效率比較低,針對(duì)這種情況,Linux時(shí)

間片默認(rèn)值為200ms,用戶可以針對(duì)不同的進(jìn)程設(shè)

置時(shí)間片的值。

事實(shí)上,Linux系統(tǒng)中并沒有根據(jù)進(jìn)程的調(diào)度策略分

別管理進(jìn)程,而是把所有可運(yùn)行進(jìn)程都集中于同一

個(gè)隊(duì)列中,三種調(diào)度算法在實(shí)現(xiàn)過程中合為一種,

使用同一段程序。下一節(jié),我們就來探討Linux進(jìn)

程調(diào)度的具體過程。

4.3.5進(jìn)程調(diào)度過程

Linux系統(tǒng)的調(diào)度過程簡(jiǎn)潔而高效。整個(gè)調(diào)度過程大

概可以分為五個(gè)部分。首先檢測(cè)中斷,如果有中斷

運(yùn)行時(shí),調(diào)度過程到此為止,直接退出,如果沒有

中斷運(yùn)行,關(guān)中斷,在調(diào)度的過程中將不再允許中

斷。其次處理系統(tǒng)的內(nèi)核例程。然后對(duì)當(dāng)前進(jìn)程做

相關(guān)處理:如果當(dāng)前進(jìn)程是時(shí)間片用完的進(jìn)程按照

輪轉(zhuǎn)法調(diào)度,系統(tǒng)重新賦予時(shí)間片并把它移到隊(duì)列

的尾部;如果進(jìn)程因?yàn)榈却硞€(gè)事件而轉(zhuǎn)入等待狀

態(tài)引起調(diào)度,調(diào)度過程中發(fā)現(xiàn)事件已經(jīng)發(fā)生,進(jìn)程

仍然轉(zhuǎn)入就緒狀態(tài);如果進(jìn)程處于其他非可運(yùn)行態(tài)

的話,就要從可運(yùn)行隊(duì)列中刪除。這些都是為開始

調(diào)度而進(jìn)行的準(zhǔn)備工作。

清華大學(xué)出版社

接著調(diào)度函數(shù)遍歷整個(gè)可運(yùn)行隊(duì)列,從中找到最值得

運(yùn)行的進(jìn)程,該進(jìn)程的權(quán)值(goodness)最大。如

果該進(jìn)程不是當(dāng)前進(jìn)程,系統(tǒng)需要進(jìn)行進(jìn)程上下文

切換,如果正好就是當(dāng)前進(jìn)程,這一部分就可以跳

過去。最后打開中斷,選中的進(jìn)程開始執(zhí)行。

整個(gè)調(diào)度過程的核心就是如何計(jì)算一個(gè)進(jìn)程的權(quán)值。

在Linux系統(tǒng)中,決定進(jìn)程權(quán)值的相關(guān)參數(shù)有四

個(gè),它們都記錄在進(jìn)程控制塊中:

(1)policy,策略,一個(gè)給定進(jìn)程采用的調(diào)度算法稱為

該進(jìn)程的調(diào)度策略。進(jìn)程的調(diào)度策略是從父進(jìn)程那

里繼承來的,但是也可以通過特定系統(tǒng)調(diào)用來改

變。

高華文學(xué)出版社

(2)priority,優(yōu)先級(jí),確切地講是靜態(tài)優(yōu)先級(jí)。記載

了進(jìn)程最多可以擁有的時(shí)間片,從父進(jìn)程那里繼承

過來,只能由用戶通過系統(tǒng)調(diào)用來修改。

(3)counter,計(jì)數(shù)器,它實(shí)際上是進(jìn)程的動(dòng)態(tài)優(yōu)先

級(jí)。它表示進(jìn)程在當(dāng)前時(shí)間片中剩余的時(shí)間量。它

的初值等于靜態(tài)優(yōu)先級(jí),在進(jìn)程執(zhí)行期間,隨時(shí)間

不斷減少,當(dāng)它小于或等于0時(shí),表明進(jìn)程的時(shí)間

片用完,重新設(shè)置為0,并引起調(diào)度。

(4)rt-priority,實(shí)時(shí)優(yōu)先級(jí)。實(shí)時(shí)進(jìn)程的優(yōu)先級(jí),標(biāo)

志實(shí)時(shí)進(jìn)程優(yōu)先權(quán)的高低。取值范圍為0?99,取0

時(shí)表示不是實(shí)時(shí)進(jìn)程。

高華十字出版社

系統(tǒng)在進(jìn)行調(diào)度時(shí),首先確定該進(jìn)程的調(diào)度策略,依

據(jù)就是policy的值,然后根據(jù)不同的策略,選用適

當(dāng)?shù)乃惴ň唧w計(jì)算相應(yīng)的權(quán)值,權(quán)值是衡量一個(gè)進(jìn)

程是否執(zhí)行的惟一標(biāo)準(zhǔn)。

衡量實(shí)時(shí)進(jìn)程執(zhí)行的依據(jù)就是實(shí)時(shí)優(yōu)先級(jí)。具體的計(jì)

算公式為:

goodness=1000+rt-priority(4.1)

對(duì)于采用實(shí)時(shí)FIFO策略的進(jìn)程,具有高實(shí)時(shí)優(yōu)先級(jí)

的進(jìn)程將一直執(zhí)行,直到進(jìn)入僵死狀態(tài)、進(jìn)入等待

狀態(tài)或者是被具有更高實(shí)時(shí)優(yōu)先級(jí)的進(jìn)程奪去處理

機(jī)。采用實(shí)時(shí)RR策略的進(jìn)程,時(shí)間片用完之后,

將被放到可運(yùn)行隊(duì)列的尾部,等待下一次調(diào)度,處

理機(jī)由下一個(gè)具有相同實(shí)時(shí)優(yōu)先級(jí)的進(jìn)程使用。

清華大學(xué)出版社

普通進(jìn)程的調(diào)度策略標(biāo)記為SCHED-OTHER,采用

搶占式動(dòng)態(tài)優(yōu)先級(jí)調(diào)度策略。選擇執(zhí)行的依據(jù)是進(jìn)

程的動(dòng)態(tài)優(yōu)先級(jí)。進(jìn)程創(chuàng)建之初,動(dòng)態(tài)優(yōu)先級(jí)和靜

態(tài)優(yōu)先級(jí)具有相同的值,隨著進(jìn)程的執(zhí)行,動(dòng)態(tài)優(yōu)

先級(jí)慢慢減小,如果一個(gè)普通進(jìn)程時(shí)間片用完的

話,它的動(dòng)態(tài)優(yōu)先級(jí)就是0,而且要等到其他所有

進(jìn)程的動(dòng)態(tài)優(yōu)先級(jí)為0時(shí)才用靜態(tài)優(yōu)先級(jí)的值來初

始化。這種情況下所有普通進(jìn)程權(quán)值的計(jì)算公式都

是:

goodness=counter+priority(4.2)

因此,在調(diào)度中,用完時(shí)間片的普通進(jìn)程被選中的可

能性很小,這就給其他進(jìn)程,特別是新建進(jìn)程使用

處理機(jī)的機(jī)會(huì)。

清華大學(xué)出版社

如果進(jìn)入調(diào)度后,當(dāng)前普通進(jìn)程的時(shí)間片沒有用完,

而且仍然位于可運(yùn)行隊(duì)列中時(shí),當(dāng)前進(jìn)程的權(quán)值采

用公式(4.3)計(jì)算,除了當(dāng)前進(jìn)程之外的所有普

通進(jìn)程仍采用公式(4.2)計(jì)算權(quán)值。

goodness=counter+priority+l(4.3)

這樣,適當(dāng)增大當(dāng)前進(jìn)程的權(quán)值,以增加繼續(xù)使用處

理機(jī)的可能,可以避免過分頻繁的進(jìn)程切換。

新的普通進(jìn)程進(jìn)入可運(yùn)行隊(duì)列后,插入到隊(duì)列尾部,

將引起調(diào)度,在都使用相同靜態(tài)優(yōu)先級(jí)的情況下,

新進(jìn)程的權(quán)值很大,因此,如果沒有實(shí)時(shí)進(jìn)程和其

他一直未執(zhí)行過的就緒進(jìn)程,新建進(jìn)程投入執(zhí)行的

可能性相當(dāng)大??梢?,Linux系統(tǒng)所采用的這種調(diào)

度算法優(yōu)先保證交互性,系統(tǒng)的響應(yīng)時(shí)間比較短。

清華大學(xué)出版社

實(shí)時(shí)進(jìn)程和普通進(jìn)程相比,總是具有更高的優(yōu)先級(jí)。

因此,如果可運(yùn)行隊(duì)列中同時(shí)存在實(shí)時(shí)進(jìn)程和普通

進(jìn)程,實(shí)時(shí)進(jìn)程總是可以先使用處理機(jī)。

權(quán)值是Linux系統(tǒng)進(jìn)程調(diào)度過程中選擇進(jìn)程的惟一標(biāo)

準(zhǔn),程序?qū)崿F(xiàn)非常簡(jiǎn)單,參看kernel/sched.c。

在討論進(jìn)程調(diào)度過程的時(shí)候,我們始終認(rèn)為計(jì)算機(jī)只

有一個(gè)處理機(jī),實(shí)際上,Linux系統(tǒng)很早就開始支

持對(duì)稱多處理器,這種情況下的調(diào)度不在本書的討

論范圍之內(nèi),有興趣的讀者可以參看源代碼和本書

的相關(guān)參考文獻(xiàn)。

高華文學(xué)出版社

UNIVERSITYPRESS

4.4小結(jié)

調(diào)度主要解決處理機(jī)資源的分配問題,系統(tǒng)的調(diào)度是

分層次的,因此也稱為分級(jí)調(diào)度,按照調(diào)度發(fā)生的

頻率分為作業(yè)調(diào)度、交換調(diào)度、進(jìn)程調(diào)度和線程調(diào)

度,分別由不同的調(diào)度程序來完成。

Linux系統(tǒng)采用兩級(jí)調(diào)度,用戶作業(yè)進(jìn)入內(nèi)存,直接

參與交換調(diào)度,進(jìn)程和線程采用同樣的表示和管理

方式,也使用同樣的調(diào)度函數(shù)。

高華文學(xué)出版社

Linux系統(tǒng)采用請(qǐng)求頁式內(nèi)存動(dòng)態(tài)管理方法,根據(jù)進(jìn)

程執(zhí)行的實(shí)際需要分配內(nèi)存頁面并換入內(nèi)容,同時(shí)

使用內(nèi)核交換進(jìn)程kswapd按照記齡(aging)置換

算法來實(shí)現(xiàn)頁面淘汰功能,內(nèi)核交換進(jìn)程周期性地

執(zhí)行,通過縮減pagecachedbuffercache>換出

SYSTEMV共享內(nèi)存占用的頁面、換出或者丟棄

其他進(jìn)程占用的頁面等三種途徑縮減已使用的內(nèi)存

頁面,保證系統(tǒng)中總是有足夠的空閑頁面,保持整

個(gè)存儲(chǔ)管理子系統(tǒng)高效地運(yùn)行。

害小匕一二學(xué)dp

/R-L人一廠UJ必丁一惻颯3踞加購呢^例■

調(diào)度函數(shù)管理系統(tǒng)的可運(yùn)行隊(duì)列,該隊(duì)列中包括正在

執(zhí)行的進(jìn)程和所有就緒進(jìn)程,在實(shí)際調(diào)度中,調(diào)度

函數(shù)查詢每個(gè)進(jìn)程PCB中相關(guān)信息,按照一定的算

法,在可運(yùn)行隊(duì)列選擇合適進(jìn)程,進(jìn)行進(jìn)程上下文

切換,使得選中的進(jìn)程順利執(zhí)行。Linux系統(tǒng)提供

了三種調(diào)度算法:POSIX操作系統(tǒng)標(biāo)準(zhǔn)規(guī)定的用于

實(shí)時(shí)進(jìn)程的先進(jìn)先出算法FIFO、輪轉(zhuǎn)算法RR及用

于普通進(jìn)程的可搶占式動(dòng)態(tài)優(yōu)先級(jí)算法。Linux系

統(tǒng)用一個(gè)簡(jiǎn)單的函數(shù)實(shí)現(xiàn)了這三種進(jìn)程調(diào)度算法,

它雖然不十分完美,但高效,確實(shí)可以適用于大多

數(shù)情況。

高華十字出版社

習(xí)題

4-1什么是分級(jí)調(diào)度?描述Linux系統(tǒng)的分級(jí)調(diào)度情

況。

4-2什么是交換調(diào)度?其主要功能有哪些?Linux的

交換調(diào)度有什么特點(diǎn)?

4-3交換空間是什么?交換區(qū)和交換文件有什么區(qū)

另1J?如果安裝一個(gè)用于WWW服務(wù)的Linux系統(tǒng),你

認(rèn)為交換空間應(yīng)該怎么設(shè)置?為什么?

4-4進(jìn)程調(diào)度的功能是什么?Linux的進(jìn)程調(diào)度發(fā)生

在什么情況下?

4?5Linux系統(tǒng)的實(shí)時(shí)調(diào)度與普通調(diào)度有何區(qū)別?實(shí)

時(shí)FIFO和實(shí)時(shí)RR調(diào)度算法有何區(qū)別?分別如何實(shí)

現(xiàn)?

高華文學(xué)出版社

4-6Linux在調(diào)度算法實(shí)現(xiàn)過程中如何保證系統(tǒng)具有

良好的交互性?與此同時(shí),它犧牲了哪些方面的性

能?

4-7如果你是系統(tǒng)的root用戶,你將采取什么措施保

證你的進(jìn)程能比別的用戶具有更高的或更低的優(yōu)先

權(quán)?如果你是普通用戶,將采取什么措施?實(shí)際操

作,能夠達(dá)到目的嗎?

4-8訪問Linux核心代碼站點(diǎn)http:〃,

了解Linux核心中調(diào)度函數(shù)的最新進(jìn)展及新增特

點(diǎn)。

清華十字出版社

SITYPRESS

第5章設(shè)備

5.1設(shè)備介紹

5.2數(shù)據(jù)傳輸

5.3I/O軟件原理

5.4小結(jié)

習(xí)題

清華大學(xué)出版社

計(jì)算機(jī)系統(tǒng)中所有的軟硬件都是由操作系統(tǒng)控制和管

理的,其中除了CPU和內(nèi)存之外的幾乎所有硬件通

常統(tǒng)稱為外部設(shè)備。操作系統(tǒng)中設(shè)備管理的任務(wù)是

負(fù)責(zé)控制并操縱所有的設(shè)備,實(shí)現(xiàn)不同外部設(shè)備之

間、外部設(shè)備和內(nèi)存以及CPU之間的數(shù)據(jù)傳輸,使

它們協(xié)同工作,在獲得最佳效率、提供良好服務(wù)的

同時(shí),盡可能地提供統(tǒng)一的用戶命令和函數(shù)調(diào)用接

口,對(duì)用戶屏蔽不同設(shè)備之間的差異。

在Linux等操作系統(tǒng)中,所有的設(shè)備統(tǒng)一當(dāng)作文件來

處理,稱為設(shè)備文件,和其他文件一樣,這種文件

可以使用處理文件的標(biāo)準(zhǔn)系統(tǒng)調(diào)用打開、關(guān)閉和讀

寫。

清華大學(xué)出版社

操作系統(tǒng)設(shè)備管理部分通常也采用分層結(jié)構(gòu),底層是

設(shè)備相關(guān)部分,直接和相應(yīng)的設(shè)備打交道,負(fù)責(zé)設(shè)

備的具體控制,并向上層提供一致的訪問接口,通

常稱為設(shè)備驅(qū)動(dòng)程序。上層通常是和設(shè)備無關(guān)的,

這個(gè)部分接受來自上層的具體訪問請(qǐng)求,并根據(jù)實(shí)

際情況把這些訪問請(qǐng)求轉(zhuǎn)向具體的設(shè)備驅(qū)動(dòng)程序接

口,和設(shè)備進(jìn)行通信,接受驅(qū)動(dòng)程序的執(zhí)行結(jié)果。

本章簡(jiǎn)要介紹設(shè)備管理中數(shù)據(jù)傳輸控制的基本原理,

并以此為基礎(chǔ),學(xué)習(xí)設(shè)備分配概念及設(shè)備驅(qū)動(dòng)程

序。

/害司小-匕L一人七一學(xué)廠dJp必已后丁->十-翹星則儂質(zhì)燦題呢£^陟《

5.1設(shè)備介紹

操作系統(tǒng)中用于設(shè)備管理的內(nèi)核代碼在整個(gè)內(nèi)核中是

數(shù)量最多的部分。外部設(shè)備給用戶提供進(jìn)行計(jì)算機(jī)

基本操作以及完成各種特定功能的接口,用戶需要

交給計(jì)算機(jī)處理的所有數(shù)據(jù)都必須通過特定的外部

設(shè)備來傳輸?shù)絻?nèi)存和CPU。

設(shè)備可以被簡(jiǎn)單地看作是由機(jī)械部分和電子部分組

成。在微機(jī)系統(tǒng)中,控制器一般都有自己的控制和

狀態(tài)寄存器,獨(dú)立于系統(tǒng)的內(nèi)存空間,所有設(shè)備的

寄存器組成計(jì)算機(jī)的輸入/輸出空間(稱為I/O空

間),操作系統(tǒng)通過設(shè)備驅(qū)動(dòng)程序訪問I/O空間,

管理設(shè)備控制器,由控制器具體操縱設(shè)備完成預(yù)定

的任務(wù)。

清華大學(xué)出版社

5.1.1設(shè)備分類

外部設(shè)備可以按照不同的標(biāo)準(zhǔn)進(jìn)行分類。從普通用戶

的角度,按照設(shè)備的使用特性來劃分,普通微機(jī)的

外部設(shè)備壬要包括存儲(chǔ)設(shè)備和輸入輸出設(shè)備。

從操作系統(tǒng)管理的角度來看,按照設(shè)備傳輸信息的組

織形式,外部設(shè)備可以劃分為字符設(shè)備、塊設(shè)備和

網(wǎng)絡(luò)設(shè)備。這也是Linux操作系統(tǒng)進(jìn)行設(shè)備管理過

程中的劃分方式。

Linux系統(tǒng)中,每一個(gè)設(shè)備對(duì)應(yīng)于一個(gè)設(shè)備文件,具

有獨(dú)立的設(shè)備號(hào)。主設(shè)備號(hào)描述相應(yīng)的設(shè)備驅(qū)動(dòng)程

序,從設(shè)備號(hào)用來區(qū)分同一驅(qū)動(dòng)程序控制下的不同

設(shè)備實(shí)例。

清華大學(xué)出版社

5.1.2設(shè)備實(shí)例—磁盤

磁盤是計(jì)算機(jī)系統(tǒng)中最常見的存儲(chǔ)設(shè)備,IDE磁盤是

現(xiàn)在PC上使用最廣泛的硬盤類型,每個(gè)IDE控制卡

支持兩個(gè)獨(dú)立的盤(可以是硬盤、光驅(qū)等),每個(gè)

盤在Linux里表現(xiàn)為獨(dú)立的塊設(shè)備。

操作系統(tǒng)本身以及大量的用戶數(shù)據(jù)都存放在磁盤中,

同時(shí),Linux系統(tǒng)還使用一部分磁盤空間作為內(nèi)存

交換空間,實(shí)現(xiàn)虛擬內(nèi)存管理。所有實(shí)際的磁盤都

由多層盤片組成,磁盤的物理結(jié)構(gòu)示意圖參看圖

5.1o磁盤的扇區(qū)個(gè)數(shù)、磁頭個(gè)數(shù)和柱面?zhèn)€數(shù)三個(gè)

數(shù)據(jù)稱為磁盤的基本幾何參數(shù)。如果知道每個(gè)扇區(qū)

的具體容量(單位扇區(qū)容量),整個(gè)磁盤的容量就

是這三個(gè)幾何參數(shù)和單位扇區(qū)容量的乘積。

1GUNiy£HS.lTYPRESS、

柱面

圖5.1磁盤設(shè)備結(jié)構(gòu)示意圖

清華大學(xué)出版社

磁盤數(shù)據(jù)的讀寫需要一定的時(shí)間,這個(gè)時(shí)間具體由三

個(gè)部分組成,一是磁頭跨越磁道徑向移動(dòng)到要讀寫

道的時(shí)間,一般稱為尋道時(shí)間;二是要讀寫磁道等

待數(shù)據(jù)移動(dòng)到磁頭位置的時(shí)間,稱為旋轉(zhuǎn)延遲時(shí)

間;三是具體讀寫數(shù)據(jù)的時(shí)間,稱為數(shù)據(jù)傳輸時(shí)

間。

在實(shí)際的使用過程中,通常把整個(gè)磁盤劃分為小的管

理單元,稱為磁盤分區(qū)(partition)。在Linux系統(tǒng)

中,每一個(gè)磁盤分區(qū)都可以安裝一個(gè)獨(dú)立的文件系

統(tǒng),具有獨(dú)立的設(shè)備號(hào),主設(shè)備號(hào)對(duì)應(yīng)著磁盤本

身,從設(shè)備號(hào)對(duì)應(yīng)于該磁盤上具體的分區(qū),同時(shí),

系統(tǒng)還使用惟一的設(shè)備文件去表示磁盤分區(qū),比如

設(shè)備文件/dev/hda5,hda表示該磁盤的IDE接口上的

第1個(gè)磁盤(依此類推,hdb、hdc表示該接口上第

2、

春華大學(xué)出版社.

第3個(gè)磁盤等等),對(duì)應(yīng)于主設(shè)備號(hào),5是它的從設(shè)

備號(hào)。

清華大學(xué)出版社

5.2數(shù)據(jù)傳輸

數(shù)據(jù)在外部設(shè)備與處理機(jī)、內(nèi)存之間的傳輸控制,是

操作系統(tǒng)設(shè)備管理的主要功能,從設(shè)備到內(nèi)存和處

理機(jī)的數(shù)據(jù)傳輸稱為輸入(input),從內(nèi)存和處

理機(jī)到設(shè)備的傳輸稱為輸出(output),因此數(shù)據(jù)

傳輸也通常稱為數(shù)據(jù)I/O。一般的PC中,CPU、內(nèi)

存通過系統(tǒng)總線連接在一起,總線定義了所有設(shè)備

之間通信的協(xié)議,各種設(shè)備都直接或者間接地連接

在總線上,設(shè)備和處理機(jī)以及內(nèi)存之間的數(shù)據(jù)傳輸

必須通過總線來實(shí)現(xiàn)。數(shù)據(jù)傳輸控制要求能夠?qū)崿F(xiàn)

數(shù)據(jù)在外部設(shè)備和內(nèi)存、CPU之間快速、可靠的傳

送,充分發(fā)揮設(shè)備資源的能力,同時(shí)使用盡可能少

的系統(tǒng)開銷。

5.2.1數(shù)據(jù)傳輸控制方式

PC機(jī)中常用的數(shù)據(jù)傳輸控制方式包括程序直接控

制、中斷和內(nèi)存直接訪問三種。

1.程序直接控制

程序直接控制方式就是由用戶進(jìn)程來直接控制內(nèi)存,

或者CPU和外部設(shè)備之間的數(shù)據(jù)傳輸。用戶進(jìn)程是

數(shù)據(jù)傳輸?shù)目刂普撸谶M(jìn)程執(zhí)行過程中需要傳輸數(shù)

據(jù)時(shí),通過CPU啟動(dòng)外部設(shè)備,繼續(xù)占用處理機(jī),

進(jìn)入查詢測(cè)試等待。該進(jìn)程不停地查詢?cè)O(shè)備是否準(zhǔn)

備好,一旦數(shù)據(jù)準(zhǔn)備好,完成數(shù)據(jù)傳輸,繼續(xù)下面

的執(zhí)行。

清華大學(xué)出版社

在整個(gè)傳輸過程中,用戶進(jìn)程一直占用CPU,而

CPU所做的大量工作是查詢?cè)O(shè)備的狀態(tài),因此這種

傳輸方式也稱為查詢測(cè)試方式。如果采用這種方式

來傳輸大量的數(shù)據(jù),由于外部設(shè)備的速度比CPU要

慢很多,因此大量的時(shí)間浪費(fèi)在查詢上,設(shè)備的利

用率可以得到一定程度的保證,但是CPU資源卻得

不到有效的利用。

2.中斷方式

針對(duì)程序直接傳輸浪費(fèi)CPU資源的缺陷,引入了中

斷(interrupt)技術(shù)。中斷方式要求CPU和外部設(shè)

備之間有相應(yīng)的中斷請(qǐng)求線,外部設(shè)備可以通過中

斷請(qǐng)求線打斷CPU正在進(jìn)行的工作,轉(zhuǎn)入相應(yīng)的操

作。

清華大學(xué)出版社

中斷方式下,當(dāng)用戶進(jìn)程執(zhí)行過程中需要數(shù)據(jù)傳輸

時(shí),通過CPU啟動(dòng)外部設(shè)備,自己放棄處理機(jī)資

源,進(jìn)入等待狀態(tài),外部設(shè)備進(jìn)行相應(yīng)的數(shù)據(jù)準(zhǔn)備

工作,而CPU可以經(jīng)過調(diào)度被其他進(jìn)程所使用。直

到外部數(shù)據(jù)準(zhǔn)備完成之后,設(shè)備通過中斷請(qǐng)求線發(fā)

出中斷,發(fā)生調(diào)度,CPU轉(zhuǎn)入中斷處理程序,進(jìn)行

相應(yīng)的數(shù)據(jù)操作,而等待數(shù)據(jù)傳輸?shù)倪M(jìn)程被喚醒轉(zhuǎn)

入就緒狀態(tài),在適當(dāng)?shù)臅r(shí)候占有處理機(jī),并得到數(shù)

據(jù)繼續(xù)執(zhí)行。

利用中斷方式,在用戶進(jìn)程等待設(shè)備準(zhǔn)備數(shù)據(jù)到發(fā)出

中斷這一段時(shí)間內(nèi),CPU可以執(zhí)行其他進(jìn)程,提高

了處理機(jī)和外部設(shè)備的并行程度,一定程度上解決

了處理機(jī)資源浪費(fèi)的問題。但是,如果設(shè)備每

害小匕一;i學(xué)+

/刁一,一廠j必丁一

一次進(jìn)行數(shù)據(jù)傳輸都只能準(zhǔn)備少量的數(shù)據(jù)的話,系

統(tǒng)的效率也得不到有效的提高。每次只傳輸少量數(shù)

據(jù),每次都要發(fā)生中斷,需要進(jìn)行多次進(jìn)程調(diào)度和

進(jìn)程現(xiàn)場(chǎng)切換,就要耗費(fèi)大量的CPU資源。同時(shí),

如果有多個(gè)設(shè)備同時(shí)進(jìn)行大規(guī)模的數(shù)據(jù)傳輸,整個(gè)

系統(tǒng)中的中斷次數(shù)會(huì)急劇增加,造成CPU無法及時(shí)

響應(yīng)中斷,出現(xiàn)數(shù)據(jù)丟失的情況。因此,必須采取

一定的措施保證設(shè)備在一次中斷發(fā)生之前進(jìn)行相當(dāng)

規(guī)模的數(shù)據(jù)傳輸。

3.直接內(nèi)存訪問

直接內(nèi)存訪問(DirectMemoryAccess,DMA)可

以用來解決中斷方式的上述問題,它在外部設(shè)備和

內(nèi)存之間開辟直接的數(shù)據(jù)通道,設(shè)備控制器具有。

清華大學(xué)出版社

更強(qiáng)的功能,可以竊取CPU的一個(gè)工作周期,不需

要CPU的參與直接把數(shù)據(jù)放入到內(nèi)存中指定的位

置。

DMA方式傳輸數(shù)據(jù)時(shí),正在執(zhí)行的用戶進(jìn)程通過CPU

發(fā)出數(shù)據(jù)傳輸請(qǐng)求,同時(shí)把數(shù)據(jù)存放地址和數(shù)據(jù)量

這些主要參數(shù)通知DMA控制器,用戶進(jìn)程轉(zhuǎn)入等待

狀態(tài),CPU可以執(zhí)行其他進(jìn)程,外部設(shè)備不斷地竊

取CPU的工作周期,把準(zhǔn)備好的數(shù)據(jù)不斷地寫入內(nèi)

存相應(yīng)的位置,直到所要求的數(shù)量全部完成或者發(fā)

生錯(cuò)誤,才通過中斷線通知CPU進(jìn)行相應(yīng)的中斷處

理,這時(shí)需要數(shù)據(jù)的用戶進(jìn)程轉(zhuǎn)入就緒狀態(tài),在適

當(dāng)?shù)臅r(shí)間占用CPU繼續(xù)執(zhí)行。在整個(gè)數(shù)據(jù)傳輸過程

中,DMA控制器只是獲取CPU的工作周期,并不要

求它做額外的處理,只是到全部數(shù)據(jù)傳輸完成

害小匕一二學(xué)dp

/R-L人一廠UJ必丁一惻颯3踞加購呢^例■

或者出現(xiàn)錯(cuò)誤才發(fā)生中斷,這樣就可以保證使用盡

可能少的中斷來完成盡可能多的數(shù)據(jù)傳輸。

在前兩種數(shù)據(jù)傳輸控制方式中,數(shù)據(jù)傳輸都是圍繞

CPU開展的,CPU得知設(shè)備準(zhǔn)備好數(shù)據(jù)之后,直接

控制數(shù)據(jù)的傳輸,把它們放到內(nèi)存中適當(dāng)?shù)奈恢茫?/p>

由用戶進(jìn)程使用,二者的差別是CPU獲得設(shè)備狀態(tài)

的方式不同,前者靠不斷地查詢,后者是靠設(shè)備發(fā)

送中斷請(qǐng)求。而在DMA方式中,數(shù)據(jù)交換是圍繞

內(nèi)存進(jìn)行的,外部設(shè)備和內(nèi)存之間直接進(jìn)行數(shù)據(jù)傳

輸,數(shù)據(jù)傳輸過程中不需要CPU的干預(yù),只有數(shù)據(jù)

傳輸完成之后才通知CPU。

清華大學(xué)出版社

5.2.2數(shù)據(jù)傳輸關(guān)鍵技術(shù)

從上面的介紹可以看到,中斷技術(shù)在整個(gè)數(shù)據(jù)傳輸過

程中占有相當(dāng)重要的地位,它是提高外部設(shè)備和

CPU的并行程度、改善系統(tǒng)整體性能的關(guān)鍵。另外

一個(gè)關(guān)鍵技術(shù)是緩沖,利用這樣的技術(shù),可以大大

地減少外部設(shè)備的訪問次數(shù),實(shí)現(xiàn)系統(tǒng)整體性能的

提高。

1.中斷

中斷是指計(jì)算機(jī)在執(zhí)行期間,系統(tǒng)內(nèi)發(fā)生任何非尋常

的或非預(yù)期的急需處理事件,使得CPU暫時(shí)中斷當(dāng)

前正在執(zhí)行的程序,而轉(zhuǎn)去執(zhí)行相應(yīng)的事件處理程

序,待處理完畢后又返回原來被中斷處,繼續(xù)執(zhí)行

或者調(diào)度新的進(jìn)程執(zhí)行的過程。引起中斷發(fā)生的

高華十字出版社

事件稱為中斷源,在計(jì)算機(jī)系統(tǒng)中,外部設(shè)備數(shù)據(jù)

傳輸過程中發(fā)生的中斷屬于I/O中斷,是中斷源中

的一大類,其他中斷源有周期性的時(shí)鐘中斷、電源

掉電產(chǎn)生的中斷等等。中斷源向CPU發(fā)出的請(qǐng)求中

斷處理信號(hào)稱為中斷請(qǐng)求,而CPU收到中斷請(qǐng)求后

轉(zhuǎn)入相應(yīng)的事件處理程序稱為中斷響應(yīng)。

按照中斷源產(chǎn)生的位置,中斷分為內(nèi)中斷和外中斷。

內(nèi)中斷由處理機(jī)和內(nèi)存內(nèi)部產(chǎn)生,通常也稱為陷

阱,它包括程序運(yùn)算引起的各種錯(cuò)誤和分時(shí)系統(tǒng)中

的時(shí)間片中斷等等。外中斷由處理機(jī)和內(nèi)存之外的

設(shè)備發(fā)出,包括上面講到的I/O中斷和時(shí)鐘、電源

中斷等等。

清華大學(xué)出版社

并不是所有中斷請(qǐng)求都會(huì)得到及時(shí)的響應(yīng)。很多情況

下,比如系統(tǒng)正在進(jìn)行進(jìn)程調(diào)度或者內(nèi)存調(diào)度操

作,為了保證操作的封閉性,這時(shí)不允許CPU響應(yīng)

中斷,這種情況稱為禁止中斷或者關(guān)中斷。CPU禁

止中斷,完成必要的操作之后必須通過硬件重新設(shè)

置才能夠接收中斷,這個(gè)過程稱為開中斷。

關(guān)中斷之后,CPU不接受任何中斷請(qǐng)求。另外一種

情況是CPU可以有選擇地響應(yīng)某些中斷,稱為中斷

屏蔽。中斷屏蔽是指中斷請(qǐng)求產(chǎn)生之后,系統(tǒng)用軟

件方式有選擇地封鎖部分中斷,而允許其余部分中

斷仍然能夠得到響應(yīng)。

并不是所有中斷請(qǐng)求都具有平等地得到響應(yīng)的權(quán)利,

根據(jù)中斷源的緊急程度,操作系統(tǒng)對(duì)不同的中斷請(qǐng)

害小匕一上學(xué)dp已行力十

/司-L人一廠J川,?丁一就第3W”跳加財(cái)呢^枷■

求賦予不同的優(yōu)先級(jí)。如果兩個(gè)中斷請(qǐng)求同時(shí)發(fā)

生,優(yōu)先級(jí)高的中斷有權(quán)在優(yōu)先級(jí)低的中斷之前得

到響應(yīng)。各種中斷源的優(yōu)先級(jí)在系統(tǒng)設(shè)計(jì)時(shí)設(shè)置完

成。

而CPU收到中斷請(qǐng)求后,首先要進(jìn)行進(jìn)程切換,原

來正在執(zhí)行的進(jìn)程放棄處理機(jī),保護(hù)現(xiàn)場(chǎng)完成之

后,轉(zhuǎn)入相應(yīng)的事件處理程序,進(jìn)行中斷處理。

一臺(tái)PC機(jī)中斷號(hào)的個(gè)數(shù)是有限的,在Linux系統(tǒng)中,

中斷號(hào)當(dāng)前使用情況記錄在文件/proc/interrupts

中。如果安裝了很多設(shè)備,大家就必須采取一定的

措施來共享有限的中斷號(hào)資源,稱為中斷共享,實(shí)

現(xiàn)中斷共享需要設(shè)備和中斷處理程序兩個(gè)方面的支

持,一方面CPU能夠通過詢問設(shè)備而知道該設(shè)備是

否產(chǎn)生過中斷,另一方面中斷處理程序能夠向前傳

清華大學(xué)出版社

2.緩沖

緩沖是計(jì)算機(jī)系統(tǒng)中為了解決外部設(shè)備和CPU之間

處理速度的匹配問題,減少外部設(shè)備中斷請(qǐng)求次數(shù)

而設(shè)置的暫時(shí)存放數(shù)據(jù)的區(qū)域。

根據(jù)數(shù)據(jù)傳輸控制方式,可以有兩種實(shí)現(xiàn)方式。一是

采用硬件緩沖器,在外部設(shè)備中設(shè)置緩沖,外部設(shè)

備每次傳輸數(shù)據(jù)之前,可以利用緩沖器準(zhǔn)備更多的

數(shù)據(jù),提高每一次傳輸?shù)臄?shù)據(jù)量,減少傳輸?shù)拇?/p>

數(shù)??梢韵胂螅绻硞€(gè)設(shè)備每次只準(zhǔn)備一個(gè)字

節(jié),傳輸1KB數(shù)據(jù)需要發(fā)生一千多次中斷請(qǐng)求,即

便是DMA方式,也需要一千次獲取CPU工作周

期,每次傳輸都要獲取總線使用權(quán),對(duì)其他進(jìn)程的

影響會(huì)是很大的。如果該設(shè)備設(shè)置1KB大小的緩沖

器,4MM

清華大學(xué)出版社

以先把數(shù)據(jù)都準(zhǔn)備在緩沖中,然后只需要一次中

斷,一次性掌握CPU和總線就可以完成數(shù)據(jù)傳輸,

系統(tǒng)的效率可以得到明顯的改善。另一種方法是在

內(nèi)存中劃分專用的數(shù)據(jù)緩沖區(qū),所有的數(shù)據(jù)I/O都

要經(jīng)過這些緩沖區(qū),每次發(fā)生數(shù)據(jù)傳輸后并不清除

緩沖區(qū)中數(shù)據(jù),下一次訪問數(shù)據(jù)時(shí)首先在緩沖區(qū)中

查找,如果緩沖區(qū)中有,則不需要啟動(dòng)外部設(shè)備就

可以得到需要的數(shù)據(jù),如果緩沖區(qū)中沒有需要的數(shù)

據(jù),再啟動(dòng)設(shè)備。這樣,經(jīng)過一段時(shí)間的積累,經(jīng)

常訪問的數(shù)據(jù)基本都在緩沖區(qū)中,系統(tǒng)啟動(dòng)設(shè)備的

次數(shù)就大大降低,可以提高數(shù)據(jù)I/O的整體效率。

前一種實(shí)現(xiàn)方法主要是設(shè)備的硬件本身增加了緩沖

器,屬于硬件緩沖,后一種方法則主要由操作系統(tǒng)

清華大學(xué)出版社

來實(shí)現(xiàn),稱為軟緩存。在Linux系統(tǒng)中,I/O過程中

使用了多種緩沖區(qū),其中最主要的是由文件系統(tǒng)來

管理,用來實(shí)現(xiàn)塊設(shè)備I/O的塊高速緩沖區(qū),第6章

“文件系統(tǒng)”中,將結(jié)合塊高速緩沖區(qū)進(jìn)一步討論緩

沖技術(shù)的實(shí)現(xiàn)和管理。

5.3I/O軟件原理

I/O軟件是控制外部設(shè)備與內(nèi)存、處理機(jī)進(jìn)行數(shù)據(jù)交

換的所有軟件的通稱。其主要的任務(wù)是充分發(fā)揮各

種設(shè)備的作用,屏蔽各種設(shè)備的特殊性,在保證系

統(tǒng)具有較高的整體性的同時(shí),盡可能向用戶提供一

個(gè)友好、清晰、規(guī)范和設(shè)備獨(dú)立的配置及使用界

面。

計(jì)算機(jī)系統(tǒng)的I/O軟件也同樣具有層次結(jié)構(gòu)。

看華尢學(xué)出版社匐

mIUNVARSITYPHESR

5.3.1Linux系統(tǒng)I/O軟件層次結(jié)構(gòu)

操作系統(tǒng)中I/O軟件大多數(shù)都可以看作是分層結(jié)構(gòu),

圖5.2給出了Linux系統(tǒng)I/O軟件層次結(jié)構(gòu)示意圖。

高華大學(xué)出版社

——玉―,―工丫PRESS

用戶進(jìn)程.會(huì):起工/。過程,接受工/。結(jié)果

1/。請(qǐng)求OO1/O應(yīng)答

文設(shè)備命名、保護(hù)

緩沖管理

統(tǒng)設(shè)備分配

設(shè)備作動(dòng)程序

中斷處理程序

硬件設(shè)備

圖5.2Linux系統(tǒng)I/O軟件層次結(jié)構(gòu)示意圖

清華大學(xué)出版社

在Linux系統(tǒng)中,I/O軟件和文件系統(tǒng)是緊密聯(lián)系的,

文件系統(tǒng)提供了用戶訪問設(shè)備、進(jìn)行數(shù)據(jù)I/O操作

的一致性接口,這個(gè)部分是設(shè)備獨(dú)立的,用戶可以

采用統(tǒng)一的方式訪問不同的設(shè)備,文件系統(tǒng)中實(shí)現(xiàn)

了設(shè)備管理的設(shè)備無關(guān)性。

在Linux系統(tǒng)中設(shè)備都是按照文件的方式命名的,每

一個(gè)設(shè)備是一個(gè)特殊類型的文件,從用戶使用的角

度來看,對(duì)設(shè)備的訪問也等同于對(duì)文件的訪問,具

體的設(shè)備操作由文件系統(tǒng)根據(jù)情況映射到具體的設(shè)

備驅(qū)動(dòng)程序來完成。所有的設(shè)備都采用和文件相同

的訪問權(quán)限控制方法,這種訪問權(quán)限的控制和用戶

聯(lián)系在一起,有效地實(shí)現(xiàn)了設(shè)備的保護(hù)和設(shè)備數(shù)據(jù)

的保密。

害小匕一七歲dpL后力十

/R-l人一廠j必丁一以理3W殂踞物財(cái)呢

緩沖區(qū)管理和設(shè)備分配也是由文件系統(tǒng)完成的。這里

的緩沖區(qū)主要指內(nèi)存中開辟的軟緩沖區(qū),它是關(guān)系

到整個(gè)系統(tǒng)效率的關(guān)鍵技術(shù)之一。對(duì)于系統(tǒng)中的磁

盤等共享設(shè)備,可以在文件系統(tǒng)的管理下同時(shí)為多

個(gè)用戶服務(wù),而對(duì)于打印機(jī)等獨(dú)占設(shè)備,則屬于臨

界資源,某一個(gè)特定時(shí)刻通常只能為一個(gè)用戶提供

服務(wù),這兩種不同類型的設(shè)備必須分別采取不同的

分配方式。

處理和管理硬件控制器的軟件是設(shè)備驅(qū)動(dòng)程序。在

Linux系統(tǒng)中,每個(gè)設(shè)備驅(qū)動(dòng)程序都是內(nèi)核的一部

分,它們提供設(shè)備與系統(tǒng)引導(dǎo)程序的接口,可以在

啟動(dòng)過程中對(duì)設(shè)備進(jìn)行初始化,還提供面向設(shè)備無

關(guān)部分的接口,接受上層設(shè)備無關(guān)軟件的I/O請(qǐng)

求,.=^一二—一______

高華十字出版社

最后通過向下的設(shè)備控制器接口,采用查詢或者中斷

方式操縱設(shè)備控制器,來和具體設(shè)備進(jìn)行數(shù)據(jù)傳

輸。Linux系統(tǒng)的設(shè)備驅(qū)動(dòng)程序通??梢圆捎媚K

(modules)的方式來設(shè)計(jì),在系統(tǒng)引導(dǎo)完成之

后,可以動(dòng)態(tài)地加載或卸載,5.3.2節(jié)將介紹這方面

的知識(shí)。

除了少量使用查詢方式的設(shè)備之外,計(jì)算機(jī)系統(tǒng)中大

多數(shù)設(shè)備都利用中斷來控制數(shù)據(jù)的傳輸。中斷發(fā)生

之后,CPU將保存現(xiàn)場(chǎng)并切換到中斷處理程序。一

般情況下,中斷處理過程中不允許再響應(yīng)其他中

斷,至少不能響應(yīng)具有相同、或者更低優(yōu)先級(jí)的中

斷,為了不影響其他中斷的正常響應(yīng),中斷處理過

程必須要盡可能快地完成。

清華大學(xué)出版社

實(shí)際上,要保證每一個(gè)中斷處理程序都很快執(zhí)行完是

不太現(xiàn)實(shí)的。Linux采用了一種特殊的方式來實(shí)現(xiàn)

中斷處理的快速完成,稱為底半(bottomhalf)處

理的技術(shù)。每一個(gè)中斷處理程序,實(shí)際上都可以劃

分為兩個(gè)部分--一個(gè)部分響應(yīng)中斷請(qǐng)求,傳輸相

關(guān)數(shù)據(jù),通常只是中斷處理工作中很小的一部分;

另一個(gè)部分處理和發(fā)生中斷的設(shè)備相關(guān)的各種數(shù)據(jù)

結(jié)構(gòu),解決設(shè)備狀態(tài)信息和操作模式的轉(zhuǎn)換等各種

善后工作,這個(gè)部分通常要和設(shè)備進(jìn)行通信,需要

更多的時(shí)間。根據(jù)中斷處理程序的這種特點(diǎn),

Linux系統(tǒng)中把一個(gè)中斷處理分隔為兩個(gè)部分:快

速的上半部分(tophalf,頂半)和慢速的下半部

分(bottomhalf,底半)。頂半只處理很少一部分

高華十字出版社

工作,通常負(fù)責(zé)處理硬件發(fā)出的請(qǐng)求,解決數(shù)據(jù)傳

輸問題,必須快速執(zhí)行,盡可能保證在下一個(gè)中斷

產(chǎn)生之前完成。底半處理該設(shè)備相關(guān)的數(shù)據(jù)結(jié)構(gòu)和

設(shè)備狀態(tài)控制信息等比較費(fèi)時(shí)的工作,時(shí)間方面的

要求不很高,同時(shí)也允許響應(yīng)其他中斷請(qǐng)求。

因此,Linux中斷處理程序可以分為頂半和底半兩個(gè)

部分,中斷發(fā)生之后,中斷處理的頂半首先快速執(zhí)

行,處理完成之后就可以接受其他中斷,剩下的底

半部分放到一個(gè)特定的隊(duì)列中,由內(nèi)核提供的特殊

機(jī)制負(fù)責(zé)在適當(dāng)?shù)臅r(shí)機(jī)統(tǒng)一執(zhí)行。這樣,既可以保

證中斷處理程序的完整性,又可以快速響應(yīng)其他中

斷,保證系統(tǒng)具有良好的響應(yīng)特性。

清華大學(xué)出版社

當(dāng)一個(gè)用戶進(jìn)程發(fā)出I/O請(qǐng)求之后(比如,在用戶進(jìn)程

中執(zhí)行了一個(gè)設(shè)備讀取的函數(shù)調(diào)用,這個(gè)I/O請(qǐng)求

直接發(fā)送給文件系統(tǒng)),文件系統(tǒng)根據(jù)函數(shù)調(diào)用參

數(shù)確定需要讀取的設(shè)備,先進(jìn)行設(shè)備訪問權(quán)限的檢

驗(yàn),如果合法則繼續(xù)進(jìn)行,否則就返回錯(cuò)誤信息。

文件系統(tǒng)為這個(gè)讀取工作申請(qǐng)適當(dāng)?shù)木彌_區(qū),如果

發(fā)現(xiàn)需要的數(shù)據(jù)在緩沖區(qū)中已經(jīng)存在,直接從緩沖

區(qū)中讀取數(shù)據(jù),向用戶進(jìn)程返回I/O應(yīng)答,整個(gè)讀

取過程完成。

清華大學(xué)出版社

如果緩沖區(qū)中沒有需要的數(shù)據(jù),文件系統(tǒng)根據(jù)情況進(jìn)

行設(shè)備分配,向下層的設(shè)備驅(qū)動(dòng)程序發(fā)送具體的讀

取請(qǐng)求。驅(qū)動(dòng)程序利用上層傳來的數(shù)據(jù)信息,操縱

設(shè)備控制器讀取數(shù)據(jù),發(fā)出讀取命令后進(jìn)入等待狀

態(tài),設(shè)備則進(jìn)行具體的數(shù)據(jù)準(zhǔn)備工作,CPU則可以

轉(zhuǎn)向其他進(jìn)程。外部設(shè)備數(shù)據(jù)準(zhǔn)備完成之后,發(fā)出

中斷請(qǐng)求,轉(zhuǎn)入中斷處理程序完成負(fù)責(zé)中斷響應(yīng)和

數(shù)據(jù)傳輸?shù)捻敯氩糠?,中斷處理的底半部分在適當(dāng)

的時(shí)候再由內(nèi)核去完成,喚醒設(shè)備驅(qū)動(dòng)程序把數(shù)據(jù)

放入相應(yīng)的緩沖區(qū)中,返回緩沖區(qū)狀態(tài)給文件系

統(tǒng)。然后由文件系統(tǒng)從緩沖區(qū)中讀取數(shù)據(jù)給用戶進(jìn)

程,返回I/O應(yīng)答。

清華大學(xué)出版社

在設(shè)備讀寫過程中,比較慢的是設(shè)備和內(nèi)存之間進(jìn)行

數(shù)據(jù)交換的過程,特別是設(shè)備準(zhǔn)備數(shù)據(jù)的過程,而

從緩沖區(qū)中讀取數(shù)據(jù)是內(nèi)存不同位置之間的數(shù)據(jù)傳

輸,速度要快得多。對(duì)于經(jīng)常訪問的設(shè)備,要讀取

的內(nèi)容已經(jīng)在緩沖區(qū)中的情況占絕大多數(shù),因此通

過緩沖區(qū)的使用,外部設(shè)備讀寫的效率可以得到很

大的提高,當(dāng)然,這種效率是以系統(tǒng)本身的復(fù)雜性

為代價(jià)的。

清華大學(xué)出版社

5.3.2Linux設(shè)備驅(qū)動(dòng)程序

設(shè)備驅(qū)動(dòng)程序是設(shè)備管理的主要軟件之一,它負(fù)責(zé)控

制各種設(shè)備,是向文件系統(tǒng)提供一致性界面的關(guān)鍵

層。每個(gè)設(shè)備都必須由特定的設(shè)備驅(qū)動(dòng)程序來管

理,由于設(shè)備本身種類繁多,性能各異,造成了系

統(tǒng)中設(shè)備驅(qū)動(dòng)程序也有很多種類,驅(qū)動(dòng)程序代碼占

整個(gè)系統(tǒng)內(nèi)核代碼的大多數(shù)。但是這些針對(duì)不同設(shè)

備的驅(qū)動(dòng)程序都使用基本相同的接口與內(nèi)核其他部

分通信,設(shè)備的特殊性在這個(gè)層次中深深地隱藏起

來,這給用戶以及系統(tǒng)其他部分使用和管理設(shè)備帶

來了極大的方便。

害小匕一七學(xué)dpL后

/司-L人一廠j必丁一期財(cái)(則照堤的解腳32

在第1章學(xué)習(xí)操作系統(tǒng)基礎(chǔ)知識(shí)的時(shí)候,曾經(jīng)介紹

過,Linux內(nèi)核基本采用模塊結(jié)構(gòu),不同的內(nèi)核子

系統(tǒng)按照模塊來構(gòu)建,作為一個(gè)整體存在于系統(tǒng)內(nèi)

存中,屬于單內(nèi)核(或宏內(nèi)核)模式,這使得系統(tǒng)

具有相當(dāng)高的運(yùn)行效率,但是系統(tǒng)的可擴(kuò)展性及可

移植性受到一定的影響。與之相對(duì)應(yīng)的是微內(nèi)核模

式,微內(nèi)核中大部分內(nèi)核模塊都作為獨(dú)立的進(jìn)程,

它們之間通過消息通信,模塊之間互相提供服務(wù)。

清華大學(xué)出版社

采用微內(nèi)核模式的操作系統(tǒng)中,用戶可以方便地添加

新的組件,實(shí)現(xiàn)設(shè)備驅(qū)動(dòng)等新的功能,相對(duì)來講,

單內(nèi)核模式中添加新組件要困難得多。Linux系統(tǒng)

采用模塊(modules,也稱為模組)技術(shù),來支持

動(dòng)態(tài)裝載和卸載的模塊,動(dòng)態(tài)裝載或卸載時(shí)甚至不

需要重新啟動(dòng)計(jì)算機(jī)。利用模塊技術(shù),就可以方便

地在單內(nèi)核結(jié)構(gòu)中添加新組件或卸載不再需要的內(nèi)

核組件。

每一個(gè)模塊都是核心的一部分,都運(yùn)行于系統(tǒng)態(tài),和

其他內(nèi)核部分具有相同的權(quán)限,因此,有漏洞的模

塊會(huì)給系統(tǒng)的性能和穩(wěn)定性帶來不利的影響,而惡

意的模塊就可能成為一個(gè)邏輯炸彈或病毒的良好載

體,對(duì)系統(tǒng)的安全造成威脅。

/害司小-匕L一人七一學(xué)廠dJp必已后丁->十-翹星則儂質(zhì)燦題呢£^陟《

除了系統(tǒng)啟動(dòng)過程中所必須的設(shè)備(如鍵盤、磁盤設(shè)

備等)之外,其他大多數(shù)設(shè)備以及偽設(shè)備(網(wǎng)絡(luò)設(shè)

備、文件系統(tǒng)等)的設(shè)備驅(qū)動(dòng)程序,都是采用模塊

方式來管理的。在系統(tǒng)啟動(dòng)完成之后,系統(tǒng)管理員

可以利用相關(guān)的命令來查看、加載、卸載各種驅(qū)動(dòng)

程序模塊。

Linux設(shè)備驅(qū)動(dòng)程序基本結(jié)構(gòu)

早期,Linux系統(tǒng)支持的設(shè)備驅(qū)動(dòng)程序大多數(shù)是業(yè)余

高手們開發(fā)的,隨著Linux的不斷發(fā)展,越來越多

設(shè)備生產(chǎn)廠商也開始提供驅(qū)動(dòng)程序。所有驅(qū)動(dòng)程序

都是內(nèi)核的一部分,驅(qū)動(dòng)程序的結(jié)構(gòu)和接口都有相

當(dāng)規(guī)范的定義。

清華大學(xué)出版社

給Linux寫設(shè)備驅(qū)動(dòng)程序是一件相當(dāng)容易的事,而且

很多人都在做這樣的工作,這里不打算介紹具體的

開發(fā)過程,這方面的資料網(wǎng)上很多。如果某一天,

你發(fā)現(xiàn)你的某一個(gè)設(shè)備無法驅(qū)動(dòng),首先應(yīng)該到網(wǎng)上

去找找,說不定有人碰到和你同樣的問題,而且已

經(jīng)寫好了這樣的驅(qū)動(dòng)程序,實(shí)在不行,自己動(dòng)手花

一兩天時(shí)間,應(yīng)該就可以完成了。這里只簡(jiǎn)單介紹

驅(qū)動(dòng)程序的基本結(jié)構(gòu)。

根據(jù)圖5.2所示的I/O軟件結(jié)構(gòu)圖,設(shè)備驅(qū)動(dòng)程序向下

的接口是面對(duì)設(shè)備控制器的,它定義了驅(qū)動(dòng)程序如

何與設(shè)備進(jìn)行通信的協(xié)議;向上面對(duì)的是文件系

統(tǒng),它通過文件系統(tǒng)為內(nèi)核其他部分提供統(tǒng)一的接

口,用戶的設(shè)備操作通過文件系統(tǒng)來映射到具體的

高華文學(xué)出版社

設(shè)備驅(qū)動(dòng)程序,這一部分接口對(duì)于所有設(shè)備驅(qū)動(dòng)程

序幾乎都是相同的;止匕外,還應(yīng)當(dāng)提供與系統(tǒng)引導(dǎo)

的接口,這是在系統(tǒng)啟動(dòng)過程或者加載設(shè)備驅(qū)動(dòng)模

塊時(shí),初始化設(shè)備所必需的。

一個(gè)完整的設(shè)備驅(qū)動(dòng)程序通常包括五個(gè)部分:設(shè)備驅(qū)

動(dòng)程序的注冊(cè)與注銷、設(shè)備的打開與釋放、設(shè)備的

讀寫操作、設(shè)備的控制操作,以及設(shè)備的中斷或者

查詢處理。

害小匕一七學(xué)已后->十

/司-L人一廠dJp必丁-翹星則儂質(zhì)燦題呢£^陟《

驅(qū)動(dòng)程序的注冊(cè)是在系統(tǒng)初始化或驅(qū)動(dòng)程序模塊加載

時(shí)完成的,主要實(shí)現(xiàn)設(shè)備的初始化準(zhǔn)備工作,與之

對(duì)應(yīng),驅(qū)動(dòng)程序注銷是在系統(tǒng)關(guān)閉或者驅(qū)動(dòng)程序模

塊卸載時(shí)完成,二者屬于設(shè)備驅(qū)動(dòng)程序和系統(tǒng)引導(dǎo)

的接口。注冊(cè)之后,同時(shí)也就建立了和文件系統(tǒng)的

接口,文件系統(tǒng)根據(jù)注冊(cè)過的資料,就可以建立文

件操作與具體設(shè)備驅(qū)動(dòng)程序的映射關(guān)系。

和普通文件類似,設(shè)備首先要打開才能夠進(jìn)行讀寫操

作,而且完成操作之后也要及時(shí)地釋放,釋放設(shè)備

私有數(shù)據(jù)占據(jù)的內(nèi)存、關(guān)閉設(shè)備等等,以確保下次

可以正常打開和使用設(shè)備。在設(shè)備驅(qū)動(dòng)程序這個(gè)層

次上,這些操作針對(duì)不同的設(shè)備要由不同的函數(shù)來

完成。

清華十字出版社

SJTYPRESS

在讀寫過程中,設(shè)備可能采用查詢或者中斷的方式來

控制數(shù)據(jù)傳輸,針對(duì)不同的數(shù)據(jù)傳輸控制方式,驅(qū)

動(dòng)程序采取不同的管理方式實(shí)現(xiàn)具體的數(shù)據(jù)傳輸。

/司-L人一廠UJ必丁-版婀0肘IB”邕身因則便露唇卻,

5.4小結(jié)

本章介紹了Linux設(shè)備管理方面的基礎(chǔ)知識(shí)。在

Linux系統(tǒng)中,根據(jù)系統(tǒng)管理方式的不同,設(shè)備可

以分為字符設(shè)備、塊設(shè)備和網(wǎng)絡(luò)設(shè)備三類,所有的

設(shè)備基本都是按照特殊的文件一一設(shè)備文件來對(duì)

待。因此,在操作系統(tǒng)使用過程中,設(shè)備的特殊性

都為文件系統(tǒng)所屏蔽,用戶命令、系統(tǒng)調(diào)用,以及

內(nèi)核其他部分只能通過文件系統(tǒng),以統(tǒng)一的模式來

使用設(shè)備。

清華大學(xué)出版社

可以使用不同的方式控制外部設(shè)備、CPU和內(nèi)存之

間的數(shù)據(jù)傳輸,PC機(jī)通常使用的方式有程序直接

控制(查詢)、中斷,以及內(nèi)存直接訪

(DMA)o

提高數(shù)據(jù)傳輸效率的另一個(gè)有效手段是緩沖,可以在

設(shè)備上增加緩沖器,設(shè)備每次傳輸數(shù)據(jù)之前可以準(zhǔn)

備更多的數(shù)據(jù),擴(kuò)大設(shè)備與CPU或內(nèi)存之間一次數(shù)

據(jù)傳輸?shù)囊?guī)模,減少中斷次數(shù),稱為硬緩沖,這種

方法增加了硬件設(shè)備的成本和復(fù)雜度。也可以在內(nèi)

存中開辟緩沖區(qū),設(shè)備與CPU或內(nèi)存之間的數(shù)據(jù)傳

輸都通過這樣的緩沖區(qū)保留備份,下一次用戶進(jìn)程

需要數(shù)據(jù)傳輸時(shí)首先在緩沖中尋找,如果已經(jīng)存在

于緩沖中,就不需要再啟動(dòng)外部設(shè)備,從而節(jié)約了

大量的時(shí)間,這種方式稱為軟緩沖,在Linux系統(tǒng)

中統(tǒng)一由文件系統(tǒng)管理。

/司-L人一廠j必丁一捌31儂跪惻眄^

I/O軟件是控制外部設(shè)備與內(nèi)存、處理機(jī)進(jìn)行數(shù)據(jù)交

換的所有軟件的通稱。Linux系統(tǒng)的I/O軟件具有層

次結(jié)構(gòu),上層是文件系統(tǒng),它負(fù)責(zé)設(shè)備命名、設(shè)備

保護(hù)、緩沖區(qū)管理以及設(shè)備分配等工作,屏蔽各種

的設(shè)備特殊性,向用戶提供一個(gè)友好、清晰、規(guī)范

和設(shè)備獨(dú)立的配置、使用界面,用戶可以像使用普

通文件那樣進(jìn)行設(shè)備操作;下層主要是設(shè)備驅(qū)動(dòng)程

序和對(duì)應(yīng)的中斷處理程序,Linux系統(tǒng)中大多數(shù)設(shè)

備驅(qū)動(dòng)程序都是獨(dú)立的內(nèi)核模塊,可以動(dòng)態(tài)地加載

和卸載,同時(shí)采用獨(dú)具特色的底半處理技術(shù)來完成

中斷處理,提高中斷處理的效率。

層次構(gòu)造的Linux系統(tǒng)I/O軟件中,所有模塊協(xié)同工

作,可以充分發(fā)揮各種設(shè)備的作用,同時(shí)保證系統(tǒng)

二具有較高的整體性。._________________

卷/司,-[七l人J一/廠一必二行-zp

習(xí)題

5-1數(shù)據(jù)傳輸控制方式有哪幾種?比較它們的優(yōu)缺

點(diǎn)。

5-2什么是中斷、中斷處理和中斷響應(yīng)?為什么要引

入中斷?

5-3在你的機(jī)器中,鍵盤和CPU、內(nèi)存之間的數(shù)據(jù)傳

輸使用什么方式控制?如果有一次計(jì)算機(jī)不再響應(yīng)

任何鍵盤命令,你認(rèn)為是什么原因?有辦法解決

嗎?

5-4什么是緩沖?為什么引入緩沖?

5-5在Linux系統(tǒng)中,為什么我們可以像使用文件一

樣操作一個(gè)設(shè)備?

清華尢學(xué)出版社■n

5-6Linux文件系統(tǒng)在整個(gè)I/O軟件中處于什么地位?

5-7什么是設(shè)備驅(qū)動(dòng)程序?Linux系統(tǒng)中,用戶怎么

使用設(shè)備驅(qū)動(dòng)程序?

5-8下面各項(xiàng)工作是在I/O軟件的哪一層完成?

(a)磁盤寫操作、計(jì)算磁道、扇區(qū)和磁頭

(b)維護(hù)磁盤讀寫高速緩沖

(c)讀取設(shè)備狀態(tài)寄存器

(d)檢查用戶是否可以訪問某個(gè)設(shè)備

5-9如果你新裝的聲卡不工作,你如何解決這個(gè)問

題?

SITYPRESS

第6章文件系統(tǒng)

6.1文件系統(tǒng)概述

6.2文件管理

6.3目錄

6.4邏輯文件系統(tǒng)——Ext2

6.5虛擬文件系統(tǒng)——VFS

6.6小結(jié)

習(xí)題

清華大學(xué)出版社

數(shù)據(jù)處理是計(jì)算機(jī)的主要功能之一,與數(shù)據(jù)處理相關(guān)

的數(shù)據(jù)管理和數(shù)據(jù)保存是必不可少甚至是較為重要

的環(huán)節(jié)。在計(jì)算機(jī)中,大量的數(shù)據(jù)和信息是通過文

件存儲(chǔ)和管理的。文件系統(tǒng)負(fù)責(zé)管理文件和邏輯文

件系統(tǒng),提供管理設(shè)備、屏蔽設(shè)備復(fù)雜性的手段,

為系統(tǒng)內(nèi)核其他部分、用戶命令和系統(tǒng)函數(shù)調(diào)用提

供統(tǒng)一的服務(wù)接口。

本章主要討論Linux系統(tǒng)中文件的概念、目錄結(jié)構(gòu)及

訪問權(quán)限,Linux的邏輯文件系統(tǒng)Ext2,虛擬文件

系統(tǒng)VFS,文件系統(tǒng)管理及緩沖區(qū)管理等內(nèi)容。管

道(FIFO)文件是利用文件系統(tǒng)作為接口實(shí)現(xiàn)進(jìn)

程間的通信,本章不再介紹,具體原理請(qǐng)參見

2.2.6“進(jìn)程通信”部分。

高華十字「社

UNiyERSJTYPRESS

6.1文件系統(tǒng)概述

通常我們把與管理文件有關(guān)的軟件和數(shù)據(jù),統(tǒng)稱為文

件系統(tǒng)。它方便地組織管理計(jì)算機(jī)中的所有文件,

為用戶提供文件的操作手段和存取控制。同時(shí),文

件系統(tǒng)隱藏了系統(tǒng)中最為紛繁復(fù)雜的硬件設(shè)備特

征,為用戶以及操作系統(tǒng)的其他子系統(tǒng)提供一個(gè)統(tǒng)

一、簡(jiǎn)潔的接口,通過文件系統(tǒng),使得用戶方便地

使用計(jì)算機(jī)的存儲(chǔ)、輸入/輸出等設(shè)備。

清華大學(xué)出版社

在學(xué)習(xí)Linux進(jìn)程管理時(shí),我們也許注意到,系統(tǒng)惟

一感知和控制進(jìn)程的關(guān)鍵數(shù)據(jù)一一進(jìn)程控制塊中,

除了CPU和內(nèi)存資源之外,只包含了文件系統(tǒng)信息

和文件信息,而沒有設(shè)備的任何信息,這就是文件

系統(tǒng)所起的作用。Linux系統(tǒng)中把CPU、內(nèi)存之外

所有其他設(shè)備都抽象為文件來處理。進(jìn)程只和文件

系統(tǒng)打交道,具體的細(xì)節(jié),由設(shè)備管理部分具體實(shí)

現(xiàn)并為文件系統(tǒng)提供盡可能簡(jiǎn)潔統(tǒng)一的接口。因

止匕,文件系統(tǒng)還同時(shí)充當(dāng)著設(shè)備管理接口的角色,

用戶進(jìn)程使用和操作具體的設(shè)備,都必須通過文件

系統(tǒng)進(jìn)行。文件系統(tǒng)是操作系統(tǒng)中與管理文件有關(guān)

的所有軟件和數(shù)據(jù)的集合。

害小匕一二學(xué)dp

/R-L人一廠UJ必丁一惻颯3踞加購呢^例■

不同的操作系統(tǒng)可能采用不同的文件系統(tǒng)。支持多種

不同類型的文件系統(tǒng)是Linux操作系統(tǒng)的主要特色

之一。Linux系統(tǒng)自身的文件系稱為ext2,它也是

Linux默認(rèn)的文件系統(tǒng)。我們把ext2以及Linux支持

的文件系統(tǒng)稱為邏輯文件系統(tǒng),通常每一種邏輯

文件系統(tǒng)服務(wù)于一種特定的操作系統(tǒng),具有不同的

組織結(jié)構(gòu)和文件操作函數(shù),相互之間差別很大。

Linux在傳統(tǒng)的邏輯文件系統(tǒng)的基礎(chǔ)上,增加了一

個(gè)稱為虛擬文件系統(tǒng)(VFS)的接口層,如圖6」所

/J\O

高華大學(xué)出版社

——玉―,―工丫PRESS

圖6.1Linux文件系統(tǒng)層次結(jié)構(gòu)示意圖

清華大學(xué)出版社

系統(tǒng)中所有的設(shè)備,包括字符設(shè)備、塊設(shè)備和網(wǎng)絡(luò)設(shè)

備,都按照某種方式由邏輯文件系統(tǒng)統(tǒng)一管理,邏

輯文件系統(tǒng)為它們提供訪問接口。虛擬文件系統(tǒng)在

最上層,管理各種邏輯文件系統(tǒng),屏蔽了它們之間

的差異,為用戶命令、函數(shù)調(diào)用和內(nèi)核其他部分提

供訪問文件和設(shè)備的統(tǒng)一接口,使得不同的邏輯

文件系統(tǒng)按照同樣的模式呈現(xiàn)在使用者面前,對(duì)于

普通用戶來講,覺察不到邏輯文件系統(tǒng)之間的差

異,可以使用同樣的命令來操作不同邏輯文件系統(tǒng)

所管理的文件,可以在它們之間自由地復(fù)制文件。

清華大學(xué)出版社

6.2文件管理

6.2.1文件

文件可以簡(jiǎn)單地理解為一段程序或數(shù)據(jù)的集合。在操

作系統(tǒng)中,文件被定義為一個(gè)命名的相關(guān)字符流的

集合,或者一個(gè)具有符號(hào)名的相關(guān)記錄的集合。符

號(hào)名用來惟一地標(biāo)識(shí)一個(gè)文件,也就是文件名。

Linux系統(tǒng)中,文件名最大長度由NR-NAME-LEN

控制,默認(rèn)值為255個(gè)字符。

文件定義中所指出的不同基本組成單位表示了兩種形

式的文件。相關(guān)字符流組成的文件是一種無結(jié)構(gòu)文

件或流式文件。相關(guān)記錄組成的文件稱為記錄式文

件。記錄式文件通常主要用于信息管理。

在UNIX、Linux等操作系統(tǒng)中,把包括硬件設(shè)備在

內(nèi)的能夠進(jìn)行流式字符操作的內(nèi)容都定義為文件。

Linux系統(tǒng)中文件的類型包括:普通文件,目錄文

件,連接文件,管道(FIFO)文件、設(shè)備文件

(塊設(shè)備、字符設(shè)備)和套接字。

Linux系統(tǒng)把文件按照其性質(zhì)、用途等標(biāo)準(zhǔn)劃分為不

同的類別。操作系統(tǒng)根據(jù)文件的類型處理文件。按

照用途,文件可以分為:系統(tǒng)文件、庫文件和用戶

文件。系統(tǒng)文件直接和操作系統(tǒng)本身有關(guān),包括操

作系統(tǒng)核心和各種系統(tǒng)應(yīng)用程序和數(shù)據(jù);庫文件通

常指系統(tǒng)提供給用戶調(diào)用的各種標(biāo)準(zhǔn)過程、函數(shù)和

應(yīng)用程序;用戶文件是用戶委托計(jì)算機(jī)文件系統(tǒng)管

理的文件。

清華大學(xué)出版社

當(dāng)然,這只是一種相對(duì)的標(biāo)準(zhǔn),對(duì)于Linux系統(tǒng),根

據(jù)自己的實(shí)際需要,具有特殊權(quán)限的用戶(系統(tǒng)管

理員)可以重新修改并編譯升級(jí)整個(gè)內(nèi)核,這個(gè)過

程將會(huì)修改大部分系統(tǒng)文件,同時(shí)庫文件也可以按

照自己的需要添加和修改。

根據(jù)文件中數(shù)據(jù)的表示形式,可以把文件劃分為

ASCII碼文件和二進(jìn)制文件。

按照文件操作過程中的保護(hù)級(jí)別,文件可以劃分為只

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論