Monday, January 09, 2006

OS_2

第0 章 作業系統導論(二)

0-4 記憶體管理
所 謂記憶體(Memory),即是儲存執行中程式或資料的空間。在多元處理系統之下,同時存在著多個行程,每一行程都有其獨立的記憶體空間,來儲存它的程式 或資料。又這些行程被 CPU 交互輪流執行著,因此,所有行程的程式與資料都必須儲存於記憶體內。但當行程過多而導致記憶體空間不足時,應採用何種機制來讓行程交替存放?又當行程進入 等待或中止時,應如何將它移出記憶體?又當使用者程式空間過大而記憶體空間不足於存放時,應採用何種機制來擴充記憶空間(虛擬)?由以上種種問題,可以看 出記憶體管理是一件非常複雜且困難的工作,如果管理得好,整個系統的執行速度將非常順暢;如管理不好,系統執行效率將非常的低,亦可能導致系統癱瘓。
這裡所說的記憶體可區分為主記憶體與外部記憶體兩類,分別說明如下:
  1. 主記憶體:為主機板上的半導體記憶體,如 SRAM、DRAM、EPROM 等等;CPU 可以直接存取主記憶體上的程式或資料,並以位元組(Byte)為單位。

  2. 外 部記憶體:大多指外接的硬碟機。一般外部記憶體大多存放 CPU 暫不執行的程式或資料,CPU 也無法直接由外部記憶體存取程式。亦是,當主記憶體不足於存放時,會將依些暫不執行的程式存放於外部記憶體,當需要使用到時,再由外部記憶體移入主記憶體 內讓 CPU 執行。然而,如果交替使用主記憶體與外部記憶體,其為記憶體管理最重要的一環。
0-4-1 基本概念
記憶體管理目的有二,一者讓使用者在各自邏輯空間內編寫程式,而不必考慮實際儲存的位址,甚至程式大小也不受實際記憶體容量所限制;另一者,在合理的情況下,儘可能讓多個程式駐進主記憶體內。為了達成上述兩大目的,則必須考慮到下列四個主要問題,以下分別說明之。
  1. 主 記憶體分配:如何劃分主記憶體空間,讓多個行程駐進,此記憶體管理最基本的問題。劃分後的記憶體空間如何分配給行程,一般有靜態分配與動態分配兩種。靜態 分配表示任一作業(Task)分配某一空間後,便不可再要求分配,一次分配完成。動態分配表示分配後,作業如需要其他程式駐進則可要求再分配其它記憶體空 間,如此一來,彈性較大不需一次分配較大的空間。

  2. 位 址映射:即是將一般程式的邏輯位址(Logical Address)對應到記憶體的實體位址(Physical Address)上,稱之為位址映射(Address Mapping)。每次行程駐進記憶體空間將不可能都在同一位址上,另一方面,為了減少程式設計師的困擾,並不要求它指定到某一固定位址,因此需要位址映 射的機制。一般有靜態映射與動態映射兩種機制。靜態映射表示對應之後,便不可以再變更;動態映射則表示對應位址可依需要而變動。

  3. 主 記憶體保護:一般記憶體可區分為系統程式空間與應用程式空間兩大類。系統程式空間大多儲存作業系統的核心程式(Kernel)或常駐系統呼叫,也都位於特 殊位址或 PROM 內。系統程式空間並不允許使用者直接呼叫(或存取),而必須透過特殊機制裁存取,因此,這些空間都被保護著。然而,應用程式空間為儲存使用者程式及資料所 用,大多不需要特殊保護。

  4. 主記憶體擴充:當主記憶體空間不夠時,僅可能將外部記憶體納入共同使用,擴大邏輯位址空間,此為『虛擬記憶體』(Virtual Memory)的基本概念。
0-4-2 記憶體分配的相關技巧
所謂記憶體分配,即是將多個作業(Task,行程的原始程式)分別載入記憶體內,至於採用何種技巧來載入或者載入時間為何,才能提高系統的處理效益。以下由幾個方面來探討。
【分配策略】
常用分配策略如下:
  1. 『最先適合』(First Fit, FF)演算法:選擇第一個滿足請求容量的空閒區。

  2. 『最佳適合』(Best Fit, BF)演算法:從空閒區找出能滿足請求容量的最小空閒區。

  3. 『最壞適合』(Worst Fit, WF)演算法:從空閒區找出能滿足請求容量的最大空閒區。
(image placeholder)
圖 0-# 主記憶體分配概念圖
【位址映射與保護】

