linux編程白皮書 第一章

發表于:2007-05-26來源:作者:點擊數: 標簽:
第一章硬件基礎與軟件基礎 1.1硬件基礎 操作系統必須和作為起基礎的硬件系統緊密地協同工作。操作系統需要只有硬件能提供的特定服務。為了完全理解 linux 操作系統,需要了解她下層的硬件基礎知識。本節將簡短介紹該硬件:現在PC。 第一章硬件基礎與軟件基礎

第一章  硬件基礎與軟件基礎

1.1  硬件基礎

       操作系統必須和作為起基礎的硬件系統緊密地協同工作。操作系統需要只有硬件能提供的特定服務。為了完全理解linux 操作系統,需要了解她下層的硬件基礎知識。本節將簡短介紹該硬件:現在PC。

第一章  硬件基礎與軟件基礎

1.1  硬件基礎

       操作系統必須和作為起基礎的硬件系統緊密地協同工作。操作系統需要只有硬件能提供的特定服務。為了完全理解linux 操作系統,需要了解她下層的硬件基礎知識。本節將簡短介紹該硬件:現在PC。

        當以Altair8080機器的圖解作為封面的1975年1月份的《大眾電子》雜志印刷時,一場“革命”開始了。家庭電子愛好者僅花397美元就可以組裝出一臺以早些時候的電影“星際履行”中的一個目的地而命名的Altair8080。它的Intel8080處理器和256字節的存儲器而沒有屏幕和鍵盤用今天的標準看來是多么弱小。它的發明者Ed.Roberts創造了“個人計算機”一詞來描述自己的新發明,但今天PC一詞被用來指幾乎任何你不需幫助就可以得到的計算機。從這個定義上說,甚至一些具有強大能力的Alpa AXP系統也是PC。

狂熱的黑客們看到Altair的潛力并開始為它寫軟件和建造硬件。對于這些早期的先行者來說,它代表著自由:不用在巨大的批處理大型機系統上運行和被“精英們”監視的自由。許多被這種新東西—— 一臺可以放在家中廚房里桌子上的計算機迷住的大學輟學者一夜之間而暴富。許多硬件出現了,在某種程度上都不相同,而軟件黑客很樂意為這些新機器寫軟件。然而IBM堅實的建造了現代PC的模型,它們1981年發布IBM  PC并于1982年早期開始銷售給客戶。它有Intel8088處理器,64KB內存(可擴充至256KB)、兩個軟盤和一個25巷80字符的彩色徒刑適配器(CGA),這在今天的標準看來仍不很強大但卻銷售的很好。接著是1983年的IBM   PC-XT,有了“奢侈”的10MB字節硬盤。不久,許多諸如Compaq這樣的公司在一個不斷增長的市場中一起競爭,PC的體系結構成為一個事實標準。這個事實標準有助于許多的硬件公司在一個不斷增長的市場中一起競爭,從而保持價格很低,使消費者受益。這些早期PC的許多系統結構特征一起保持到當今的PC。例如,即使是最強大的基于Intel Pentium Pro的東西時,就選擇了最普遍和合理價格的硬件,Intel80386 PC。

    從PC的外面看來,最明顯的不見是機箱、鍵盤、鼠標和圖形監視器。機箱前面是一些按鈕、一個數字的小顯示器個一個軟驅?,F在的大多數系統有CD-ROM,并且如果你覺得有必要保護數據的話還可以有一臺磁帶驅動器做備份用。這些設備被統稱做外設。

    盡管CPU在總體上控制系統,它并非唯一的智能設備。所有的外設控制器,比如IDE控制器,都具有一定的智能。在PC內部,有一塊主板,上面有CPU或稱微處理器、內存條插槽和一些ISA或PCI外設控制器的插槽。有些控制器,如IDE磁盤控制器可以直接建在系統主板上。

1.1.1 CPU
    CPU或叫微處理器,是計算機系統的心臟。微處理器通過從內存中讀取指令并執行進行
計算、邏輯操作以及數據流管理。在早期計算中微處理器的功能部件是分離的 (物理上很大的)
單元。就是那時創造了中央處理單元 (Central Processing Units)的術語?,F代的微處理器把這
些部件組合在蝕刻于很小的硅片上的集成電路中。 CPU、微處理器(microprocessor)、處理器
(processor)三個詞在本書中通用。
    微處理器操作由0和1組成的二進制數據,這些 0和1對應于電子開關的打開或關閉。如十
