1. 程式人生 > >大容量存儲器的結構

大容量存儲器的結構

們的 例如 發生 決定 消息 slot 分開 復數 用戶數據

大容量存儲器的結構

文件系統從邏輯上可分為三個部分。用戶和程序員所使用的的文件系統接口。操作系統實現該接口所使用的數據結構和算法。以及系統的最底層:次級和三級存儲結構。

磁盤

磁盤(magnetic disk)為現代計算機系統提供了大容量的外存。從概念上來說,磁盤相對簡單。

技術分享圖片

磁頭與磁臂(disk arm)相連,磁臂能將所有磁頭作為一個整體而一起移動。磁盤片的表面被邏輯地劃分成圓形磁道(track),磁道再進一步劃分為扇區(sector)。位於同一磁臂位置的磁道集合形成了柱面(cylinder)。每個磁盤驅動器有數千個同心柱面,每個磁道可能包含數百個扇區。常用的磁盤驅動器的存儲容量是按GB來計算的。

磁盤驅動器通過一組稱為I/O總線(I/O bus)的線與計算機相連。有多種可用總線包括EIDE(enhanced integrated drive electronics), ATA(advanced technology attachment),串行ATA(serial ATA,SATA)總線,USB(universal serial bus),以及SCSI總線。被稱為控制器(controller)的特殊處理器執行總線上的數據傳輸。主機控制器(host controller)是計算機上位於總線末端的控制器。磁盤控制器(disk controller)位於磁盤驅動器內。為了執行磁盤I/O操作,計算機常常通過內存映射端口,在主機控制器上發送一個命令。主機控制器接著通過消息將該命令傳送給磁盤控制器,磁盤控制器操縱磁盤驅動器硬件以執行命令。磁盤控制器通常有內置緩存。磁盤驅動器的數據傳輸發生在其緩存和磁盤表面,而到主機的數據傳輸則以更快的速度在其緩存和主機控制器之間進行。

磁盤附屬

計算訪問磁盤存儲有兩種方式。一種方式是通過I/O端口(或主機附屬存儲(host-attached storage)),小系統常采用這種方式。另一方式是通過分布式文件系統的遠程主機,這稱為網絡附屬存儲(network-attacked storage)。

主機附屬存儲

主機附屬存儲是通過本地I/O端口訪問的存儲。這些端口使用多種技術。典型的臺式計算機使用I/O總線結構,如IDE或ATA。這種結構允許每條I/O總線支持最多兩個端口,而SATA是一種新的簡化了電纜連接的類似協議。高端工作站和服務器通常采用更為復雜的I/O結構,如SCSI或FC(fiber channel)。

網絡附屬存儲

網絡附屬存儲(network-attached storage,NAS)設備是數據網絡中遠程訪問的專用存儲系統。客戶通過遠程進程調用接口來訪問NAS,遠程進程調用(RPC)可通過IP網絡的TCP或UDP來進行。

磁盤調度

常用的磁盤調度有先來先服務(FCFS),最短尋道時間優化算法(shortest-seek-time-first,SSTF),SCAN電梯算法,C-SCAN調度,LOOK調度。

磁盤管理

操作系統還負責磁盤管理方面其他的內容。這裏討論磁盤初始化,從磁盤引導,壞塊恢復。

磁盤格式化

一個新的磁盤是一個空白板:它只是一些含有磁性記錄材料的盒子。在磁盤能存儲數據之前,它必須分成扇區以便磁盤控制器能讀和寫。這個過程稱為低級格式化(或物理格式化)。低級格式化為磁盤的每個扇區采用特別的數據結構。每個扇區的數據結構通常由頭、數據區域(通常為512B大小)和尾部組成。頭部和尾部包含了一些磁盤控制器所使用的信息,如扇區號和糾錯碼(error-correcting code,ECC)。當控制器在正常I/O時寫入一個扇區的數據時,ECC會用一個更具磁盤數據計算出來的值來更新。檔讀入一個扇區時,ECC值會重新計算,並與原來存儲的值相比較。如果這兩個值不一樣,那麽這可能表示扇區的數據區可能已損壞或磁盤扇區可能變壞。ECC是糾錯代碼,這是因為它有足夠多的信息,如果只有少數幾個數據損壞,控制器能利用ECC計算出哪些數據已改變並計算出它們的正確值,然後回報一個可恢復軟錯誤(soft error)。控制器在讀寫磁盤時會自動處理ECC。