(image placeholder)
圖 0-# 位址映射與保護
【覆蓋】(Overlays)
覆 蓋(Overlays)與置換(Swap)是解決大作業(需要大記憶體空間)與小記憶體空間之間的矛盾問題。也就是說,記憶體空間不足儲存大作業的程式與 資料時,則必須利用覆蓋與置換技巧來克服。覆蓋功能是使多個程式片段共用一個記憶體區塊,這些程式片段相互之間是獨立的,可以是同一作業內。也可以是不同 的作業。如果是同一作業內的程式片段,大多利用程式之間的邏輯呼叫結構為基礎,同一呼叫層次的程式片段規劃在同一個覆蓋區,如圖 0-# 所示。
(image placeholder)
圖 0-# 覆蓋技巧
【置換】
置換(Swap)表示主記憶體與外部記憶體(如硬碟機)之間交換程式或資料;程式由主記憶體移至外部記憶體,稱之為『置換出』(Swapping Out);反之,程式由外部記憶體移入主記憶體,則稱之為『置換入』(Swapping In),其運作如圖 0-# 所示。
(image placeholder)
圖 0-# 記憶體置換
一 般規劃硬碟機時,都會預留某些空間作為置換區(Swap Area)使用。預留空間大小,大多決定於主記憶體的空間,以保證最大可以交換的容量;譬如,主記憶體空間為 512 Mbyte,則置換區至少需要預留 512 Mbyte 的空間。至於,程式被 Swapping Out 的原因有:
  1. 行程由等待狀態(Wait State)進入掛起狀態(Suspend State)狀態時。

  2. 主記憶體空間不足,經過某種演算法決定移出某些程式時。
另外,程式被 Swapping In 的原因有:
  1. 行程由掛起狀態進入等待狀態時。

  2. 某些程式被重新呼叫而喚起時。
0-4-3 分區管理技巧
所謂分區管理?即是將記憶體劃分為若干個連續區塊,每一區塊可載入一個執行程式。依照所劃分記憶體空間的方法,有固定分區管理與可變分區管理兩種,以下分別說明之。
【固定分區管理】
固 定分區管理又稱為『靜態分區管理』,其運作方式為:首先系統將主記憶體劃分為若干個固定區塊,為滿足不同的需求,各個區塊空間可以不相等。每一個分區大小 已被固定,可以容納的程式大小也會受到限制。也就是說,較小的程式可以填入較大的分區;反之,較大的程式就無法填入較小的分區內;因此,將程式填入分區內 的分配策略將會影響記憶體的使用度。
(image placeholder)
圖 0-# 固定分區管理範例
  1. 採用最先適合(FF)演算法:當作業 C 進入時,被分配到分區 4(FF 策略),作業 D 在進入時,被分配到分區 5,接著作業 E 進入時,則無法被分配到。
使用率 = (作業 C + 作業 D) /(分區 2 + 分區 4 + 分區 5)
= (20 + 40) / (16 + 64 + 128) = 28.8%
  1. 採用最佳適合(BF)演算法:如同 FF 演算法。

  2. 採用最壞適合(WF)演算法:當作業 C 進入時,被分配到分區 5;作業 D 被分配到分區 4,作業 E 無法被分配到。
【可變分區管理】
可變分區管理又稱為『動態分區管理』,其運作原理是:系統並不事先將記憶體劃分固定區塊,而是當欲載入作業時,再依照作業的大小劃分一個區塊讓他載入。因此,區塊大小剛好符合作業大小,並且分區個數也是可變的。如此說來,主記憶體的使用率可能會高一點,範例如下:
(image placeholder)
圖 0-# 可變分區管理範例
分配策略如下:
  1. FF

  2. BF

  3. WF

0-4-4 分頁管理
分 區管理最主要的缺點是,所分配的記憶體空間必須是連續性的,如果連續空間不足於存放時,便不可以分配。如此一來,雖然系統有足夠的空間,但分散許多位址而 不連續,也無法分配,如此一來,便減低了記憶體的使用率,相對應也降低了系統效益。分頁管理就是被提出來解決這兩大問題,同樣的,也可區分為靜態分頁與動 態分頁;其中動態分頁又稱為虛擬記憶體管理,保留到下一節介紹,這裡僅介紹靜態分頁管理。
【實現原理】
分頁管理即是將作業(或程式)以某一固定大小,劃分為若干區塊,稱之為『頁』(Page),將其編號為 0, 1, 2, …, n-1,並儲存於外部記憶體(如硬碟)。也將主記憶體空間,以同樣的大小劃分為若干區塊,稱之為『區塊』(Block)。
(image placeholder)
圖 0-# 分頁管理之概念
【位址映射與保護】

(image placeholder)
圖 0-# 分業管理的位址映射
【啐片問題】
  1. 外部啐片:因頁與區塊(Block)大小相等,不會發生外部啐片的問題。

  2. 內部啐片:如果page太大,且程式太小,也分配一個page,造成內部記憶體的浪費。如果page太大,且程式太小,內部碎片較少,但增加分配的機會,造成不必要的負荷。