進制的42表示“4個10和2個1”,一個二進制數是表示 2的冪的一串二進制數。在這里冪是指
一個數乘以自身的次數。 10的1次冪(101)是10,10的2次冪(102)是10×10,10的三次冪(103)是
10×10×10,依此類推。二進制 0001是十進制 1,二進制 0010是十進制 2,二進制 0011是3,
二進制0100是4,等等。這樣,十進制 42的二進制就是101010即(2+8+32或21+23+25)。在計算
機程序中通常不用二進制表示數據,而用另一種基數,十六進制表示。在這種表示下,每個
數位表示一個16的冪。因為十進制數只有 0到9,數10到15用字母A、B、C、D、E、F表示成
單個數位。例如,十六進制 E是十進制14,十六進制2A是十進制42(兩個16加上10)。用C語言
的表示方法 (正如在本書通篇中所做的 ),十六進制要加前綴“ 0x”;十六進制數 2A被寫作
0x2A。
    微處理器可以進行算術運算,如加、減、乘、除和邏輯運算,如“ X是否比Y大?”。
    處理器的執行被外部時鐘所驅動。這個時鐘,即系統時鐘,產生規則的時鐘脈沖到處理
器,而處理器在每一個時鐘脈沖做一些工作。比如,處理器可以在每個時鐘脈沖執行一條指
令。處理器的速度用系統時鐘跳動的速度來描述。一個 100MHz的處理器每秒鐘將收到 100
000 000個時鐘脈沖。用時鐘脈沖來描述 CPU的能力有誤導性,因為不同的處理器在一個時鐘
脈沖期間完成不同量的工作。但是,在其它所有東西都一樣時,速度更快的時鐘意味著計算
能力更強的處理器。處理器執行的指令都很簡單,比如像“將存儲器 X位置的內容讀到Y寄存
器”。寄存器是微處理器的內部存儲區,用來存儲數據和在其上面執行操作。執行的操作可能
會引起停下它正在做的東西并跳轉到存儲器中其它地方的某條指令。這些微小的組成單元賦
予當今的微處理器幾乎無窮的能力,它們能夠每秒鐘執行數百萬條甚至上十億條指令。
    指令在執行前必須先從存儲器中取出。指令自身可以引用存儲器中的數據,該數據必須
被從存儲器中取出并在適當的時候存回去。
    微處理器內部的寄存器的大小、數量和類型完全取決于微處理器的類型。 Intel 80486處理
器和Alpha AXP處理器就有不同的寄存器集;首先, Intel的是32位寬,而Alpha AXP的是64位
寬。一般說來,任何微處理器都會有一定數量的通用寄存器和少量的專用寄存器。大多數處理器有以下的專用寄存器:
    程序計數器(Program Counter,PC):該寄存器包含將被執行的下條指令的地址。每當一條
指令取出后PC的值將被自動增量。
    棧指針(Stack Pointer,SP):處理器必須能夠存取大量的外部隨機讀 /寫存儲器(RAM),以
存儲臨時數據。棧就是一種在外部存儲器中方便地存儲和恢復數據的方式。通常處理器有專
門指令讓你把值壓到棧上,并在晚些時候將它們彈出。棧工作于后進先出 (Last In First Out,
LIFO)的基礎上。也就是說,如果你壓兩個值,即 X和Y到棧上,然后彈出一個值,將會得到
后壓進的Y的值。
    有些處理器的棧朝存儲器頂端向上增長,而另一些朝存儲器底端即基端向下增長。有的
處理器支持這兩種,比如ARM。
    處理器狀態(Processor Status,PS):指令可能產生結果;比如“寄存器 X的值是否大于寄存
器Y的值”將產生真或假作為結果。 PS寄存器保存這種和其它的當前處理器的狀態信息。例
如,大部分處理器至少有兩種操作模式,核心 (或管理)模式和用戶模式。 PS寄存器中保留有
識別當前操作模式的信息。

1.1.2 存儲器
    所有系統都有一個存儲器層次結構,在這個層次結構的不同層上有不同速度和大小的存
儲器。速度最快的存儲器就是我們所知道的高速緩存。就像聽起來的那樣,它是用來暫時保
留或緩存主存儲器內容的存儲器。這種存儲器速度很快但也很貴,所以大多數系統有少量的
片上(on-chip)緩存和稍多的系統級(板上)緩存。有的處理器用一個緩存保存指令和數據,但其
它的處理器有兩個緩存,一個指令緩存和一個數據緩存。 Alpha AXP處理器就有兩個內部緩
存:一個是數據的(D-Cache),一個是指令的(I-Cache)。外部緩存(B-Cache)將兩者合在了一起。
最后是主存儲器,相對于外部緩存來說是很慢的。相對于 CPU片上緩存,主存慢得就像爬一
樣。
    高速緩存和主存儲器必須保持同步 (一致)。也就是說,如果主存儲器的一個字保存在高速