絕大多數硬盤在工廠時作為制造過程的一部分就已經低級格式化了。這一格式化使得制造商能測試磁盤和初始化從邏輯快碼到磁盤上無損扇區的映射。對許多磁盤,當通知磁盤控制器低級格式化磁盤時,也能選擇在頭部和尾部之間留下數據區的長度。

為了使用磁盤存儲文件,操作系統還需要將自己的數據結構記錄在磁盤上。這分為兩步。第一步是將磁盤分為由一個多多個柱面組成的分區。操作系統可以將每個分區作為一個獨立的磁盤。例如,一個分區可以用來存儲操作系統的可執行代碼,而其他分區用來存儲用戶數據。在分區之後,第二步是邏輯格式化(創建文件系統)。在這一步,操作系統將初始的文件系統數據結構存儲到磁盤上。這些數據結構包括空閑和已分配的空間(FAT或者inode)和一個初始為空的目錄。

為了提高效率,大多數操作系統將塊集中到一大塊,通常稱為簇(cluster)。磁盤I/O通過塊完成,但是文件系統I/O通過簇來完成,這樣有效保證了I/O可以進行更多的順序存取和更少的隨機存取。

有的操作系統允許特別程序將磁盤分區作為一個邏輯塊的大順序數組,而沒有任何文件系統數據結構。該數組有時稱為生磁盤(raw disk),對該數組的I/O稱為生I/O(raw I/O)。

例如,有的數據庫系統比較喜歡生I/O,因為它能控制每條數據庫記錄所存儲的精確磁盤位置。生I/O避開了所有文件系統服務,如緩沖,文件鎖,提前獲取,空間分配,文件名和目錄。某些應用程序在生磁盤分區上實現特殊存儲服務的效率可能會更高,但是絕大多數應用程序在使用普通文件服務時會執行得更好。

引導塊

為了讓計算機開始運行,如當打開電源時或重啟後時,它需要運行一個初始化程序。該初始化自舉(bootstrap)程序應該很簡單,它初始化系統的各個方面,從CPU寄存器到設備控制器和內存,接著啟動操作系統。為此,自舉程序應該找到磁盤上的操作系統內核,裝入內存,並轉到起始地址,從而開始操作系統的執行。

絕大多數計算機,自舉程序保存在只讀存儲器(ROM)中。這一位置較為方便,由於ROM不需要初始化且位於固定位置,這便於處理器在打開電源或重啟時開始執行。而且,由於ROM是只讀的,所以不會受計算機病毒的影響。問題是改變這種自舉代碼需要改變ROM硬件芯片。因此,絕大多數系統只在啟動ROM中保留一個很小的自舉加載程序,其作用是進一步從磁盤上調入更為完整的自舉程序。這一更為完整的自舉程序可以容易地進行修改:新版本可寫到磁盤上。這個完整的自舉程序保存在磁盤的啟動塊上,啟動塊位於磁盤的固定位置。擁有啟動分區的磁盤稱為啟動磁盤(boot disk),系統磁盤(system disk)。

啟動ROM中的代碼引導磁盤控制器將啟動塊讀入到內存(這時尚沒有裝入設備驅動程序),並開始執行代碼。完整自舉程序比啟動ROM內的自舉加載程序更加復雜,它能從磁盤非固定位置裝入整個操作系統,並開始運行。即使如此,完整的自舉程序仍可能很小。

Windows2000中的啟動程序。Windows2000系統將其啟動代碼放在硬盤上的第一個扇區(被稱為主引導記錄(master boot record),或MBR)。此外,Windows2000中允許硬盤分為一個或多個分區,一個分區為引導分區(boot partition),包含操作系統和設備驅動程序。Window2000系統通過運行系統ROM上的代碼,開始啟動。此代碼指示系統引導分區的標誌。系統一旦確定引導分區,它讀取該分區的第一個扇區(即所謂的引導扇區(boot sector)),並繼續余下的啟動過程,包括加載各種子系統和系統服務。

技術分享圖片

壞塊