0-4-5 分段管理
分 頁的大小是由系統決定,一個分頁通常不是一個完整的程式或資料邏輯片段,一個邏輯片段也可能被分成若干分頁,不同的邏輯段也可能在同一分頁內。但一個程式 的位址空間大多有一定性的邏輯結構關係,通常是由若干邏輯程式模組和資料段所組成(如程序呼叫),我們也希望同一邏輯片段的程式能夠再同一分頁上,如此可 以減低系統管理的複雜性。分段(Segmentation)管理則是分段大小是當程式要求分配時,再依程式之邏輯關係分成若干大小不等片段。
【實現原理】
1. 分段編號並不一定連續。
(image placeholder)

【位址映射與保護】

(image placeholder)

0-4-6 段頁式管理(Segmentation with Paging)


(image placeholder)
圖 0-# 段頁式管理之位址映射
0-5 虛擬記憶體管理
0-5-1 基本概念
所 謂『虛擬記憶體』(Virtual Memory),即是將有限的記憶體容量,而無限制地擴大其空間,讓使用者載入程式時,不需考慮記憶體空間的問題;為的達成此目的,必須利用硬碟空間充當 主記憶體空間,此技術則稱為虛擬記憶體。一般程式設計師編寫程式時,所考慮程式(包含資料)大小大多依照 CPU 所能指定的空間而定。一般 CPU 所能指定的記憶體空間稱之為『定址空間』(Addressing Space),並由位址匯流排(Address Bus)的位元數而定;譬如,位址匯流排有 30 個位元輸出,則表示定址空間為 230 位元組(Byte),亦是 1GByte 的位址空間。基本上,該 CPU 所執行的程式都可以達到 1GByte 空間的程式(包含資料),但一般實際安裝的主記憶體並沒有那麼大的空間,再說主記憶體也不可能無限的擴充,如此一來,至好仰賴虛擬記憶體的技術來擴充位址 空間。
其實,虛擬記憶體並沒有想像那麼複雜,我們來考慮兩個 基本上的問題。一者,無論程式空間有多大,CPU 每次所能執行(或存取)至多也只有 8 個位元組,如 32 位元 CPU 每次最高存取 4 個位元組,64 位元 CPU 為 8 個位元組。此問題只要利用『位址映射』技術,將目前 CPU 所要存取的位址映射到實際儲存的位址即可;甚至 30 位元空間也可以映射到 16 位元空間,如此一來,便可以解決大位址空間,小記憶體容量的問題。另一個問題,如果所欲執行程式的空間大於記憶體容量應如何處理,此問題只要將一些暫時不 執行的程式移出記憶體,將空出來的空間載入另一段程式即可。如此一來,每次系統所分配(分區、分頁或分段技巧)載入的空間便不可以固定,而可能隨時變更; 也就是說,被分配載入的程式(包含資料)也可能隨時被『換出』(Swapping Out)或『換入』(Swapping In),因此必須採用『動態分頁』或『動態分段』技巧,其實這兩種技巧也是虛擬記憶體的主要技術。
還為討論虛擬記憶體之前,先來一般非虛擬記憶體管理系統的三個特性:

  • 整體性:一個行程的全部實體,在執行之前必須被整體載人記憶體內。

  • 駐留性:作業行程一旦進人主記憶體內便一直駐留其中,直到執行結束才離開。

  • 連續性:一個行程分配是一片連續的主記憶體空間
虛擬記憶體的特性如下:
  1. 一級記憶體概念:虛擬的記憶體管理系統把大容量的外部儲存體作為主記憶體的直接延伸。對主記憶的外部儲存體實施整體的管理。

  2. 作業位址空間概念:一個作業的位址空間就是一個虛擬記憶體,每個作業都處於各自的虛擬記憶空間中,每一作業的大小可達到與虛擬記憶體空間相等。對每一作業而言,整個記憶空間(實體或虛擬)皆規其個人使用。
虛擬記憶體管理的三個基本概念
  1. 局部性:一個作業在某段時間內只需要的局部程式存放在主記憶體便可。

  2. 置換性:行程執行過程中,當前暫不使用的或今後不再使用的部份程式,可以換出主記憶體(page out),要用時再換入(page in)。

  3. 離散性:作業形成所佔據的主記憶體空間可以不必完全連續,只需局部的或分段連續。
虛擬記憶體的三個管理策略。
  1. 載入策略:在什麼時候把所需要的部分行程實體從外部儲存體載入主記憶體。

  2. 分配策略:決定把欲載入的行程實體放置在主記憶體的何處。

  3. 淘汰策略:又稱置換策略,當主記憶體空間已經滿了或當前主記憶體可用空間不能裝下需要載入的行程實體時,決定換出哪些行程。
