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

Linux 核心--3.軟件基礎(chǔ)( 三 )




2.2.3 設(shè)備驅(qū)動(dòng)
設(shè)備驅(qū)動(dòng)組成了Linux核心的主要部分 。象操作系統(tǒng)的其他部分一樣,它們運(yùn)行在高權(quán)限環(huán)境中且一旦出錯(cuò) 將引起災(zāi)難性后果 。設(shè)備驅(qū)動(dòng)控制操作系統(tǒng)和硬件設(shè)備之間的相互操作 。例如當(dāng)文件系統(tǒng)通過使用通用塊設(shè)備接口來對(duì)IDE磁盤寫入數(shù)據(jù)塊 。設(shè)備驅(qū)動(dòng)負(fù)責(zé)處理所有設(shè)備相關(guān)細(xì)節(jié) 。設(shè)備驅(qū)動(dòng)與特定的控制器芯片有關(guān),如果系統(tǒng)中有一個(gè)NCR810 SCSI控制卡則需要有NCR810 SCSI的驅(qū)動(dòng)程序 。


2.2.4 文件系統(tǒng)
Linux和Unix一樣,系統(tǒng)中的獨(dú)立文件系統(tǒng)不是通過設(shè)備標(biāo)志符來訪問,而是通過表示文件系統(tǒng)的層次樹結(jié)構(gòu)來訪問 。當(dāng)Linux添加一個(gè)新的文件系統(tǒng)到系統(tǒng)中時(shí),會(huì)將它mount到一個(gè)目錄下,比如說/mnt/cdrom 。Linux的一個(gè)重要特征就是支持多種文件系統(tǒng) 。這使得它非常靈活并且可與其他操作系統(tǒng)并存 。Linux中最常用的文件系統(tǒng)是EXT2文件系統(tǒng),它在大多數(shù)Linux分發(fā)版本中都得到了支持 。文件系統(tǒng)提供給用戶一個(gè)關(guān)于系統(tǒng)的硬盤上文件和目錄的總體映象,而不管文件的類型和底層物理設(shè)備的特性 。Linux透明地支持多種文件系統(tǒng)并將當(dāng)前安裝的所有文件和文件系統(tǒng)集成到虛擬文件系統(tǒng)中去 。所以,用戶和進(jìn)程一般都不知道某個(gè)文件位于哪種文件系統(tǒng)中,他們只是使用它 。塊設(shè)備驅(qū)動(dòng)將物理塊設(shè)備類型(例如IDE和SCSI)和文件系統(tǒng)中的差別隱藏起來,物理設(shè)備只是數(shù)據(jù)塊的線性存儲(chǔ)集合 。設(shè)備的不同導(dǎo)致塊大小的不同,從軟盤設(shè)備的512字節(jié)到IDE磁盤的1024字節(jié) 。這些都隱藏了起來,對(duì)系統(tǒng)用戶來說這都是不可見的 。不管設(shè)備類型如何,EXT2文件系統(tǒng)看起來總是一樣 。


2.3 核心數(shù)據(jù)結(jié)構(gòu)
操作系統(tǒng)可能包含許多關(guān)于系統(tǒng)當(dāng)前狀態(tài)的信息 。當(dāng)系統(tǒng)發(fā)生變化時(shí),這些數(shù)據(jù)結(jié)構(gòu)必須做相應(yīng)的改變以反映這些情況 。例如,當(dāng)用戶登錄進(jìn)系統(tǒng)時(shí)將產(chǎn)生一個(gè)新的進(jìn)程 。核心必須創(chuàng)建表示新進(jìn)程的數(shù)據(jù)結(jié)構(gòu),同時(shí) 將它和系統(tǒng)中其他進(jìn)程的數(shù)據(jù)結(jié)構(gòu)連接在一起 。大多數(shù)數(shù)據(jù)結(jié)構(gòu)存在于物理內(nèi)存中并只能由核心或者其子系統(tǒng)來訪問 。數(shù)據(jù)結(jié)構(gòu)包括數(shù)據(jù)和指針;還有其他數(shù)據(jù)結(jié)構(gòu)的地址或者子程序的地址 。它們混在一起讓Linux核心數(shù)據(jù)結(jié)構(gòu)看上去非?;靵y 。盡管可能被幾個(gè)核心子系統(tǒng)同時(shí)用到,每個(gè)數(shù)據(jù)結(jié)構(gòu)都有其專門的用途 。理解Linux核心的關(guān)鍵是理解它的數(shù)據(jù)結(jié)構(gòu)以及Linux核心中操縱這些數(shù)據(jù)結(jié)構(gòu)的各種函數(shù) 。本書把Linux核心的 描敘重點(diǎn)放在數(shù)據(jù)結(jié)構(gòu)上,主要討論每個(gè)核心子系統(tǒng)的算法,完成任務(wù)的途徑以及對(duì)核心數(shù)據(jù)結(jié)構(gòu)的使用 。