由於磁盤有移動部件並且容錯能力小(磁頭在磁盤表面飛行),所以容易出問題。

交換空間管理

當物理內存的數量達到臨界點,進程(通常選擇最不活躍的進程)從內存移到交換空間以釋放內存空間。實際上,現代操作系統很少以這種方式實現交換而是將交換與虛擬內存技術以及交換頁結合起來,不必對整個進程進行交換。事實上,現在有些系統可以互換使用術語:交換(swapping)分頁(paging),反映出這兩個概念的融合。

交換空間管理是操作系統的另一底層任務。虛擬內存使用磁盤空間作為內存的擴充。由於磁盤訪問比內存訪問要慢很多,所以使用交換空間會嚴重影響系統性能。交換空間設計和實現的主要目的是為虛擬內存提供最佳吞吐量。

交換空間的使用

不同操作系統根據所實現的內存管理算法,可按不同方式來使用交換空間。例如,實現交換的系統可以將交換空間用於保存整個進程映像,包括代碼段和數據段。換頁系統也可能只用交換空間以存儲換出內存的頁。系統所需要交換空間的量會受一下因素影響:物理內存的多少,所支持虛擬內存的多少,內存使用方式等。它可以是數MB到數GB的磁盤空間。

交換空間數量的高估會比低估更為安全。這是因為如果系統使用完了交換空間,那麽可能會中斷進程或使整個系統死機。高估只是浪費了一些空間,但並沒有造成什麽損害。

有的操作系統,如Linux,允許使用多個交換空間。這些交換空間通常位於不同磁盤上,這樣因換頁和交換所引起的I/o系統的負荷可以分散在各個系統I/O設備上。

交換空間位置

交換空間可有兩個位置:交換空間在普通文件系統上加以創建,或者是在一個獨立的磁盤分區上進行。如果交換空間是文件系統內額一個簡單大文件,那麽普通文件系統程序就可用來創建它,命名它並未它分配空間。這種方式雖然實現簡單但是效率較低。遍歷目錄結構和磁盤分配數據結構需要時間和過多的磁盤訪問。外部碎片可能會通過在讀寫進程鏡像時強制多次尋道,從而大大地增加了交換時間。通過將塊位置信息緩存在物理內存中,以及采用特殊工具為交換文件分配物理上連續塊等技術,可以改善性能,但是遍歷文件系統數據結構的開銷仍然存在。

另一種方法是,交換空間可以創建在生(raw)磁盤分區上。這裏不需要文件系統和目錄結構,只需要一個獨立交換空間存儲管理器以分配和釋放塊。這種管理器可以使用適當算法以優化速度,而不是優化存儲效率,因為交換空間比文件系統訪問更頻繁。內存碎片可能會增加,但還是可以接受的,這是因為交換空間內的數據的存儲時間通常要比文件系統的文件存儲時間短很多。交換空間的啟動的時候會初始化,因此任何碎片存在的時間都很短。這種方法在磁盤分區時創建一定量的交換空間,增加更多交換空間可能需要重新進行磁盤分區(可能涉及移動和刪除文件系統,以及利用備份已恢復文件系統),或在其他地方增加另外交換空間。

有的操作系統較為靈活,可以使用原始分區空間可文件系統空間進行交換。Linux就是這樣的操作系統:策略和實現是分開的,系統管理元可決定使用何種類型。權衡取決於文件系統分配和管理的方便和原始分區交換的性能。

Linux和Solaris相似,交換空間僅用與匿名內存或幾個進程的共享內存區。Linux允許建立一個或多個交換區。交換區可以是普通文件系統的交換文件或原始交換分區。每個交換區包括一系列的4KB的頁槽(page slot),用於存儲交換頁。每個交換區對應一個交換映射(swap map)-------整數計數器數組,每個數對應於交換區的頁槽。如果計數器值為0,對應頁槽可用。值大於0,表示頁槽被交換頁占據。計數器的值表示交換頁的映射數目。

技術分享圖片

RAID結構

這裏的多種磁盤組織技術,通常稱為磁盤冗余陣列(RAID)技術,通常用於提高性能和可靠性。

RAID級別