0-5-2 動態分頁管理
『動 態分頁』(Dynamic Paging)管理也是延續靜態分頁管理的技術(如 0-4-2 節介紹),只不過程式被分配的空間位置並不固定;亦是,程式被『換出』之後,下次被『換入』的位址並不一定是上次的位址,因此稱之為『動態』。我們將動態 分頁管理的技巧歸納如下:

  • 首先系統將主記憶體以某一固定大小(如 4Kbyte)劃分為若干個區塊,稱之為『區塊』(Block)。

  • 同樣的,系統也將所欲載入的程式(包含資料),劃分為若干個區塊,稱之為『頁』(Page)。頁的大小與區塊(Block)相同。

  • 當系統欲執行某一段程式,而該程式片段(或稱頁)不在主記憶體時,則發生『缺頁中斷』,並由硬碟載入該『頁』,此動作稱之為『置換入』(Swapping In)。

  • 當系統置換入某一頁但主記憶體空間不足時,則必須將某些『頁』的程式移出並空出空間,才能讓所需的頁載入,此動作稱為『置換出』(Swapping Out)。
由上述的討論,可能出現下列問題,這也是建構虛擬記憶體必須解決的方案:

  • 到底有哪些『頁』被置換入,系統必須明確的紀錄,才能作為是否『缺頁』的依據。

  • 程式片段(頁)是當需要時才被置換入,當它被載入主記憶體的時機並無法預先估計得到,又被載入的位址也無法預先估計得到。因此,系統必須紀錄每一頁被載入的主記憶體位址。

  • 頁可能隨時被換出或換入,當它再次被換入的位址不一定會和前次位址相同(動態分頁的原理)。

  • 當主記憶體空間不足而需要置換出某一頁時,應該換出哪一頁較為適當,這也需要某一演算法來估算。如果演算法估算得不恰當的話,時常被移出的頁又時常被置換入,而使發生『缺頁中斷』過於頻繁的話,會嚴重降低系統的執行效益。
另外,解決上述 1、2 與 3 問題是增加『分頁表』(Paging Table)的欄位,如圖 0-# 所示,所增加欄位的功能如下:

  • 駐留位元:表示該頁是否駐留於主記憶體。

  • 控制訊息:
(image placeholder)
圖 0-# 動態分頁之分頁表欄位
【缺頁中斷程序】
當 某一行程(或作業)進入 CPU 排程準備被執行時,系統必須建立該作業的分頁表,並載入『記憶體管理單元』(Memory Management Unit, MMU)內。MMU 可以是獨立的晶片或被植入 CPU 內。當 CPU 存取主記憶體資料(或程式)時,便透過 MMU 內的分頁表映射到實際主記憶體位址上。而由『駐留位元』欄位可以判斷該頁是否已載入主記憶體內,如果沒有則發生缺頁中斷,並由外部儲存體載入該頁,並修該 『駐留位元』。另外,缺頁中斷的處理動作如圖 0-# 所示。
(image placeholder)
圖 0-# 動態分頁之缺頁中斷程序
【淘汰演算法】
為 了提高系統效益,我們期望被淘汰的分頁儘可能是最近不會再用到的,如何決定哪一分頁被置換出,其對系統的影響最小,這就是淘汰演算法所必須具有的功能。淘 汰演算法必須設定某一條件,再利用此條件由目前載入的分頁中,搜尋條件最高者再將其淘汰(利用分頁表的控制欄位內容)。到底要搜尋哪些分頁,又可區分為下 列兩種淘汰:
  • 狹義淘汰:僅淘汰本行程內的分頁。

  • 廣義淘汰:被淘汰的分頁可能是本行程或其他行程所有的。
一般淘汰演算法有:

  • 『先進先出』(First In First Out, FIFO)演算法:

  • 最近最少使用』(Least Recently Used, LRU)演算法:

  • 『最近未使用』(Not Use Recently, NUR)演算法:
0-5-3 動態分段管理
『動 態分段』(Dynamic Segment)的原理與動態分頁(如 0-5-2 節介紹),也延續了靜態分段的運作方式。分段與分頁之間最大的不同點,為分頁是每一頁(或區塊)的大小是固定的,而分段則不然,每一分段的大小是依照程式 片段功能來分段。因此,在動態分段的『分段表』(Segment Table)必須多增加一個『分段長』欄位,來紀錄該分段的長度,如圖 0-# 所示。
(image placeholder)
圖 0-# 動態分段的分段表欄位
至於淘汰演算法也可採用 FIFO、LRU 或 NUR 演算法,但必須增加考慮所欲淘汰的空間是否足夠存放等待換入分段的大小,或需要淘汰兩個以上的連續分段才足夠。其餘問題與動態分頁管理大同小異,不再贅言。

