王 健,李小勇
飛機(jī)在一次飛行過(guò)程中,需要對(duì)機(jī)載采集卡上采集的各項(xiàng)參數(shù)進(jìn)行記錄,如發(fā)動(dòng)機(jī)參數(shù),音頻數(shù)據(jù)和視頻數(shù)據(jù)等。這些數(shù)據(jù)的采集、存儲(chǔ)和處理,為進(jìn)行飛行事故征候分析、故障診斷、視情維修、飛行品質(zhì)監(jiān)控、試飛監(jiān)控等提供了豐富信息。然而,由于缺少統(tǒng)一的數(shù)據(jù)記錄和存儲(chǔ)標(biāo)準(zhǔn),不利于數(shù)據(jù)的分析和共享。1994年,美國(guó)靶場(chǎng)司令委員會(huì)(RCC)決定不再要求統(tǒng)一的記錄介質(zhì)的格式,而是定義統(tǒng)一的數(shù)據(jù)格式,形成大家公認(rèn)的數(shù)據(jù)接口。2004年5月,RCC對(duì)IRIG 106第十章進(jìn)行修改,提出了固態(tài)記錄標(biāo)準(zhǔn)。通過(guò)RCC,廠商和用戶多年共同努力,2007年2月,IRIG 106第十章被修改為:數(shù)字記錄標(biāo)準(zhǔn)。目前,IRIG數(shù)字記錄標(biāo)準(zhǔn)已成為國(guó)際公認(rèn)標(biāo)準(zhǔn)之一。
IRIG 106第十章采用STANAG-4575文件系統(tǒng)作為數(shù)據(jù)存儲(chǔ)方式。STANAG-4575文件系統(tǒng)是北大西洋公約組織(NATO)制定的可卸載記錄模塊上的數(shù)據(jù)存儲(chǔ)標(biāo)準(zhǔn)。之所以選擇該文件系統(tǒng),是因?yàn)樗鼘?duì)記錄中的順序?qū)懖僮鬟M(jìn)行了優(yōu)化。同時(shí),STANAG-4575文件系統(tǒng)的元數(shù)據(jù)開(kāi)銷很小,并且可以支持很大的文件(64位)。選擇該標(biāo)準(zhǔn)文件系統(tǒng)的另一個(gè)優(yōu)勢(shì)是它可以保證記錄數(shù)據(jù)可以向前或向后兼容。
在飛機(jī)的記錄設(shè)備中,通常采用VXWorks操作系統(tǒng)。VXWorks是美國(guó)風(fēng)河公司(WindRiver)開(kāi)發(fā)的嵌入式實(shí)時(shí)操作系統(tǒng)。它憑借良好的可靠性和卓越實(shí)時(shí)性在嵌入式實(shí)時(shí)操作系統(tǒng)領(lǐng)域占據(jù)重要地位。它被廣泛地應(yīng)用在通信、軍事、航空、航天等高精尖及實(shí)時(shí)性要求極高的領(lǐng)域中,如衛(wèi)星通訊、軍事演習(xí)、彈道制導(dǎo)、飛機(jī)導(dǎo)航等。在美國(guó)火星探測(cè)器“勇氣號(hào)”和“機(jī)遇號(hào)”均采用VXWorks作為其操作系統(tǒng)。
VXWorks下層采用與FAT文件系統(tǒng)相兼容的dosFs作為其本地文件系統(tǒng),該文件系統(tǒng)的主要問(wèn)題有:
1) 單個(gè)文件最大只有 4GB,隨著磁盤(pán)容量的增加以及對(duì)記錄高清視頻數(shù)據(jù)的需要,這個(gè)限制會(huì)嚴(yán)重影響上層記錄軟件的實(shí)現(xiàn);
2) 長(zhǎng)時(shí)間的記錄過(guò)程可能會(huì)導(dǎo)致文件系統(tǒng)的碎片增加,使磁盤(pán)記錄性能嚴(yán)重下降;
3) 在出現(xiàn)意外斷電等情況時(shí),文件系統(tǒng)可能整個(gè)被破壞,導(dǎo)致文件數(shù)據(jù)無(wú)法恢復(fù);
因此,我們?cè)赩XWorks上實(shí)現(xiàn)了STANAG-4575文件系統(tǒng),來(lái)解決上面這些問(wèn)題。該實(shí)現(xiàn)主要的優(yōu)點(diǎn)包括:
1) 通過(guò)對(duì)關(guān)鍵元數(shù)據(jù)信息進(jìn)行備份和校驗(yàn),提高了系統(tǒng)的可靠性;
2) 通過(guò)哈希表等數(shù)據(jù)結(jié)構(gòu)來(lái)管理文件系統(tǒng)的元數(shù)據(jù),提高了系統(tǒng)的性能;
3) 通過(guò)既遵循標(biāo)準(zhǔn),又靈活變通的實(shí)現(xiàn)來(lái)提高系統(tǒng)的性能和可靠性;
4) 通過(guò)控制元數(shù)據(jù)和數(shù)據(jù)的寫(xiě)入方式來(lái)保證數(shù)據(jù)在磁盤(pán)上的一致性。
STANAG-4575文件系統(tǒng)是北大西洋公約組織(NATO)為可卸載記錄模塊(如固態(tài)硬盤(pán))制定的數(shù)據(jù)存儲(chǔ)標(biāo)準(zhǔn)。通過(guò)引入該標(biāo)準(zhǔn),IRIG 106可以讓記錄數(shù)據(jù)不依賴于下層設(shè)備,并且可以保證記錄數(shù)據(jù)向前和向后的兼容性。
STANAG-4575文件結(jié)構(gòu)定義所規(guī)定的文件系統(tǒng)格式,如圖1所示:
圖1 文件系統(tǒng)結(jié)構(gòu)
如圖1所示,除邏輯磁盤(pán)塊0保留之外,其他的邏輯塊包括兩種類型,一種是目錄塊,用來(lái)存放文件的元數(shù)據(jù),另一種是數(shù)據(jù)塊,用來(lái)存放文件的數(shù)據(jù)。
該文件結(jié)構(gòu)定義規(guī)定,邏輯塊1必須為一個(gè)目錄塊,其他的目錄塊通過(guò)雙向鏈表方式(前向鏈表和后向鏈表)連接起來(lái)。
一個(gè)目錄塊的頭部 64字節(jié)包括該目錄塊的元數(shù)據(jù)信息,接著為該目錄塊中包含的文件項(xiàng)(File Entry)數(shù)組。每個(gè)文件項(xiàng)占用112字節(jié),包含了文件的元數(shù)據(jù)信息,主要有:文件名、文件創(chuàng)建時(shí)間、文件大小、文件數(shù)據(jù)的起始?jí)K地址、文件數(shù)據(jù)占用磁盤(pán)塊數(shù)和文件關(guān)閉時(shí)間。
文件的數(shù)據(jù)部分用來(lái)存放上層用戶的數(shù)據(jù),對(duì)于訪問(wèn)文件系統(tǒng)的接口來(lái)說(shuō),文件數(shù)據(jù)必須呈現(xiàn)邏輯上連續(xù)存放的方式。即,若文件數(shù)據(jù)所在的第一個(gè)磁盤(pán)塊為X,那用戶可以通過(guò)訪問(wèn)磁盤(pán)塊X+1、X+2來(lái)訪問(wèn)文件之后的數(shù)據(jù)。
將文件數(shù)據(jù)連續(xù)存放的好處是可以優(yōu)化文件的順序讀寫(xiě)性能。同時(shí),這種方式可以減少文件的元數(shù)據(jù),即每個(gè)文件只要通過(guò)文件數(shù)據(jù)起始?jí)K號(hào)、文件數(shù)據(jù)占用塊數(shù)量?jī)蓚€(gè)值,就可以確定文件數(shù)據(jù)所占用的所有磁盤(pán)塊的位置。
為了將STANAG-4575文件系統(tǒng)嵌入到VXWorks中,必須先了解VXWorks文件系統(tǒng)的框架。
VXWorks文件系統(tǒng)框架從上到下主要分為4層,分別為:
1) 虛擬文件系統(tǒng)層
2) 特定文件系統(tǒng)層
3) 磁盤(pán)緩存
4) 塊設(shè)備層
該文件系統(tǒng)的層次結(jié)構(gòu),如圖2所示:
圖2 VXWorks文件系統(tǒng)層次架構(gòu)
從應(yīng)用程序發(fā)來(lái)的請(qǐng)求,經(jīng)過(guò)虛擬文件系統(tǒng)層的解析,會(huì)將請(qǐng)求進(jìn)一步傳向下層的特定文件系統(tǒng)層。下層的文件系統(tǒng)處理完請(qǐng)求后,將結(jié)果返回給虛擬文件系統(tǒng)層,虛擬文件系統(tǒng)再將結(jié)果返回給應(yīng)用程序。
特定的文件系統(tǒng)要對(duì)磁盤(pán)塊設(shè)備進(jìn)行管理,它需要經(jīng)常對(duì)磁盤(pán)進(jìn)行讀寫(xiě)操作。由于磁盤(pán)設(shè)備的讀寫(xiě)速度和內(nèi)存相比較低,若文件系統(tǒng)的每次讀寫(xiě)操作都在磁盤(pán)上進(jìn)行,則磁盤(pán)會(huì)成為整個(gè)系統(tǒng)的瓶頸。因此,需要在文件系統(tǒng)和下層磁盤(pán)之間插入一級(jí)磁盤(pán)緩存,該磁盤(pán)緩存是內(nèi)存中的一塊區(qū)域,主要用來(lái)對(duì)磁盤(pán)的數(shù)據(jù)進(jìn)行緩存。文件系統(tǒng)通常的讀寫(xiě)操作都在磁盤(pán)緩存中進(jìn)行。
磁盤(pán)緩存主要負(fù)責(zé)和下層真正的磁盤(pán)塊設(shè)備進(jìn)行交互。它負(fù)責(zé)從磁盤(pán)設(shè)備中讀取數(shù)據(jù),并將緩存中臟(DIRTY)的數(shù)據(jù)定期寫(xiě)到磁盤(pán)上。同時(shí),上層的文件系統(tǒng)也可以通過(guò)調(diào)用磁盤(pán)緩存提供的FLUSH函數(shù)將臟數(shù)據(jù)寫(xiě)到磁盤(pán)上。
由于實(shí)現(xiàn)文件系統(tǒng)的主要工作是與上層的虛擬文件系統(tǒng)進(jìn)行交互,因此需要對(duì)VXWorks虛擬文件系統(tǒng)層進(jìn)行更進(jìn)一步的分析。
VXWorks虛擬文件系統(tǒng)層的主要作用類似于Linux中的VFS,負(fù)責(zé)給上層應(yīng)用提供統(tǒng)一的文件系統(tǒng)的接口。它將所有的對(duì)文件系統(tǒng)的操作都抽象為以下7個(gè)操作:
1) 創(chuàng)建文件(CREATE)
2) 刪除文件(DELETE)
3) 打開(kāi)文件(OPEN)
4) 讀文件(READ)
5) 寫(xiě)文件(WRITE)
6) 關(guān)閉文件(CLOSE)
7) 輸入輸出控制(IOCTL)
所有特定文件系統(tǒng)的擴(kuò)展命令,都要通過(guò)調(diào)用IOCTL來(lái)實(shí)現(xiàn)。
虛擬文件系統(tǒng)為了能將上層發(fā)來(lái)的請(qǐng)求轉(zhuǎn)化為對(duì)下層文件系統(tǒng)的調(diào)用,就需要知道下層文件系統(tǒng)相關(guān)函數(shù)的具體實(shí)現(xiàn)。在VXWorks中,每個(gè)文件系統(tǒng)都必須有一個(gè)初始化函數(shù),在該初始化函數(shù)中,需要將自己實(shí)現(xiàn)函數(shù)的指針注冊(cè)到虛擬文件系統(tǒng)中去。因此,要在VXWorks中嵌入自己的文件系統(tǒng),實(shí)際上就是為該文件系統(tǒng)實(shí)現(xiàn)對(duì)應(yīng)于 VXWorks虛擬文件系統(tǒng)的7個(gè)函數(shù)及相關(guān)輔助函數(shù)。
該部分詳細(xì)描述STANAG-4575文件系統(tǒng)在VXWorks上的實(shí)現(xiàn)。首先介紹磁盤(pán)格式,接下來(lái)詳細(xì)描述在內(nèi)存中用到的數(shù)據(jù)結(jié)構(gòu)以及數(shù)據(jù)結(jié)構(gòu)的組織方式。
在文件系統(tǒng)磁盤(pán)結(jié)構(gòu)的設(shè)計(jì)過(guò)程中,主要有兩個(gè)因素需要考慮:
1) 必須嚴(yán)格遵照 STANAG-4575文件系統(tǒng)對(duì)磁盤(pán)格式的規(guī)定;
2) 在因素 1的基礎(chǔ)上,要盡量采用一種磁盤(pán)結(jié)構(gòu),使得上層的文件系統(tǒng)可以可靠、穩(wěn)定、高效地實(shí)現(xiàn)。
首先,STANAG-4575將磁盤(pán)塊0保留,因此,用該磁盤(pán)塊來(lái)作為文件系統(tǒng)的超級(jí)塊。超級(jí)塊用來(lái)存放該磁盤(pán)塊設(shè)備的總體信息,包括塊設(shè)備名稱、磁盤(pán)塊大小,磁盤(pán)塊數(shù)量等等。另外,在其中還存放了目錄區(qū)和數(shù)據(jù)區(qū)的相關(guān)信息。最后,在超級(jí)塊的末尾,存放了超級(jí)塊中所有字段的 MD5校驗(yàn)和,用來(lái)在磁盤(pán)塊掛載的時(shí)候檢查對(duì)超級(jí)塊的完整性進(jìn)行檢驗(yàn)。
由于超級(jí)塊是文件系統(tǒng)中最重要的數(shù)據(jù)結(jié)構(gòu),因此除了對(duì)它做MD5校驗(yàn)之外,還必須對(duì)其做冗余備份。將備份超級(jí)塊存放在最后一個(gè)磁盤(pán)塊上。這樣,即使主超級(jí)塊損壞,依然可以從最后一個(gè)磁盤(pán)塊上讀出文件系統(tǒng)的備份超級(jí)塊。
其次,STANAG-4575規(guī)定了磁盤(pán)塊1必須作為第一個(gè)目錄塊,且多個(gè)目錄塊之間用雙向鏈表連接。為了實(shí)現(xiàn)簡(jiǎn)單高效,且保證文件系統(tǒng)的可靠性。將文件系統(tǒng)的所有目錄塊連續(xù)存放,即就是在整個(gè)磁盤(pán)塊的頭部連續(xù)地存放目錄塊信息,當(dāng)然,目錄塊按照標(biāo)準(zhǔn)規(guī)定依然要采用鏈表來(lái)連接,只是此時(shí)可以順序地對(duì)目錄塊進(jìn)行訪問(wèn)。
采取這種做法的好處有:
1) 目錄塊連續(xù)存放,可以提高目錄區(qū)連續(xù)讀寫(xiě)操作的性能,因?yàn)樵谖募到y(tǒng)掛載時(shí),需要將所有目錄塊讀出,并在內(nèi)存中建立必要的數(shù)據(jù)結(jié)構(gòu);
2) 即使目錄區(qū)鏈表出現(xiàn)錯(cuò)誤,由于目錄在磁盤(pán)上位置固定,依然可以找到所有目錄塊;
這樣做法的問(wèn)題是,文件系統(tǒng)的靈活性降低,即當(dāng)文件數(shù)量很多,超過(guò)目錄區(qū)域的上限時(shí),系統(tǒng)便不能再創(chuàng)建新的文件??梢酝ㄟ^(guò)擴(kuò)大目錄區(qū)域的數(shù)量來(lái)解決該問(wèn)題。在實(shí)際中,創(chuàng)建 100,000個(gè)文件所需要的目錄塊區(qū)域僅僅占用10MB的空間。
同時(shí),為了進(jìn)一步提高文件系統(tǒng)的可靠性,對(duì)文件系統(tǒng)的目錄區(qū)也進(jìn)行了備份操作。即,在整個(gè)磁盤(pán)的末尾,存放了備份目錄區(qū)。這樣,當(dāng)主目錄區(qū)訪問(wèn)出錯(cuò)時(shí),可以直接訪問(wèn)備份目錄區(qū)。
最后,磁盤(pán)的其他部分都為數(shù)據(jù)區(qū)域。數(shù)據(jù)區(qū)域通過(guò)3個(gè)指針來(lái)管理,分別是指向數(shù)據(jù)區(qū)開(kāi)始位置的指針、指向數(shù)據(jù)區(qū)結(jié)束位置的指針和指向數(shù)據(jù)區(qū)當(dāng)前使用位置的指針。這種管理方式簡(jiǎn)單高效,避免了通常的采用位圖方式來(lái)管理磁盤(pán)塊的低效和不可靠。該方式管理磁盤(pán)塊的具體過(guò)程會(huì)在下文中描述,磁盤(pán)塊的結(jié)構(gòu),如圖3所示:
圖3 文件系統(tǒng)磁盤(pán)結(jié)構(gòu)
在VXWorks文件系統(tǒng)框架中,每個(gè)已掛載的塊設(shè)備由塊設(shè)備描述符來(lái)管理。塊設(shè)備描述符的第一個(gè)字段為一個(gè)DEV_HDR類型的結(jié)構(gòu)體,VXWorks的虛擬文件系統(tǒng)層通過(guò)該結(jié)構(gòu)體來(lái)實(shí)現(xiàn)對(duì)所有已掛載的塊設(shè)備的組織和管理。塊設(shè)備描述符的其余字段由各個(gè)文件系統(tǒng)的實(shí)現(xiàn)來(lái)定義。
塊設(shè)備描述符中記錄了管理一個(gè)磁盤(pán)塊需要的數(shù)據(jù)結(jié)構(gòu)或數(shù)據(jù)結(jié)構(gòu)的指針。我們?cè)O(shè)計(jì)的塊設(shè)備描述符,主要包括以下數(shù)據(jù)結(jié)構(gòu):
1) 指向下層磁盤(pán)塊設(shè)備描述符的指針,對(duì)于文件系統(tǒng)來(lái)說(shuō),該指針通常指向下層磁盤(pán)緩存設(shè)備的描述符;
2) 塊設(shè)備的互斥訪問(wèn)信號(hào)量,該信號(hào)量主要用來(lái)在掛載和卸載設(shè)備的時(shí)候?qū)υO(shè)備進(jìn)行互斥訪問(wèn);
3) 打開(kāi)文件的文件描述符數(shù)組和文件句柄數(shù)組,用來(lái)管理打開(kāi)的文件;
4) 文件互斥訪問(wèn)信號(hào)量數(shù)組;
5) 磁盤(pán)目錄區(qū)描述符,主要用來(lái)描述磁盤(pán)目錄區(qū)的使用情況;
6) 磁盤(pán)數(shù)據(jù)區(qū)描述符,主要用來(lái)描述磁盤(pán)數(shù)據(jù)區(qū)的使用情況;
7) 指向文件超級(jí)塊的指針,指向在掛載過(guò)程中讀入內(nèi)存的文件的超級(jí)塊結(jié)構(gòu)。
在接下來(lái)的幾小節(jié),詳細(xì)描述上面涉及到的幾個(gè)數(shù)據(jù)結(jié)構(gòu),以及對(duì)它們進(jìn)行的優(yōu)化。
目錄區(qū)描述符主要用來(lái)管理磁盤(pán)塊設(shè)備上目錄區(qū)的分配。它主要包括3個(gè)指針,分別表示目錄區(qū)起始?jí)K地址,目錄區(qū)終止塊地址,以及下一個(gè)空閑的目錄項(xiàng)編號(hào)(通過(guò)編號(hào),可以快速計(jì)算出下一個(gè)文件項(xiàng)所在磁盤(pán)上的位置)。
由于在一個(gè)文件系統(tǒng)中不能有重名的文件,因此在創(chuàng)建新的文件時(shí),必須確定新文件名不存在。如果每次在創(chuàng)建時(shí),都需要將新文件名與已存在的文件名一一比較,這種線性的比較方式會(huì)隨著文件數(shù)量的增多而使新文件創(chuàng)建的所花費(fèi)的時(shí)間越來(lái)越長(zhǎng)。同樣,對(duì)于打開(kāi)文件,刪除文件等操作,都需要我們能快速查找到文件。因此,要采用一種高效的方式在內(nèi)存中建立文件的索引。
采用動(dòng)態(tài)哈希表來(lái)存放所有的已創(chuàng)建的文件,并在哈希表項(xiàng)中建立了文件名到文件元數(shù)據(jù)所在磁盤(pán)位置的映射。之所以說(shuō)“動(dòng)態(tài)”,是因該哈希表的某個(gè)桶中的元素?cái)?shù)量超過(guò)一定值時(shí),哈希表會(huì)動(dòng)態(tài)擴(kuò)張,從而使所有的桶中的元素?cái)?shù)量處于一個(gè)門(mén)限之下。這樣,查找任何一個(gè)文件的時(shí)間,都不會(huì)隨著文件數(shù)量的增多而增長(zhǎng),且接近于常數(shù)時(shí)間。
數(shù)據(jù)區(qū)描述符用來(lái)管理磁盤(pán)上的數(shù)據(jù)區(qū)域的分配,它主要包括3個(gè)指針。第一個(gè)指針(BEGIN)指向數(shù)據(jù)區(qū)起始?jí)K,第二個(gè)指針(END)指向數(shù)據(jù)區(qū)終止塊,第三個(gè)指針(NEXT)指向下一個(gè)未被占用的磁盤(pán)塊。這樣,從BEGIN至NEXT-1的磁盤(pán)塊即為已用塊,而從NEXT至END的磁盤(pán)塊為空閑塊。
這種磁盤(pán)塊管理方式和文件系統(tǒng)采用的使用位圖來(lái)管理磁盤(pán)塊的方式有很大區(qū)別,主要有以下考慮:
1) 該文件系統(tǒng)主要的應(yīng)用是針對(duì)機(jī)載記錄設(shè)備,而記錄文件通常不需要執(zhí)行文件的刪除操作。實(shí)際上,在IRIG 106的標(biāo)準(zhǔn)中,并不支持刪除(DELETE)命令,因此,文件系統(tǒng)并不用處理在刪除文件時(shí)面臨的磁盤(pán)空間回收問(wèn)題。
2) 由于STANAG-4575標(biāo)準(zhǔn)規(guī)定了文件的數(shù)據(jù)必須連續(xù)存放,因此,系統(tǒng)采用在創(chuàng)建文件時(shí)一次性為文件分配空間的方法。若采用動(dòng)態(tài)分配方式,則無(wú)法很好處理多個(gè)文件同時(shí)打開(kāi)的情況。
由于VXWorks系統(tǒng)標(biāo)準(zhǔn)的創(chuàng)建文件(creat)的接口并不支持為文件預(yù)分配空間的操作。提供了一個(gè)新的函數(shù)creat64,可以上層應(yīng)用程序通過(guò)輸入?yún)?shù)指定為函數(shù)預(yù)留的空間大小。
同時(shí),還為應(yīng)用程序提供了其他輔助函數(shù),如getnfree64函數(shù),它用來(lái)返回某個(gè)文件剩余可用空間的字節(jié)數(shù)。上層可以通過(guò)調(diào)用該函數(shù)確定什么時(shí)候需要關(guān)閉文件并創(chuàng)建新文件來(lái)記錄數(shù)據(jù)。
文件描述符數(shù)組用來(lái)管理文件系統(tǒng)中打開(kāi)的文件。當(dāng)一個(gè)進(jìn)程打開(kāi)一個(gè)文件時(shí),文件系統(tǒng)就會(huì)為該進(jìn)程分配一個(gè)文件描述符。
文件描述符中主要存放了打開(kāi)文件的打開(kāi)模式(讀/寫(xiě)/讀寫(xiě)),文件讀寫(xiě)位置偏移等信息。各個(gè)進(jìn)程都通過(guò)文件描述符來(lái)對(duì)文件進(jìn)行讀寫(xiě)訪問(wèn)。
當(dāng)多個(gè)進(jìn)程同時(shí)打開(kāi)一個(gè)文件時(shí),它們可能同時(shí)對(duì)文件進(jìn)行修改,因此需要將文件的重要元數(shù)據(jù),如文件大小,只在內(nèi)存中存放一份,從而避免多個(gè)進(jìn)程同時(shí)修改不同元數(shù)據(jù)造成的不一致。
通過(guò)文件句柄來(lái)存放這類文件元數(shù)據(jù),當(dāng)多個(gè)進(jìn)程同時(shí)打開(kāi)同一個(gè)文件時(shí),系統(tǒng)會(huì)為每個(gè)進(jìn)程創(chuàng)建一個(gè)文件描述符,而讓多個(gè)文件描述符共享同一個(gè)文件句柄。同時(shí),為了保證互斥訪問(wèn),文件系統(tǒng)為該文件句柄提供了加鎖操作。即當(dāng)某個(gè)進(jìn)程需要對(duì)文件進(jìn)行讀寫(xiě)時(shí),首先會(huì)對(duì)該文件句柄加鎖,再訪問(wèn),最后解鎖的操作,避免多個(gè)進(jìn)程同時(shí)修改文件可能造成的混亂。
文件系統(tǒng)要解決斷電之后帶來(lái)的一致性的問(wèn)題。之前,已經(jīng)通過(guò)只在文件系統(tǒng)超級(jí)塊中存放靜態(tài)數(shù)據(jù),保證每次元數(shù)據(jù)的更新只會(huì)修改一個(gè)數(shù)據(jù)塊,解決了文件系統(tǒng)元數(shù)據(jù)可能的不一致問(wèn)題。
對(duì)于文件系統(tǒng)數(shù)據(jù)的不一致問(wèn)題,通過(guò)保證文件系統(tǒng)的元數(shù)據(jù)在文件系統(tǒng)數(shù)據(jù)之后,寫(xiě)入磁盤(pán)的方式來(lái)解決。具體做法是,對(duì)于一次文件的寫(xiě)入操作,首先將數(shù)據(jù)寫(xiě)入文件系統(tǒng)的磁盤(pán)緩存之中,之后,再更元數(shù)據(jù)。當(dāng)要將元數(shù)據(jù)寫(xiě)入緩存之前,首先,將該文件對(duì)應(yīng)的所有數(shù)據(jù)都寫(xiě)入磁盤(pán)。這樣,既可保證文件系統(tǒng)的數(shù)據(jù)在磁盤(pán)上是永遠(yuǎn)一致的。
當(dāng)然,這里面還有很多優(yōu)化的問(wèn)題。比如,應(yīng)該將數(shù)據(jù)積累到一定量再做一次寫(xiě)磁盤(pán)的操作,或者一定的時(shí)間進(jìn)行一次寫(xiě)磁盤(pán)的操作,從而保證系統(tǒng)的記錄性能。
將自己實(shí)現(xiàn)的STANAG-4575文件系統(tǒng)和VXWorks本地的dosFs文件系統(tǒng)進(jìn)行了一系列測(cè)試,來(lái)對(duì)比它們之間的性能,測(cè)試環(huán)境,如表1所示:
表1 測(cè)試環(huán)境
記錄文件系統(tǒng)最常用的方式即為單線程寫(xiě)單文件測(cè)試。測(cè)試讓一個(gè)線程以不同的塊大小來(lái)寫(xiě)一個(gè)4G大文件,測(cè)試結(jié)果,如圖4所示:
圖4 單線程寫(xiě)文件性能測(cè)試
從測(cè)試中可以看出,實(shí)現(xiàn)的STANAG-4575文件系統(tǒng)的寫(xiě)入性能要高于VXWorks本地的dosFs文件系統(tǒng)。主要原因主要有:
1) STANAG-4575中文件數(shù)據(jù)連續(xù)存放,可以提供更快的寫(xiě)入性能;
2) dosFs在寫(xiě)操作時(shí)可能伴隨著文件空間的分配等操作,而這些操作會(huì)影響文件的寫(xiě)入性能。而STANAG-4575文件數(shù)據(jù)塊一次分配,減少了之后動(dòng)態(tài)分配帶來(lái)的性能下降。
在真實(shí)的環(huán)境中,記錄設(shè)備會(huì)采用多個(gè)線程,用來(lái)記錄從不同的通道傳來(lái)的數(shù)據(jù),因此,需要對(duì)多線程寫(xiě)文件的性能進(jìn)行測(cè)試。測(cè)試采用10個(gè)線程,每個(gè)線程寫(xiě)入4G的文件。測(cè)試結(jié)果,如圖5所示:
圖5 多線程寫(xiě)文件性能測(cè)試
從測(cè)試中可以看出,實(shí)現(xiàn)的 STANAG-4575文件系統(tǒng)在多線程寫(xiě)文件的情況下,性能也是要高于VXWorks本地文件系統(tǒng)的。該情況,原因與單線程寫(xiě)文件時(shí)的情況類似,只是由于線程切換的開(kāi)銷,導(dǎo)致兩種情況下文件系統(tǒng)的性能都要低于單線程寫(xiě)文件的性能。
本文主要介紹了一種 IRIG 106下層文件系統(tǒng)STANAG-4575的實(shí)現(xiàn)方法。通過(guò)以下途徑實(shí)現(xiàn):
1) 對(duì)文件系統(tǒng)的元數(shù)據(jù)進(jìn)行校驗(yàn)和備份的方式實(shí)現(xiàn)文件系統(tǒng)的可靠性;
2) 通過(guò)在內(nèi)存中建立哈希表等方式實(shí)現(xiàn)文件系統(tǒng)的高性能;
3) 通過(guò)對(duì)標(biāo)準(zhǔn)定義的磁盤(pán)結(jié)構(gòu)的靈活變通,進(jìn)一步優(yōu)化了文件系統(tǒng)的寫(xiě)入性能。
4) 通過(guò)控制元數(shù)據(jù)和數(shù)據(jù)的寫(xiě)入方式來(lái)保證數(shù)據(jù)在磁盤(pán)上的一致性。
在下一步的工作中,可能會(huì)重新設(shè)計(jì)并實(shí)現(xiàn) VXWorks文件系統(tǒng)下層的磁盤(pán)緩存,以使它可以更加符合應(yīng)用的需求。我們還會(huì)參考其他文件系統(tǒng)的做法,采用日志的方式來(lái)進(jìn)一步提高文件系統(tǒng)的可靠性。
[1]Jeff Bonwick, Matt Ahrens, Val Henson, Mark Maybee,Mark Shellenbaum, [M]”The Zettabyte File System”.2002.
[2]Marshall Kirk McKusick, William N.Joy, Samuel J.Leffler, Robert S.Fabry, ” [M]A Fast File System for Unix”.
[3]T.J.Kowalski and Marshall K. McKusick. Fsck-the UNIX file system check program.Technical report, [C]Bell Laboratories, March 1978.
[4]Lihua Yu, Gang Chen, Wei Wang, Jinxiang Dong.MSFSS: A Storage System for Mass Small Files. in Proceedings of the 11th International Conference [C]on Computer Supported Cooperative Work in Design,2007.
[5]Larry W.McVoy and Steve R.Kleiman. Extent-like performance from a UNIX file system. [C]In Proceedings of the 1991 USENIX Winter Technical Conference,1991
[6]R.J.T.Morris, B.J.Truskowski.The evolution of storage. [J]IBM SYSTEMS JOURNAL,VOL42, NO2, 2003.
[7]MENDEL ROSENBLUM,JOHN K. OUSTERHOUTLFS.The Designand Implementation of a Log-Structured File System. [J]ACM Transactions on Computer Systems,Vol 10, No. 1, February 1992, Pages 26-52.
[8]Vilayannur,M. Kandemir,M; Sivasubramaniam, A Kernel-level caching for optimizing I/O by exploiting inter-applicationdata sharing. [M]Cluster Computeing,2002.
[9][C]VXWorks Programmer’s Guide 5.5
[10][C]Dominic Giampaolo “Practical File System Design with the Be File System”