緩存的一個或多個位置,則系統必須要保證高速緩存和主存儲器的內容是相同的。高速緩存
一致性的工作一部分由硬件完成,一部分由操作系統完成,許多主要的系統任務也是這樣,
要求硬件和軟件緊密配合來達到目標。

1.1.3 總線
    系統主板上的單個部件通過被稱為總線 (bus)的許多系統連接通路相連。系統總線在邏輯
功能上分為三類:地址總線、數據總線和控制總線。地址總線用來為數據傳送指明存儲器位
置(地址)。數據總線保持傳送的數據。數據總線是雙向的,它允許數據讀入到 CPU和從CPU寫
出??刂瓶偩€包括各種各樣的線路用來在系統中傳送定時和控制信號。存在許多種總線,像
ISA和PCI就是連接外設到系統的常用總線方式。

1.1.4 控制器和外設
    外設是實在的設備,像圖形卡或磁盤。它們受系統主板上的控制器芯片或插到主板上的
控制器卡的控制。IDE磁盤用IDE控制器芯片控制、SCSI磁盤用SCSI磁盤控制器芯片控制等等
這些控制器通過一組總線連接到 CPU及相互連接。大部分現在制造的系統使用 PCI和ISA總線連接主要的系統部件??刂破魇窍?CPU一樣的處理器,它們可以被看作 CPU的智能化助手。
CPU對系統整體進行控制。
    所有的控制器都不相同,但通常都有一些寄存器控制它們。在 CPU上運行的軟件必須能
夠讀寫這些控制寄存器。一個寄存器可能包含描述出錯狀態的信息。另一個可能被用作控制
目的,來改變控制器的模式??偩€上的每個控制器可以被 CPU單獨尋址,這樣軟件的設備驅
動程序能夠寫到它的寄存器中以控制它。 IDE ribbon就是個很好的例子,它賦予你單獨訪問總
線上每個驅動器的能力。另一個不錯的例子是 PCI總線,允許每個設備(如圖形卡)獨立地被訪
問。

1.1.5 地址空間
    系統中連接CPU和主存的總線與連接 CPU和系統的硬件外設的總線是分開的。硬件外設
所占用的存儲器空間被總稱為I/O空間。I/O空間本身可以再細分下去,但我們現在先不用考慮
那么多。CPU能夠存取系統空間存儲器和 I/O空間存儲器,而控制器自身只有在 CPU的幫助下
間接地訪問系統存儲器。從設備的角度,比如軟盤控制器,它只能看到自己的控制寄存器所
在的空間(ISA),而不能看到系統存儲器。典型情況是, CPU有分開的指令訪問存儲器和I/O空
間。例如,可能有一條指令要“從 I/O地址0x3f0讀一個字節到寄存器 X中?!盋PU就是這樣控
制系統的硬件外設—通過讀寫它們在I/O空間中的寄存器。在PC體系結構發展的這么多年里,
一般的外設(IDE控制器、串口、硬盤控制器等 )的寄存器在什么地方(地址)已經成為習慣。I/O
空間地址0x3f0正好是一個串口(COM1)的控制寄存器地址。
    有時控制器需要直接讀或寫系統存儲器中的大量數據,例如用戶數據被寫到硬盤時。在