0-6 輸入/輸出管理
一 部電腦的構成除了 CPU 與記憶體之外,輸入/輸出裝置(Input/Output Device)是另一個不可或缺的設備。記憶體儲存 CPU 所欲執行的程式與資料,主機則必須透過 IO 裝置才可與外部溝通;另一方面,使用者也須利用 IO 裝置來控制主機電腦,或取得主機執行的節果。較常見透過 IO 裝置所控制的有鍵盤、螢幕、滑鼠、印表機 … 等等週邊設備。
(image placeholder)
圖 0-# IO 裝置與週邊設備
圖 0-# 為 CPU、IO 裝置與週邊設備之間的關係。有一個非常重要的觀念,即是一部電腦所有的動作都是以 CPU為主。CPU 是整部電腦的主控者,它控制著『資料匯流排』(Data Bus)與『位址匯流排』(Address Bus);當它決定由哪一位址存取資料,則由位址匯流排指定哪一個位址,再由資料匯流排讀入或寫出資料。至於 CPU 所送出的位址匯流排所指定的是記憶體或 IO 裝置位址,這在設計該主機環境就必須指定完成,並儘可能不要再變更。基本上,CPU 存取 IO 裝置與主記憶體並沒有很大的不同,但到底週邊設備大多牽涉到機械或人工的操作,處理速度遠不及記憶體。又週邊設備資料的輸入與輸出時間也很難預估得到,因 此有資料輸入量與輸出入時機兩大問題,以下會分別討論到。
0-6-1 輸出/輸入時機
如 前所述,整部電腦的主控者為 CPU,但每一個週邊設備也是一部獨立的主控台(也可能是一部電腦),獨立主控台之間如何來相互傳遞資料,這就是主機輸出/輸出時機如何控制的問題。譬 如,當使用者由鍵盤輸入字元時,IO 裝置取得該字元後,CPU 怎麼知道來讀取;或者,主機將資料送給印表機列印時,印表機剛好很忙碌,而它如何通知 CPU 暫且等待;又當印表機空閒了,應如何通知 CPU 繼續傳送列印資料。基本上有下列幾種方法,分別說明之。
【詢問】(Polling)
『詢 問』(Polling)方法是 CPU 週期性的詢問 IO 裝置是否有資料進來,如果有則 CPU 再讀取該週邊設備上的資料。詢問方法看似非常簡單,但 CPU 必須耗費許多時間來詢問;如果詢問間隔時間較長,可減少耗費 CPU 時間,但週邊設備的時效性就會較低。譬如,週邊設備是鍵盤,如果詢問間隔時間太長,使用者輸入資料的反應時間就會太慢;如果間隔太短並比使用者輸入速度 快,則 CPU 詢問許多次才可能收到資料。詢問動作如圖 0-# 所示。
(image placeholder)
圖 0-# 詢問法輸入/輸出
【中斷處理】(Interrupt)
系 統採用詢問法將浪費許多時間去一個一個週邊設備是否需要服務。如果可以反過來,當某一週邊設備需要服務時,CPU 能暫停目前的工作並給予該設備服務,這就是『中斷處理』(Interrupt)的基本概念。中斷處理是當某一週邊設備需要服務時,則透過 IO 裝置送一個『中斷訊號』給 CPU。中斷訊號可以暫停目前 CPU 所執行的工作,並去執行事先已準備好的中斷程式,該程式即執行服務該週邊的工作;服務完後,CPU 再回到先前所執行的工作,其運作程序如圖 0-# 所示。
(image placeholder)
圖 0-# 中斷處理的運作程序

(image placeholder)
圖 0-# 中斷處理的硬體連接

(image placeholder)
圖 0-# IO 處理器的功能

(image placeholder)
圖 0-# 多重週邊設備的中斷
【直接記憶體存取】(Directory Memory Access, DMA)
DMA 控制器利用 CPU 沒使用匯流排(資料、位址、控制)的空閒時間,搶用匯流排,將資料寫入主記憶體內。
(image placeholder)
圖 0-# DMA 運作概念圖
0-6-2 字元與區塊裝置
在 一般情況下,當週邊設備需要與 CPU 之間傳輸時,都需要透過 IO 處理器(或 IO 控制器)的轉送;但主動者還是 CPU,CPU 將資料傳送給 IO 處理器,或由 IO 處理器讀取資料。下一個重點是,CPU 每次向 IO 處理器讀寫資料有多寡,這可區分為兩種設備,分述如下:
  • 區塊輸入/輸出裝置:IO 處理器每次與 CPU 之間傳輸資料量,是以整個區塊(128 ~ 1024 Byte)連續性的傳輸。連續大資料傳輸的效率較高,但反應速度較慢,此週邊設備大多需要較快傳輸資料,如硬碟機或磁帶機等等。

  • 字元輸入/輸出裝置:IO 處理器與 CPU 之間傳輸資料是,每次一個字元(Character 或 Byte)接一個字元的傳輸。每次傳輸資料較少但反應速度較快,譬如,鍵盤、滑鼠、顯示器等等。