鏡像提供高可靠性,但昂貴;分散提供了高數據傳輸率,但並未改善可靠性。通過磁盤分散和"奇偶"位,可以提供多種方案以在低價環境下提供冗余。這些方案有不同的性價折中,可以分成不同級別,稱為RAID級別。下圖中P表示偏差糾正位,C表示數據的第二個副本。

技術分享圖片

RAID級別0:RAID級別0指按塊級別分散的磁盤陣列,但沒有冗余(如鏡像或奇偶為)。

RAID級別1:值磁盤鏡像。

RAID級別2:RAID級別2也稱為內存方式的差錯糾正代碼結構。內存系統一直實現了基於奇偶位的錯誤檢測。內存系統的每個字節都有一個相關奇偶位,以記錄字節中置為1的個數是偶數(parity=0)或奇數(parity=1)。如果字節的1個位損壞(或是1變成0,或0變成1),那麽字節的奇偶也將改變,因此與所存儲的奇偶位就不匹配。類似地,如果所存儲的奇偶位損壞了,那麽它就與所計算的奇偶位不匹配。

RAID級別3:RAID級別3或基於位交織奇偶結構對級別2做了改進。

RAID級別4:RAID級別4或塊交織奇偶結構采用與RAID0一樣的塊分散。

三級存儲結構

操作系統支持

操作系統的兩個主要任務是管理物理設備和為應用程序提供一個虛擬機器的抽象。對於磁盤,操作系統提供了兩種抽象。一是生設備(raw device),即只是數據塊的陣列。另一種是文件系統。對於磁盤上的文件系統,操作系統會對來自多個應用程序的交叉請求進行排隊和調度。

小結

磁盤驅動器是絕大多數計算機的主要外設I/O設備。大多數次級存儲設備是磁盤或磁帶。現代磁盤驅動結構是一個大型邏輯磁盤塊的一維陣列,每塊一般是512B。

磁盤可以通過兩種方式與計算機系統相連:(1)通過主機的本地I/O端口,(2)通過網絡連接如存儲域網絡。

磁盤I/O的請求主要由文件系統和虛擬內存系統所產生。每個請求以邏輯塊號的形式指定所引用的磁盤的地址。磁盤調度算法可改善有效帶寬、平均響應時間,響應時間偏差。許多算法如SSTF、SCAN、C-SCAN、LOOK和C-LOOK通過磁盤隊列的重排以改善這些指標。

性能可因外部碎片而降低。有些系統提供工具掃描文件系統,進而確定碎片文件,它們可移動塊以降低碎片。對於一個嚴重變成碎片的文件系統進行碎片整理可顯著改善性能,但是在整理碎片時,系統性能也會受些影響。復雜文件系統如UNIX的FFS(快速文件系統,Fast File System)采用了許多措施以控制空間分配引起的碎片,這樣就不需要對磁盤進行重新組織。

操作系統管理磁盤塊。首先,必須低級格式化磁盤,從而在原來硬件上創建扇區,新磁盤通常已經低級格式化。接著,對磁盤進行分區,創建文件系統和分配啟動塊以存儲系統的啟動程序。最後,當塊損壞時,系統必須提供一種方法避免使用該壞塊,或用另一設備塊從邏輯上替代它。

因為有效交換空間對於提供性能十分關鍵,系統通常繞過文件系統,而直接使用原始磁盤訪問以進行調頁。有的系統將原磁盤分區用作交換空間,也有的系統使用文件系統內的一個文件作為交換空間。其他系統提供兩種選擇,以允許用戶或系統管理員做出決定。

由於大系統要求大量存儲,所以經常通過RAID算法以使磁盤冗余。這些算法允許多個磁盤用於一個給定操作,即使在磁盤出錯時也允許繼續運行,甚至恢復數據。RAID算法分成不同級別,每個級別都結合了不同的可靠性和數據傳輸速度。

寫前日誌方案要求使用穩定存儲。為了實現這種存儲,需要多個、具有不同差錯模式的非易失性存儲設備(通常磁盤)上復制所需信息。也需要按一定控制方式來更新信息以確保能在數據傳輸錯誤或恢復出錯之後能恢復數據。

三級存儲器包括磁盤和磁帶驅動器,它們使用可移動介質。這裏涉及許多不同技術,包括磁帶,可移動磁盤,磁光盤和光盤。

大容量存儲器的結構