這種情況下,直接存儲器訪問 (Direct Memory Aclearcase/" target="_blank" >ccess,DMA)控制器將被使用以允許硬件外設
直接訪問內存,但這種訪問是處在 CPU的嚴格控制和管理之下的。

1.1.6 時鐘
    所有的操作系統都需要知道時間,所以當代 PC都包含一個特殊的外設叫實時時鐘 (Real Time Clock,RTC)。它提供兩樣東西:一個可*的日期時間和一個準確的定時間隔。 RTC有自己的電池,所以當PC斷電的時候它繼續運行,這就是為什么你的 PC總是知道正確的日期和時間的原因。間隔定時器允許操作系統準確地調度必需的工作。

1.2 軟件基礎
    程序是完成特定任務的計算機指令集合。程序可以用匯編,一種很低級的計算機語言寫成,也可以用高級的、與機器無關的語言比如 C語言寫成。操作系統是一個特殊的程序,使用戶能夠運行像表格或字處理這樣的應用程序。本節介紹基本編程原理并給出操作系統的功能和目標的一個概述。

1.2.1 計算機語言
    1. 匯編語言
    CPU從主存取出并執行的指令對于人是根本不能理解的。它們是機器代碼,精確地告訴
機器干什么。十六進制數0x89E5是一條Intel 80486指令,將ESP寄存器的內容拷貝到EBP寄存
器中。為最早的計算機發明的軟件工具之一是匯編器,一個輸入人可讀的源文件并把它匯編
成機器代碼的程序。匯編語言顯式地處理寄存器和對數據的操作,并且它們是針對特定微處
理器的。Intel X86微處理器的匯編語言與Alpha AXP微處理器的匯編語言有很大差別。下面的
Alpha AXP匯編代碼展示了一個程序可能執行的操作:
  ldr r16, (r15)                             : 第一行
  ldr r17, 4(r15)                             : 第二行
  beq r16,r17,100                             : 第三行
  str r17, (r15)                             : 第四行
  100:                              : 第五行
     第一個語句(第一行)從寄存器15保存的地址裝載寄存器16。下一條指令從存儲器下一個位置裝載寄存器17。第三行比較寄存器16和寄存器17的內容,如果它們相等,就轉移到標號100。如果寄存器中的值不等則程序繼續執行第 4行,將寄存器17的內容存到存儲器。如果寄存器確實給相同內容則不必存儲任何數據。匯編程序冗長、難寫而又易于出錯。 Linux內核只有很少一部分是為了高效而用匯編語言寫的,那些部分是針對特定微處理器的。

     2. C語言和編譯器
     用匯編語言寫大型程序是困難而費時的工作。它很容易產生錯誤,并且產生的程序不可
移植,被限定在一個系列的微處理器上。使用像 C [7, C Programing Language]這樣的機器無
關語言要好得多。C使得你可以用邏輯算法和操作的數據來描述程序。稱為編譯器的特殊程序
讀進C程序并把它翻譯成匯編語言,再從它產生針對特定機器的代碼。好的編譯器能夠產生接
近優秀匯編程序員所寫的那樣高效的匯編指令。大部分 Linux內核是用C語言寫的。下面的 C
程序片斷:
     if (x !- y)

            x - y;

    執行和前面例子的匯編代碼一模一樣的操作。如果變量 x的內容和變量 y的內容不相同,
那么y的內容將被拷貝到x。C語言被組織成例程,每個例程執行一件任務。例程可以返回 C語
言所支持的任何值或數據類型。像 Linux內核這樣的大型程序包括許多獨立的 C源程序模塊,
每個模塊有自己的例程和結構。這些 C源程序代碼模塊在一起組合成像文件系統處理這樣的邏
輯功能。
     C支持許多類型的變量,一個變量就是一個可以用符號名字引用的存儲器位置。在上面的
片斷中x和y就引用存儲器的位置。程序員不管變量被放在存儲器中什么地方,那是連接器
(linker)所關心的。有些變量包括不同類型的數據、整數、浮點數,還有一些是指針。
     指針是包含其它變量的地址即它在存儲器中位置的變量??紤]一個變量 x,可能位于內存
中地址0x80010000處。你可以有一個指針 px指向x。px可能位于內存中地址 0x80010030處。
px的值是0x80010000:x的地址。
     C允許你將相關的變量捆在一起成為數據結構。例如:
           struct {
                    int i ;
                    char b;
           } my_struct;


    是一個叫做my_struct的數據結構,它包含兩個元素,一個叫 i的整數(32位數據存儲)和一
個叫b的字符(8位數據存儲)。

    3. 連接器
    連接器是一個程序,它將幾個目標模塊和庫連接在一起形成一個單一的、一致的程序。
目標模塊是編譯器或匯編器輸出的機器代碼,包含機器可執行的代碼和數據及使連接器把模塊們組裝在一起形成一個程序的信息。比如一個模塊可能包含一個程序的所有數據庫功能而另一個則包含其命令行參數處理功能。如果在一個模塊中引用的例程和數據結構確實存在于另一模塊中的話,連接器將安排好目標模塊間的引用。 Linux內核就是由它的許多組成目標模塊連接在一起形成的單一大型程序。

1.2.2 什么是操作系統
    一臺計算機如果沒有軟件只不過是一堆散發熱量的電子器件。如果硬件是計算機的心臟