由 圖 0-# 可以看出,所謂區塊或字元傳輸是 CPU 與 IO 處理器之間的讀寫動作,並不牽涉到週邊設備的傳輸。也就是說,週邊設備與 IO 處理器之間可以利用其他方式傳輸,譬如,一個位元接一個位元的連續傳輸(串列傳輸)或多個位元一起傳輸(並列傳輸)。一般情況,IO 處理器上備有一些儲存空間(或稱緩衝器),儲存由 CPU 或週邊設備所接收到的資料。譬如,CPU 以區塊傳輸方式將大筆資料連續寫入 IO 處理器,然而 IO 處理器與週邊設備之間採用串列傳輸方式,因此,IO 處理器必須將資料暫存於緩衝器內,再慢傳送給周邊設備。另一種情況,IO 處理器以並列方式由周邊設備讀入大筆資料,再慢慢以位元方式傳送給 CPU。由此可見,某一週邊設備應該屬於區塊傳輸或字元傳輸,是依照當時使用情況而定,也很難固定於某一傳輸模式。為了合乎各種不同的需求,一般管理者都 會將某些週邊設備設定有區塊與字元兩種傳輸模式;針對某一週邊設備(如印表機)使用者可以自行選擇要採用哪一種傳輸模式。
(image placeholder)
圖 0-# 字元與區塊裝置
0-6-3 緩衝器管理
CPU 由 IO 處理器存取資料的速度遠不及記憶體,又 CPU 本身內部的暫存器容量並不高;如果 CPU 連續由週邊設備讀入多筆資料,欲存放在暫存器內是不大可能的。因此,我們可選用一些記憶體空間當作 CPU 暫存器來使用,這就是緩衝器的概念。緩衝器是用來暫存 CPU 所欲讀寫入週邊設備的資料,以減少 CPU 存取週邊設備的次數,如此可以提高主機的執行效益。圖 0-# 為輸入緩衝器概念圖,CPU 一次由周邊設讀入大量資料(訊號 (1))並儲存於緩衝器(主記憶體空間,訊號 (2)),當它需要使用這些資料時,直接連續由記憶體讀取即可;當主記憶體上資料使用完畢之後,再由 IO 處理器讀入另一區塊資料。
(image placeholder)
圖 0-# 輸入緩衝器概念圖
圖 0-# 為輸出緩衝器概念圖,當 CPU 需要將資料輸出到週邊設備時,並不直接寫入 IO 處理器,而將其暫存於輸出緩衝器上;一直到 CPU 較空閒或該行程工作完畢時,CPU 在一次將緩衝器上的資料連續輸出到 IO 處理器上。雖然採用輸入/輸出緩衝器可以減少 CPU 與週邊設備的存取速度,提高了主機的執行效益但也降低了周邊與主機之間聯繫的時效性。因此,並非所有設備都可使用緩衝器架構,譬如鍵盤輸入便不適合,但檔 案系統的磁碟機設備就非常適合。
(image placeholder)
圖 0-# 輸出緩衝器概念圖
0-6-4 IO 存取介面
一般系統都會針對各種週邊設備提供標準的 IO 介面,使用者只要利用 IO 介面去存取週邊設備,甚至不需去了解所存取的裝置是何種設備。最基本有下列存取介面:
  • open(device_name):

  • read(device_name, address, size):

  • write(device_name, address, size):

  • close(device_name):