2.3.1 連接列表
Linux使用的許多軟件工程的技術(shù)來連接它的數(shù)據(jù)結(jié)構(gòu) 。在許多場(chǎng)合下,它使用linked或者chained數(shù)據(jù)結(jié)構(gòu) 。每個(gè)數(shù)據(jù)結(jié)構(gòu)描敘某一事物,比如某個(gè)進(jìn)程或網(wǎng)絡(luò)設(shè)備,核心必須能夠訪問到所有這些結(jié)構(gòu) 。在鏈表結(jié)構(gòu)中,個(gè)根節(jié)點(diǎn)指針包含第一個(gè)結(jié)構(gòu)的地址,而在每個(gè)結(jié)構(gòu)中又包含表中下一個(gè)結(jié)構(gòu)的指針 。表的最后一項(xiàng)必須是0或者NULL,以表明這是表的尾部 。在雙向鏈表中,每個(gè)結(jié)構(gòu)包含著指向表中前一結(jié)構(gòu)和后一結(jié)構(gòu)的指針 。使用雙向鏈表的好處在于更容易在表的中部添加與刪除節(jié)點(diǎn),但需要更多的內(nèi)存操作 。這是一種典型的操作系統(tǒng)開銷與CPU循環(huán)之間的折中 。

2.3.2 散列表
鏈表用來連接數(shù)據(jù)結(jié)構(gòu)比較方便,但鏈表的操作效率不高 。如果要搜尋某個(gè)特定內(nèi)容,我們可能不得不遍歷整個(gè)鏈表 。Linux使用另外一種技術(shù):散列表來提高效率 。散列表是指針的數(shù)組或向量,指向內(nèi)存中連續(xù)的相鄰數(shù)據(jù)集合 。散列表中每個(gè)指針元素指向一個(gè)獨(dú)立鏈表 。如果你使用數(shù)據(jù)結(jié)構(gòu)來描敘村子里的人,則你可以使用年齡作為索引 。為了找到某個(gè)人的數(shù)據(jù),可以在人口散列表中使用年齡作為索引,找到包含此人特定數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu) 。但是在村子里有很多人的年齡相同,這樣散列表指針變成了一個(gè)指向具有相同年齡的人數(shù)據(jù)鏈表的指針 。搜索這個(gè)小鏈表的速度顯然要比搜索整個(gè)數(shù)據(jù)鏈表快得多 。由于散列表加快了對(duì)數(shù)據(jù)結(jié)構(gòu)的訪問速度,Linux經(jīng)常使用它來實(shí)現(xiàn)Caches 。Caches是保存經(jīng)常訪問的信息的子集 。經(jīng)常被核心使用的數(shù)據(jù)結(jié)構(gòu)將被放入Cache中保存 。Caches的缺點(diǎn)是比使用和維護(hù)單一鏈表和散列表更復(fù)雜 。尋找某個(gè)數(shù)據(jù)結(jié)構(gòu)時(shí),如果在Cache中能夠找到(這種情況稱為cache 命中),這的確很不錯(cuò) 。但是如果沒有找到,則必須找出它,并且添加到Cache中去 。如果Cache空間已經(jīng)用完則Linux必須決定哪一個(gè)結(jié)構(gòu)將從其中拋棄,但是有可能這個(gè)要拋棄的數(shù)據(jù)就是Linux下次要使用的數(shù)據(jù) 。

推薦閱讀