的話,軟件就是它的靈魂。操作系統是一些允許用戶運行應用程序的系統程序的集合。操作
系統抽象了系統的真實的硬件,提供給用戶及其應用程序一個虛擬機器。在很大程度上,軟
件體現系統的特征。大部分 PC能夠運行一個或多個操作系統,每個都有不同的外觀和感覺。
Linux由一些功能獨立的部分組成,它們一起構成了操作系統。 Linux一個很重要的部分就是
內核本身,但是,它離開shell和庫也是沒有用的。
    為了開始理解什么是操作系統,考慮一下你敲入一個簡單的命令后發生了什么:
$ ls
Mail        c        images       perl
docs        tcl  
$

    $符號是注冊Shell(如果是bash的話)輸出的一個提示符,它意味著正在等待用戶輸入一些命令。鍵入ls,鍵盤驅動程序會識別出這些字符被敲入了。鍵盤驅動程序將它傳給 Shell,由它尋找一個具有相同名字的可執行映像來處理該命令。它在 /bin/ls找到映像,然后調用內核(kernel)服務,把ls可執行映像裝入虛擬內存并開始執行。 ls映像調用內核的文件子系統來查找有什么文件存在。文件系統可能使用緩存的文件系統信息或利用磁盤設備驅動程序從磁盤上讀取該信息。它甚至可能引起網絡驅動程序同一個遠程機器交換信息以獲得本系統訪問的遠程文件的細節(文件系統可以通過網絡文件系統即 NFS遠程安裝)。不管該信息通過什么方式得到,ls將輸出該信息,由圖形驅動程序在屏幕上顯示出來。
    上面的這些內容看起來很復雜,但它表明即使是最簡單的命令也能說明操作系統事實上是合作的功能的集合,它給予用戶一個系統的一致的視圖。

    1. 存儲器管理
    在資源有限的情況下,比如存儲器,操作系統需要做的很多事情就是冗余。操作系統的許多基本技巧之一就是使少量的物理存儲器用起來就像許多存儲器一樣。這些表面上的大量存儲器就是虛擬存儲器。其思想是系統上運行的軟件被“欺騙”,認為自己在大量存儲器中運行。系統把存儲器分成容易處理的頁面,在運行時,把這些頁面交換到內存上。因為有另一個技巧—多進程的存在,所以軟件卻感覺不到這一點。

2. 進程
一個進程可以被想象成一個運行的程序,每個進程都是一個運行特定程序的獨立實體。

如果你查看一下Linux系統上的進程,就會發現有許多進程。例如,在機器上敲入 ps將顯示下
列進程:

$ ps

  PID TTY STAT     TIME COMMAND

  158 pRe 1        0:00 -bash

  174 pRe 1        0:00 sh /usr/X11R6/lib/bin/stattx

  ......

  3270 pp6 03      0:00 ps

$


    如果機器中有許多CPU,那么每個進程就能 (至少理論上能) 在不同的CPU上運行。不幸的是只有一個CPU,所以操作系統又得使用技巧,把每個進程依次運行一段很短的時間。這一段時間就是我們所知的時間片 (time-slice)。這個技巧叫作多進程或調度,它騙使每個進程都以為自己是唯一的進程。進程相互之間受到保護,所以當一個進程崩潰或出錯時不會影響其它的進程。操作系統通過給每個進程一個獨立的、只有它自己能訪問的地址空間來達到這個目的。

   3. 設備驅動程序
    設備驅動程序構成Linux內核的主要部分。像操作系統的其它部分一樣,它們在高特權的環境下操作,如果它們出錯可能引起災難。設備驅動程序管理操作系統及其控制的硬件設備之間的交互。例如,文件系統在寫文件塊到 1DE磁盤上時使用一個通用塊設備接口。驅動程序進行細節操作和設備相關的操作。設備驅動程序針對它們驅動的特定的控制器芯片,所以如果你的系統中有一塊NCR810 SCSI控制器的話,就需要有NCR810 SCSI驅動程序。

    4. 文件系統
    Linux像UNIX一樣,系統使用邏輯上獨立的文件系統而不是實際的設備標識符 (比如驅動器名或驅動器號 )來進行文件訪問, Linux的每個新文件系統都被安裝到根文件系統的某個目錄上(比如/mnt/cdrom),這樣這個新文件系統就被合并到單一的根文件系統樹中。 Linux最重要的特征之一就是支持多種不同的文件系統。 Linux上最流行的文件系統是 EXT2文件系統,它也是大部分發布的Linux都支持的文件系統。
    文件系統提供給用戶一個系統硬盤上的文件和目錄的一個合理的視圖,而不管文件系統的類型和底層物理設備的特征如何。 Linux透明地支持許多不同的文件系統 (如MS-DOS和EXT2),并把所有安裝的文件和文件系統表示成一個集成的虛擬文件系統。這樣,一般說來,用戶和進程不需要知道一個文件是哪種文件系統的一部分,而只管使用就是了。
    塊設備驅動程序把不同類型的物理塊設備 (如IDE和SCSI)之間的差別隱藏起來,并且,對每個文件系統來說,物理設備只是數據塊的線性集合。不同的設備會有不同的塊大小,例如軟盤通常為512字節,而IDE設備通常為1024字節;同樣,這對系統的使用者是隱藏的。一個EXT2文件系統不管保存在什么設備上看起來都一樣。

1.2.3 內核數據結構
    操作系統必須保持許多關于系統當前狀態的信息。隨著系統中事件的發生,這些數據結
構也要被改變以反映當前現實。例如,當一個用戶登錄系統時,一個進程可能被創建。內核
必須創建一個表示這個進程的數據結構并把它鏈接到表示系統中其它所有進程的數據結構上。
    通常這些數據結構存在于物理內存中,并且只能被內核及其子系統訪問。數據結構包含
數據和指針,其它數據結構或例程的地址。
    放在一起,Linux內核使用的數據結構看起來會很迷惑。每個數據結構有自己的用途。盡
管有些是被幾個內核子系統使用,但它們比乍一看起來要簡單得多。
    理解Linux內核關鍵是理解它的數據結構及 Linux內核用它們所完成的功能。本書把對
Linux內核的描述建立在其數據結構的基礎上。本書通過算法、完成功能的方法以及對數據結
構的使用等來討論每個內核子系統。

    1. 鏈表
    Linux使用一些軟件工程技巧來把數據結構鏈接在一起。在許多情況下它使用鏈接的
(linked)或鏈狀的(chained)數據結構。若每個數據結構描述某個事物的單個實例或出現,內核
必須能夠找到所有的實例。在鏈表中一個根指針包含表中第一個數據即元素的地址,而每個
數據結構包含一個指針指向表中下一個元素。最后一個元素的下一個指針為空,這意味著它
是表中的最后一個元素。雙向鏈表包含一個指針指向表中下一個元素,同時包含一個指針指
向表中前一個元素。使用雙向鏈表使得在表的中間添加或刪除元素變得容易,盡管需要更多
訪存操作。這是一個典型的操作系統折衷:以內存訪問換取 CPU周期。

    2. 散列表
    鏈表是一種把數據結構鏈在一起的簡便方法,但查找鏈表的效率會很低。如果你正在搜
索一個特定元素,可能看完整個表才找到所需要的。 Linux使用另一種技巧—散列(hashing)
來解除這種限制。一個散列表是一個指針的數組或向量。數組或向量就是在內存中一個換一
個的事物的簡單集合。一個書架 (上的書)可以說是一個書的數組。數組通過索引來訪問,索引
就是數組的偏移。進一步拿書架作類比,你可以通過它在書架上的位置來描述每本書,比如
你可能要第5本書。
    散列表是數據結構指針的數組,而它的索引是通過這些數據結構中的信息導出的。如果
你用一個數據結構描述一個村子的人口,那么就可以人的年齡作為索引。為了找到一個特定
的人的數據就可以用他的年齡作為人口散列表的索引,然后沿著指針找到包含該人的細節的
數據結構。不幸的是一個村的許多人很可能具有相同的年齡,所以散列表中的指針成為指向
數據結構鏈或表的指針,每個數據結構描述同年齡的一個人。搜索這些短的鏈仍比搜索全部
數據結構快得多。
    因為散列表加速了對經常使用的數據結構的訪問,Linux經常使用散列表來實現高速緩存,
高速緩存是需要快速訪問的信息,并且通常是可以得到的完整信息集合的一個子集。數據結
構被放進高速緩存并保留在那里,因為內核要經常訪問它們。高速緩存有一個缺點就是它們
一次以文件系統注冊為例,每個文件系統在注冊時傳給內核的數據結構包含文件系統專用例
程的地址,當文件系統被安裝時,這些例程將被調用。

(持續更新中....)



原文轉自:http://www.anti-gravitydesign.com

国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97