圖 0-# 為 I/O 介面程式的功能圖。當使用者行程呼叫 I/O 介面程式時,此時介面程式所攜帶的參數指定到哪一個週邊驅動程式(或設備檔,Device file),並啟動其驅動程式。驅動程式再利用呼叫中斷程式來請求 CPU 處理,最後 CPU 再利用 IO 命令(out( ) 與 in( ))控制 I/O 處理器;另外,週邊回應違反向處理動作。一般系統都會將中斷程式安裝於核心程式內,另外,某些較常用的設備驅動程式(如網路驅動程式)也會安裝於核心內。 核心程式大多常駐於主記憶體內,不用由硬碟置換入程式,因此執行速度較快;但大量驅動程式嵌入核心,也會佔用太多記憶體空間,至於哪些需要載入,這可由系 統管理者自行設定。
(image placeholder)
圖 0-# IO 存取介面功能圖
0-6-5 Spooling 管理
在 多人使用環境下,許多週邊設備是多人共享使用的。但依照 Multi-programming 系統(由分時多工技術實現)的精神是,當某一使用者輪流到被服務時,在它的權限範圍內可以操作任何設備,而且所有設備都必須等待該使用者的操作;也就是 說,對任何使用者而言,整部系統僅服務它個人而已。如此一來,所有使用者都可以直接控制週邊設備,如果沒有適當的處理可能會出現嚴重的錯誤。圖 0-# 為沒有特殊處理之共享印表機的運作情況,主機 A 為多元作業系統(如 Unix),並安裝一部共享印表機,也有使用者 A 在該主機上操作。另外,主機 B ~ 主機 D 的使用者,皆以 telnet 方式登入主機 A,並傳送列印資料,期望由印表機印出自己的資料。則表示主機 A 上有 User_A、User_B、User_C 與 User_D 四位使用者,並以分時方式輪流這四位使用者。假設這四位使用者同時要求印表機列印其資料,則印表機被控制服務的時機是,當系統服務 User_A 時,列印 User_A 的資料;又當系統服務 User_B 時,列印 User_B 的資料;又當系統服務 User_C 時,列印 User_C 的資料,依此類推,則印表機可能輸出各個使用者資料的交叉列印。
(image placeholder)
圖 0-# 無 Spooling 管理的共享印表機操作
『線 上同時週邊處理』(Simultaneous Peripheral Operations On Line, SPOOL)系統則來解決上述的問題。它的基本構想是,給每一個使用者一部與共享印表機相同的虛擬印表機。使用者隨時都可操作及控制該虛擬印表機,一直到 使用者列印完畢之後,系統再將虛擬印表機所接收到的資料一併傳送給共享印表機。使用者操作虛擬印表機也如同操作真實印表機一樣,甚至無法感覺出有哪裡不一 樣;唯一不同的是,所列印的資料必須到列印結束之後,才一併由真實印表機輸出,如圖 0-# 所示。
(image placeholder)
圖 0-# Spooling 管理的印表機功能
圖 0-# 為實現 SPOOLing 功能的方法,首先系統在磁碟機開啟每一虛擬印表機的空間,使用者所送給虛擬印表機列印的資料將被儲存於磁碟空機內。當使用者列印完畢之後, SPOOLing 將該虛擬印表機的資料送往『列印佇列』(Print Queue),並等待送往印表機列印。
(image placeholder)
圖 0-# Spooling 系統的組成

0-7 檔案系統管理
『檔 案』(File)是一個訊息或資料的整合體;基本上,每一檔案都是一個獨立的訊息集合。當檔案數量過於龐大時,則需要一套系統來整合及管理,此即是『檔案 系統』(File System)。檔案系統提供有各種操作工具,讓使用者方便尋找及存取各個檔案。然而,檔案依照其所儲存的檔案格式,也可區分為兩大類:
  • 紀錄檔案(Record File):其檔案結構是由若干個邏輯紀錄所組成,各個紀錄是依照某一相關訊息排列,紀錄為該檔案存取的基本單位,譬如,資料庫系統的資料檔案。

  • 文字串流檔案(Text Stream File):檔案直接由某一字元(或其他表示型態)序列所組成,而沒有依照某一特殊邏輯紀錄型態儲存。譬如,文書檔、影像檔、聲音檔、執行檔等等。
為了方便使用者辨識檔案型態,一般系統都利用檔案的副檔名來表示該檔案的型態。譬如 .exe 為執行檔、.bin 是二進位執行檔、.dbf 為資料庫紀錄檔等等。
0-7-1 檔案屬性
每一檔案都有其特殊用途及特性,因此每一檔案都必須有一個特殊位置紀錄其屬性(Attribute),使用者可由其屬性來了解該檔案的特性。一般檔案都會紀錄下列屬性:
  • 型態(Type):表示該檔案內所儲存的資料型態,如紀錄檔或文字串列檔。

  • 大小(Size):表示該檔案的位元組大小。

  • 存取控制(Access Control):表示存取該檔案的權限限制。

  • 擁有者(Owner):表示該檔案的擁有者。

  • 日期(Data and Time):紀錄該檔案被建立、及最後修改日期及時間。
0-7-2 檔案操作
一般檔案系統提供有下列檔案操作功能:
  • 建立檔案:讓使用者開啟新檔案的工具。

  • 讀取檔案:讀取檔案內容的工具。

  • 寫入檔案

  • 刪除檔案:

  • 檔案屬性變更:
