?? linuxkernel.htm
字號:
<P ALIGN="JUSTIFY">PID TTY STAT TIME COMMAND</P>
<P ALIGN="JUSTIFY">158 pRe 1 0:00 -bash</P>
<P ALIGN="JUSTIFY">174 pRe 1 0:00 sh /usr/X11R6/bin/startx</P>
<P ALIGN="JUSTIFY">175 pRe 1 0:00 xinit /usr/X11R6/lib/X11/xinit/xinitrc --</P>
<P ALIGN="JUSTIFY">178 pRe 1 N 0:00 bowman</P>
<P ALIGN="JUSTIFY">182 pRe 1 N 0:01 rxvt -geometry 120x35 -fg white -bg black</P>
<P ALIGN="JUSTIFY">184 pRe 1 < 0:00 xclock -bg grey -geometry -1500-1500 -padding 0</P>
<P ALIGN="JUSTIFY">185 pRe 1 < 0:00 xload -bg grey -geometry -0-0 -label xload</P>
<P ALIGN="JUSTIFY">187 pp6 1 9:26 /bin/bash</P>
<P ALIGN="JUSTIFY">202 pRe 1 N 0:00 rxvt -geometry 120x35 -fg white -bg black</P>
<P ALIGN="JUSTIFY">203 ppc 2 0:00 /bin/bash</P>
<P ALIGN="JUSTIFY">1796 pRe 1 N 0:00 rxvt -geometry 120x35 -fg white -bg black</P>
<P ALIGN="JUSTIFY">1797 v06 1 0:00 /bin/bash</P>
<P ALIGN="JUSTIFY">3056 pp6 3 < 0:02 emacs intro/introduction.tex</P>
<P ALIGN="JUSTIFY">3270 pp6 3 0:00 ps</P>
<P ALIGN="JUSTIFY">$</P>
</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY"> </P>
<P ALIGN="JUSTIFY">如果我的系統擁有多個</FONT><FONT SIZE=3>CPU</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>那么每個進程可能(至少在理論上如此)都在不同的</FONT><FONT SIZE=3>CPU</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>上運行。不幸的是,只有一個,所以操作系統又使用技巧,在短時間內依次運行每一個進程。這個時間段叫做時間片。這種技巧叫做多進程或調度,它欺騙了每一個進程,好像它們是唯一的進程。進程相互之間受到保護,所以如果一個進程崩潰或不能工作,不會影響其他進程。操作系統通過給每一個進程一個獨立的地址空間來實現保護,進程只能訪問它自己的地址空間。</P>
<P ALIGN="JUSTIFY"> </P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">2.2.3 Device Drivers</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>(設備驅動程序)</P>
<P ALIGN="JUSTIFY"> </P>
<P ALIGN="JUSTIFY">設備驅動程序組成了</FONT><FONT SIZE=3>Linux</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>核心的主要部分。象操作系統的其他部分一樣,它們在一個高優先級的環境下工作,如果發生錯誤,可能會引發嚴重問題。設備驅動程序控制了操作系統和它控制的硬件設備之間的交互。比如:文件系統向</FONT><FONT SIZE=3>IDE</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>磁盤寫數據塊是使用通用塊設備接口。驅動程序控制細節,并處理和設備相關的部分。設備驅動程序和它驅動的具體的控制器芯片相關,所以,如果你的系統有一個</FONT><FONT SIZE=3>NCR810</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>的</FONT><FONT SIZE=3>SCSI</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>控制器,那么你需要</FONT><FONT SIZE=3>NCR810</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>的驅動程序。</P>
<P ALIGN="JUSTIFY"> </P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">2.2.4 The Filesystems</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>(文件系統)</P>
<P ALIGN="JUSTIFY"> </P>
<P ALIGN="JUSTIFY">象</FONT><FONT SIZE=3>Unix</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>一樣,在</FONT><FONT SIZE=3>Linux</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>里,系統對獨立的文件系統不是用設備標示符來存?。ū热珧寗悠骶幪柣蝌寗悠髅Q),而是連接成為一個樹型結構。</FONT><FONT SIZE=3>Linux</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>在安裝新的文件系統時,把它安裝到指定的安裝目錄,比如</FONT><FONT SIZE=3>/mnt/cdrom</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>,從而合并到這個單一的文件系統樹上。</FONT><FONT SIZE=3>Linux</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>的一個重要特征是它支持多種不同的文件系統。這使它非常靈活而且可以和其他操作系統良好共存。</FONT><FONT SIZE=3>Linux</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>最常用的文件系統是</FONT><FONT SIZE=3>EXT2</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>,大多數</FONT><FONT SIZE=3>Linux</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>發布版都支持。</P>
<P ALIGN="JUSTIFY"> </P>
<P ALIGN="JUSTIFY">文件系統將存放在系統硬盤上的文件和目錄用可以理解的統一的形式提供給用戶,讓用戶不必考慮文件系統的類型或底層物理設備的特性。</FONT><FONT SIZE=3>Linux</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>透明的支持多種文件系統(如</FONT><FONT SIZE=3>MS-DOS</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>和</FONT><FONT SIZE=3>EXT2</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>),將所有安裝的文件和文件系統集合成為一個虛擬的文件系統。所以,用戶和進程通常不需要確切知道所使用的文件所在的文件系統的類型,用就是了。</P>
<P ALIGN="JUSTIFY"> </P>
<P ALIGN="JUSTIFY">塊設備驅動程序掩蓋了物理塊設備類型的區別(如</FONT><FONT SIZE=3>IDE</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>和</FONT><FONT SIZE=3>SCSI</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>)。對于文件系統來講,物理設備就是線性的數據塊的集合。不同設備的塊大小可能不同,如軟驅一般是</FONT><FONT SIZE=3>512</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>字節,而</FONT><FONT SIZE=3>IDE</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>設備通常是</FONT><FONT SIZE=3>1024</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>字節,同樣,對于系統的用戶,這些區別又被掩蓋。</FONT><FONT SIZE=3>EXT2</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>文件系統不管它用什么設備,看起來都是一樣的。</P>
<P ALIGN="JUSTIFY"> </P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">2.3 Kernet Data Structures</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>(核心數據結構)</P>
<P ALIGN="JUSTIFY"> </P>
<P ALIGN="JUSTIFY">操作系統必須紀錄關于系統當前狀態的許多信息。如果系統中發生了事情,這些數據結構就必須相應改變以反映當前的實際情況。例如:用戶登錄到系統中的時候,需要創建一個新的進程。核心必須相應地創建表示此新進程的數據結構,并和表示系統中其他進程的數據結構聯系在一起。</P>
<P ALIGN="JUSTIFY"> </P>
<P ALIGN="JUSTIFY">這樣的數據結構多數在物理內存中,而且只能由核心和它的子系統訪問。數據結構包括數據和指針(其他數據結構或例程的地址)。乍一看,</FONT><FONT SIZE=3>Linux</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>核心所用的數據結構可能非常混亂。其實,每一個數據結構都有其目的,雖然有些數據結構在多個的子系統中都會用到,但是實際上它們比第一次看到時的感覺要簡單的多。</P>
<P ALIGN="JUSTIFY"> </P>
<P ALIGN="JUSTIFY">理解</FONT><FONT SIZE=3>Linux</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>核心的關鍵在于理解它的數據結構和核心處理這些數據結構所用到的大量的函數。本書以數據結構為基礎描述</FONT><FONT SIZE=3>Linux</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>核心。論及每一個核心子系統的算法,處理的方式和它們對核心數據結構的使用。</P>
<P ALIGN="JUSTIFY"> </P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">2.3.1 Linked Lists</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>(連接表)</P>
<P ALIGN="JUSTIFY"> </P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">Linux</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>使用一種軟件工程技術將它的數據結構連接在一起。多數情況下它使用鏈表數據結構。如果每一個數據結構描述一個物體或者發生的事件的單一的實例,比如一個進程或一個網絡設備,核心必須能夠找出所有的實例。在鏈表中,根指針包括第一個數據結構或單元的地址,列表中的每一個數據結構包含指向列表下一個元素的指針。最后元素的下一個指針可能使</FONT><FONT SIZE=3>0</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>或</FONT><FONT SIZE=3>NULL</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>,表示這是列表的結尾。在雙向鏈表結構中,每一個元素不僅包括列表中下一個元素的指針,還包括列表中前一個元素的指針。使用雙向鏈表可以比較容易的在列表中間增加或刪除元素,但是這需要更多的內存存取。這是典型的操作系統的兩難情況:內存存取數還是</FONT><FONT SIZE=3>CPU</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>的周期數。</P>
<P ALIGN="JUSTIFY"> </P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">2.3.2 Hash Tables</P>
</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY"> </P>
<P ALIGN="JUSTIFY">鏈接表是常用的數據結構,但是游歷鏈接表的效率可能并不高。如果你要尋找指定的元素,</FONT><FONT SIZE=3> </FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>可能必須查找完整個表才能找到。</FONT><FONT SIZE=3>Linux</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>使用另一種技術:</FONT><FONT SIZE=3>Hashing </FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>來解決這種局限。</FONT><FONT SIZE=3>Hash table</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>是指針的數組或者說向量表。數組或向量表是在內存中依次存放的對象。書架可以說是書的數組。數組用索引來訪問,索引是數組中的偏移量。再來看書架的例子,你可以使用在書架上的位置來描述每一本書:比如第</FONT><FONT SIZE=3>5</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>本書。</P>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -