1.4 存儲I/O通道
要討論存儲I/O通道,必須先了解計算機總線。計算機總線是計算機的互連子系統(tǒng),在計算機內部的各個組件之間,或者在不同的計算機之間進行數(shù)據(jù)傳輸?shù)墓餐贰S嬎銠C總線通常在爭用資源的基礎上工作,實現(xiàn)計算機系統(tǒng)內部和之間的地址、數(shù)據(jù)和控制信息的交換。
最初的計算機系統(tǒng)只有一條總線,CPU、內存、I/O設備全部掛接到這條總線上,所有設備都被限制在一個時鐘頻率下工作,整個系統(tǒng)的速度被系統(tǒng)中最慢的設備所限制,整體性能無法提高。現(xiàn)代計算機都采用特殊的橋接設備將低速設備和高速設備隔離開來,讓它們處于不同的總線上面。從而形成了不同的計算機體系架構。
圖1-59給出了Intel北橋/南橋架構的示意圖。隨著技術的發(fā)展,計算機體系也呈現(xiàn)新的趨勢,例如將北橋集成到CPU之中。但大體來說,總線可分為以下類型:

圖1-59 Intel北橋/南橋架構
? 內部總線:CPU內部連接各寄存器及運算器部件之間的總線;
? 系統(tǒng)內存總線:又稱內存總線或前端總線,連接CPU和北橋芯片;
? 主機I/O總線:從北橋芯片引出,連接計算機系統(tǒng)中其他高速功能部件,包括南橋芯片SCSI適配器、網(wǎng)絡適配器等;
? 存儲I/O總線:即連接中低速I/O存儲設備的總線,包括從SCSI適配器引出的SCSI總線、通過南橋橋接的IDE或USB總線等;
? 網(wǎng)絡I/O總線:多個計算機之間相互連接的通信線路,例如連接計算機的以太網(wǎng)電纜。
雖然有其他形式,但本書中所討論的主機I/O總線、存儲I/O總線和網(wǎng)絡I/O總線分別是指PCI、SCSI,以及基于以太網(wǎng)的。
1.4.1 存儲I/O物理通道
為了討論數(shù)據(jù)I/O路徑,我們首先從有形的硬件開始,存儲網(wǎng)絡有以下六個硬件直接與I/O傳輸相聯(lián)系,如圖1-60所示。

圖1-60 應用服務器的存儲I/O物理通道
? 系統(tǒng)內存總線
? 主機I/O總線
? I/O控制器或網(wǎng)絡適配器
? 存儲I/O總線或網(wǎng)絡I/O總線
? 存儲設備和子系統(tǒng)
? 存儲介質
I/O路徑的第一個組成部分是系統(tǒng)內存總線。物理上,系統(tǒng)內存總線通常用來互連CPU和系統(tǒng)內存,以及高速緩存。外部設備,如I/O控制器、網(wǎng)絡適配器等,數(shù)據(jù)訪問速度比較慢,出于系統(tǒng)性能的考慮,通常使用橋接芯片將慢速的I/O設備和CPU等分開。慢速的I/O設備運行在主機I/O總線上,常見的主機I/O總線有PCI總線。
通過主機I/O總線后,沿著物理I/O路徑的下一站便是I/O控制器或網(wǎng)絡適配器,也就是常說的主機適配器(Host Bus Adapter,HBA),它既可以是主機I/O總線上插槽中的插卡,也可以是集成在系統(tǒng)主板上的一個集成芯片。常見的有以太網(wǎng)卡、SCSI適配卡和集成在南橋上的IDE控制器等。對于網(wǎng)絡適配器,I/O路徑的下一步就是網(wǎng)絡I/O,常見的有以太網(wǎng)電纜。對于I/O控制器,則是存儲I/O總線,例如對于SCSI適配卡,是并行的SCSI總線;而對于IDE控制器,則是最常見的ATA總線。
如果到達存儲I/O總線,數(shù)據(jù)I/O路徑的下一站是存儲設備和存儲子系統(tǒng),它們處于存儲I/O總線的另一端(或者叫目標器端)。存儲設備,常見的有磁盤驅動器和磁帶驅動器。而存儲子系統(tǒng),則是一組存儲設備的集合,存儲子系統(tǒng)的典型例子是RAID系統(tǒng)和磁帶庫。從微觀上講,存儲設備和存儲子系統(tǒng)并不是I/O路徑的最后一站。通過存儲設備和存儲子系統(tǒng),I/O很快到達了其最終目的地,即存儲介質,如盤碟、磁帶、CD或者其他介質。
如果I/O是發(fā)往其他應用服務器或存儲系統(tǒng)的,則會通過網(wǎng)絡I/O總線到達對方應用服務器的網(wǎng)絡適配器,并且在對方內部經(jīng)過類似的路徑。先由主機I/O總線到達系統(tǒng)內存總線,進而又經(jīng)主機I/O總線到達I/O控制器,在存儲I/O總線上找到存儲設備或存儲子系統(tǒng),被后者最終寫到存儲介質上,如圖1-61所示。

圖1-61 網(wǎng)絡存儲子系統(tǒng)的存儲I/O物理通道
1.4.2 存儲I/O邏輯通道
在簡單描述了數(shù)據(jù)I/O路徑的物理成分后,我們來探討一下更有趣的軟件成分,或者稱為I/O路徑的邏輯通道。我們專注于Linux操作系統(tǒng)來探討存儲I/O邏輯通道。Linux是一個分層的系統(tǒng),下層對某些實現(xiàn)進行一定的封裝,提供應用程序接口(API)供上層調用。但同時,Linux是又一個“松耦合”的系統(tǒng),各個層次之間的依賴關系并不是非常嚴格的,這主要體現(xiàn)在:
? 下層會向上層注冊某些回調函數(shù)供其調用,后面會看到非常多這樣的例子,在此就不舉例說明了;
? 下層也會調用上層提供的公共函數(shù)。一個很重要的例子就是SCSI子系統(tǒng)調用塊I/O層的SCSI命令發(fā)送函數(shù),發(fā)送INQUIRY等。
Linux存儲I/O路徑(包括網(wǎng)絡I/O路徑)如圖1-62所示。在圖中,左邊部分為存儲I/O所經(jīng)歷的各個層次,右邊部分為網(wǎng)絡I/O所經(jīng)歷的各個層次。

圖1-62 存儲I/O邏輯通道
大部分I/O開始于需要訪問數(shù)據(jù)的應用,這里假設是系統(tǒng)調用。應用通常不管存儲的細節(jié),而是直接調用由操作系統(tǒng)提供的系統(tǒng)調用接口。提供數(shù)據(jù)的對象被看成是一個個的“文件”,由虛擬文件系統(tǒng)提供這種幻想。接下來,左邊是存儲I/O的執(zhí)行過程,右邊是網(wǎng)絡I/O的執(zhí)行過程。
存儲I/O經(jīng)過具體的文件系統(tǒng)到達塊I/O子系統(tǒng),經(jīng)過通用塊層、I/O調度層,最終到達塊設備層。如果是虛擬塊設備,又經(jīng)過多次反復來到物理塊設備,由它進入SCSI子系統(tǒng)。在其中經(jīng)過高層驅動、公共層和低層驅動的處理,最終通過消息傳遞接口,被固件轉換為硬件上的信號系列。
網(wǎng)絡I/O則經(jīng)過為各種網(wǎng)絡協(xié)議棧提供一致接口的BSD套接口層,如果是TCP/IPv4報文,則從IPv4協(xié)議族層,經(jīng)由TCP協(xié)議實現(xiàn),到達網(wǎng)卡驅動層,同樣,如果是虛擬網(wǎng)卡設備,又經(jīng)過多次反復來到物理網(wǎng)卡設備,由物理網(wǎng)卡驅動通過消息傳遞接口,被固件轉換為硬件上的信號系列。
本書的一個主要目的就是講解I/O在路徑的各個層次的處理細節(jié)。
1.4.3 虛擬機I/O邏輯通道
在虛擬機環(huán)境下,有來賓和宿主兩個操作系統(tǒng)。在宿主操作系統(tǒng)和來賓操作系統(tǒng)中分別存在完整的存儲棧,從而潛在有兩種文件系統(tǒng)和一種映像格式。虛擬機技術的關鍵在于存儲硬件(包括CPU、PCI子系統(tǒng)、SCSI子系統(tǒng)、I/O控制器、網(wǎng)絡適配器等的仿真),在虛擬機上對文件的訪問首先通過來賓機上的存儲I/O邏輯通道,到達虛擬機映像文件,然后通過宿主機上存儲I/O邏輯通道,最終被寫到宿主機管理的存儲介質上。這種虛擬機I/O邏輯通道的機理類似于棧結構,因此可稱為虛擬機存儲棧,如圖1-63所示。
由于篇幅所限,盡管筆者對虛擬機設備仿真原理和虛擬機存儲I/O路徑也曾花費很大的時間和精力,卻不能在本書盡述所得所感,只能期望在將來有機會出版本書的續(xù)篇時,彌補這一缺憾。所幸,本書對存儲I/O邏輯通道的各個部分都做了詳細的介紹,相信讀者在閱讀之后,將這些知識應用到對虛擬機原理的分析中,也必會有極大的幫助。

圖1-63 虛擬機存儲棧
- 大學計算機基礎:基礎理論篇
- Cinema 4D R13 Cookbook
- 計算機應用基礎·基礎模塊
- Java實用組件集
- 物聯(lián)網(wǎng)與云計算
- Implementing Oracle API Platform Cloud Service
- Android游戲開發(fā)案例與關鍵技術
- Visual FoxPro數(shù)據(jù)庫基礎及應用
- 工業(yè)機器人運動仿真編程實踐:基于Android和OpenGL
- Windows Server 2003系統(tǒng)安全管理
- 突破,Objective-C開發(fā)速學手冊
- Linux內核精析
- 手機游戲策劃設計
- 從零開始學JavaScript
- JRuby語言實戰(zhàn)技術