0-7-3 檔案的儲存
圖 0-# 為檔案儲存於磁碟機的架構。首先系統將磁碟機上的儲存空間,以某一固定大小劃分為若干個『磁區』(Sector),依照系統的需求,可能是 1KByte、2KByte、4Kbyte 或 8 Kbyte。接著,再將所欲存入的檔案,以同樣的大小分割若干個區塊,再分別填入磁碟區塊內。檔案所屬的磁碟區塊之間是利用鏈路(Link)方式連結在一 起。檔案系統必須提供如何由磁碟空間裡尋找出空閒磁區、當忙碌磁區被釋放時,如何連結到空閒磁區、又某一檔案如何索引到它所屬的磁區上(目錄索引)、又必 須紀錄每一個檔案的屬性如何。
(image placeholder)
圖 0-# 檔案的儲存
【磁區尺寸】
主 機與磁碟機之間的讀寫動作,每次存取都以一個磁區為單位(如 1Kbyte),又主記憶體內緩衝器的大小(如1Kbyte)也是如同磁區一樣。如此一來,磁區的大小將會影響到檔案傳輸的速度,如果磁區較大,則主機讀 出或寫入某一檔案,其存取磁碟機的次數就會相對減少。譬如,某一檔案有 11Kbyte,如採用 8 Kbyte 磁區只要存取兩次即可;如果採用 2Kbyte 磁區則必須存取 6 次。但磁區越大其可能浪費的空間也就越大,譬如,某一檔案有 11Kbyte,利用 8Kbyte磁區則需要兩個磁區,合計 16 Kbyte,其中浪費了 5Kbyte 的空間;如採用 2Kbyte 磁區則只浪費 1 Kbyte(6 個磁區)。到底磁區應該要多大,可由兩個方向來思考:
  • 資料庫檔案:一般資料庫系統的資料檔案都是較大的檔案,並且需要一次載入大量的資料的主記憶體內,以供資料搜尋與整理,因此需要大磁區的檔案系統來儲存。

  • 系統檔案:一部作業系統大多由許多命令(或稱 Shell)所構成,這些可執行檔大多不會很大,並且需要快速同時載入不同的命令,因此使用較小磁區儲存較為合適。
【檔案卷】(Volume)
不 同應用需求可能需要不同的磁區大小,在同一系統中也可能出現不同磁區大小的需求。譬如,一般作業系統檔案都是較小的執行檔,該系統也可能安裝有資料庫系 統,然而資料庫系統需要較大的磁區。如此一來,我們將很困難選擇來決定磁區應該多少才適合,而且一顆硬碟再起初格式化時,將它格式化某一格式的磁區之後, 在使用當中是無法再變更的。為了克服這個問題,我們可將一顆硬碟邏輯劃分為若干個『分割區』(partition),每一分割區獨立格式化。因此,每一分 割區可依照所儲存的資料型態來決定其磁區大小,可獨立儲存檔案而不受其他分割影響,一般稱之為『檔案卷』(Volume),如圖 0-# 所示。
(image placeholder)
圖 0-# 硬碟與檔案卷的關係
【檔案目錄索引】(Directory index)
檔 案目錄是檔案系統的關鍵資料結構,檔案目錄作用好比圖書館的書籍目錄一樣,用來將許許多多的檔案有條不紊地組織起來,以便能夠迅速而準確地查詢檔案。一般 系統會在硬碟某一特殊區塊儲存相關的檔案目錄資料,大多在第 0 磁軌上,稱為『檔案配置表』(File Allocation Table, FAT)。FAT 紀錄著每一個檔案的屬性及索引位置,相對的,每一檔案都有一個『檔案控制區塊』(File Control Block, FCB)紀錄著相關訊息。
FCB 是一個動態資料結構,當一個檔案被建立時,系統也建立一個相對應之FCB,而系統依此FCB對應該檔案實施控制。FCB中的某些內容會隨檔案的使用而動態改變,當該檔案被撤銷時,相對應的FCB亦隨之撤消。一般 FCB 包含下列訊息
  1. 檔案類型和檔案結構:檔案結構包括檔案的邏輯結構和實際結構,它決定了檔案的定址方式。

  2. 實際儲存訊息:包括檔案的大學以及外部儲存體中的實際位址。

  3. 共享及保護保密訊息:紀錄檔案擁有人及共享使用者的標籤,各類使用者的存取權限,檔案的連接計數。

  4. 時間管理訊息:檔案的建立時間,保留時間,最近修改時間。
【單層目錄結構】
系統只設置一個目錄表,目錄項就是FCB,每一FCB指向一個檔案。系統中所有檔案的FCB都並列排列在該目錄表中,對任一檔案的查詢皆在該目錄表上進行。
(image placeholder)
圖 0-# 單層目錄結構
【目錄樹結構】(Tree Architecture)
單 層目錄結構必須預先預留檔案索引的大小,如果預留太少可能不足使用,又如果預留太多可能浪費空間。當檔案數量太多時,平面式(Flat)檔案結構也較困難 搜尋所要的檔案,對於檔案的分類管理也較為困難。因此,目前大部分的檔案系統都採用目錄樹結構,它與單層目錄結構之間最大的不同是,單層目錄結構的 FCB 所索引的位置一定是儲存檔案資料;而目錄樹的 FCB 所索引的位置可能儲存檔案或另一個目錄結構。在目錄樹中,一個非終極節點(用矩形表示)表示一個目錄表,一個終極節點(用圓形表示) 表示一個非目錄檔案,而是一般檔案,如圖 0-# 所示。
(image placeholder)
圖 0-# 目錄樹結構

0 Comments:

Post a Comment

<< Home