專利名稱:自動(dòng)壓縮/解壓縮文件系統(tǒng)及其壓縮算法的制作方法
技術(shù)領(lǐng)域:
自動(dòng)壓縮/解壓縮文件系統(tǒng)及其壓縮算法屬于具有自動(dòng)壓縮/解壓縮功能的文件系統(tǒng)領(lǐng)域,尤其涉及嵌入式操作系統(tǒng)使用的文件系統(tǒng)領(lǐng)域。
過去,由于受硬件等條件的限制,很多軟硬件系統(tǒng)中(如基于單片機(jī)等的控制系統(tǒng))都沒有操作系統(tǒng),或者僅有一個(gè)操作系統(tǒng)的內(nèi)核,而根本沒有文件系統(tǒng)。然而,隨著微處理器的性能不斷提高,存儲器的價(jià)格不斷下降,使得類pc的掌上型嵌入式設(shè)備迅猛發(fā)展起來,并且已經(jīng)出現(xiàn)了向膝上型和桌面系統(tǒng)看齊的趨勢。這種趨勢對嵌入式操作系統(tǒng)提出了更高的要求,同時(shí)也使得文件系統(tǒng)的加入的要求日益迫切。但是,嵌入式系統(tǒng)一般體積較小,系統(tǒng)程序、應(yīng)用程序通常裝在FLASH或ROM中,無存儲量大的硬盤等設(shè)備。而FLASH或ROM等存儲介質(zhì)的價(jià)格相對于在桌面系統(tǒng)中廣泛使用的硬盤、光盤等來說是非常昂貴的。因此,簡單的將桌面系統(tǒng)中的大型文件系統(tǒng)照搬入嵌入式設(shè)備中使用是不可行的。而針對嵌入式系統(tǒng)的特點(diǎn),應(yīng)當(dāng)研發(fā)一種新型的文件系統(tǒng)或?qū)ψ烂嫖募到y(tǒng)進(jìn)行改造和裁減,以便適合嵌入式設(shè)備的使用。在這兩種做法當(dāng)中,“數(shù)據(jù)壓縮”技術(shù)都將起著舉足輕重的作用。它能夠大幅度提高嵌入式設(shè)備資源,特別是存儲資源的利用率,從而極大的改善其性能。這不僅具有理論意義,而且具有非常大的應(yīng)用價(jià)值并且能帶來可觀的經(jīng)濟(jì)效益,從而能夠推動(dòng)嵌入式設(shè)備的進(jìn)一步發(fā)展。
本發(fā)明所提出的自動(dòng)壓縮/解壓縮文件系統(tǒng),其特征在于它是在普通文件系統(tǒng)和用于存儲經(jīng)過壓縮的數(shù)據(jù)的物理存儲器之間加入了一個(gè)整合到物理存儲器的硬件當(dāng)中的磁盤存儲塊抽象層,所述磁盤存儲塊抽象層是一個(gè)把普通文件系統(tǒng)與壓縮過的磁盤數(shù)據(jù)相隔開,并通過修改該磁盤存儲塊抽象層去支持多種文件系統(tǒng)的模塊,它依次含有1)虛擬磁盤邏輯數(shù)據(jù)塊存儲空間,即虛塊空間它是為磁盤存儲塊抽象層向上層文件系統(tǒng)提供接口的一段連續(xù)的邏輯數(shù)據(jù)塊存儲區(qū)域,即下標(biāo)為虛擬邏輯塊號的一個(gè)數(shù)組,其內(nèi)容是一個(gè)指向物理存儲地點(diǎn)的指針;2)日志結(jié)構(gòu)物理存儲數(shù)據(jù)塊映射層它是日志結(jié)構(gòu)的算法負(fù)責(zé)上述虛塊空間向磁盤物理數(shù)據(jù)塊映射,即供上層文件系統(tǒng)把數(shù)據(jù)從虛塊空間通過該映射層寫入或從磁盤讀出;3)數(shù)據(jù)壓縮/解壓縮層它用于存放經(jīng)過LZW算法壓縮的數(shù)據(jù)。
上述虛塊空間帶一個(gè)含有邏輯數(shù)據(jù)塊號的32位的指針,當(dāng)該指針指向物理存儲地點(diǎn)的同時(shí),上述虛塊空間就替磁盤存儲塊抽象層向上層文件系統(tǒng)提供以下接口1)申請保留快它是一種為上層文件系統(tǒng)保留一段虛塊空間以便今后使用的函數(shù);2)申請釋放塊它是一種為上層文件系統(tǒng)釋放一段虛塊空間以便今后提供給其他文件系統(tǒng)使用的函數(shù);3)讀取塊它是一種把上層文件系統(tǒng)需要訪問的數(shù)據(jù)塊的內(nèi)容寫入指定緩沖區(qū)的函數(shù);4)寫入塊它是一種把上層文件系統(tǒng)需要提供的由上述緩沖區(qū)指定的數(shù)據(jù)塊的內(nèi)容寫入指定虛擬塊的函數(shù);5)刪除塊在上層文件系統(tǒng)確認(rèn)虛擬塊中的數(shù)據(jù)失效而要求執(zhí)行刪除文件操作時(shí),調(diào)用它來通知磁盤存儲塊抽象層。
上述日志結(jié)構(gòu)物理存儲數(shù)據(jù)塊映射層是一個(gè)內(nèi)容為連續(xù)的壓縮數(shù)據(jù)塊存儲區(qū)域的邏輯回收段;所述壓縮數(shù)據(jù)塊是對上述邏輯數(shù)據(jù)塊以一定的壓縮比進(jìn)行壓縮處理理后形成的一個(gè)數(shù)據(jù)單元,所述邏輯回收段再以一定的壓縮比進(jìn)行壓縮處理后形成物理磁盤上存儲已壓縮數(shù)據(jù)的物理回收段;上述邏輯數(shù)據(jù)塊的塊號和壓縮數(shù)據(jù)塊的塊號、邏輯回收段的地址依次構(gòu)成了虛塊空間的32位空間指針的數(shù)據(jù)結(jié)構(gòu)。
上述數(shù)據(jù)壓縮/解壓縮層是對上述日志結(jié)構(gòu)物理存儲數(shù)據(jù)塊映射層傳來的數(shù)據(jù)進(jìn)行壓縮存儲的物理磁盤,它依次由空間管理塊和連續(xù)的物理回收塊存儲區(qū)域組成,其中,所述物理回收塊和上述邏輯回收塊的對應(yīng)關(guān)系由上述32位空間指針決定;所述空間管理塊含有1)空閑壓縮數(shù)據(jù)塊映射表表內(nèi)每一個(gè)比特的二進(jìn)制碼對應(yīng)一個(gè)壓縮數(shù)據(jù)塊的空閑情況,并以空閑壓縮數(shù)據(jù)塊數(shù)是否大于設(shè)定的閥值來確定是否回收該段;2)空閑邏輯數(shù)據(jù)塊映射表一個(gè)邏輯回收段內(nèi)的每一個(gè)壓縮數(shù)據(jù)塊對應(yīng)一個(gè)2字節(jié)數(shù)組,一個(gè)2字節(jié)數(shù)組內(nèi)的每個(gè)比特用二進(jìn)制碼對應(yīng)一個(gè)壓縮數(shù)據(jù)塊內(nèi)的一個(gè)邏輯數(shù)據(jù)塊的空閑情況,以一個(gè)壓縮數(shù)據(jù)塊內(nèi)的邏輯數(shù)據(jù)塊的空閑數(shù)是否大于設(shè)定的閥值來確定是否應(yīng)在空閑壓縮數(shù)據(jù)塊映射表中進(jìn)行標(biāo)記;3)壓縮數(shù)據(jù)塊地址索引表它由數(shù)量上和邏輯回收段內(nèi)的壓縮數(shù)據(jù)塊數(shù)相同的數(shù)組組成,每一個(gè)數(shù)組對應(yīng)一個(gè)壓縮數(shù)據(jù)塊;為了優(yōu)化數(shù)據(jù)的讀寫,每一個(gè)壓縮后的壓縮數(shù)據(jù)塊起始地址是包含在每個(gè)壓縮數(shù)據(jù)中的邏輯數(shù)據(jù)塊數(shù)的n/2倍,n為大于1的整數(shù),從而使得前后兩個(gè)壓縮數(shù)據(jù)塊起始地址之差等于該壓縮數(shù)據(jù)塊的長度。
根據(jù)上述自動(dòng)壓縮/解壓縮文件系統(tǒng)所設(shè)計(jì)的壓縮算法,其特征在于它是一種動(dòng)態(tài)字典壓縮算法,每個(gè)新字符由字典中的兩個(gè)已有的字符創(chuàng)建;在做壓縮算法時(shí),上述兩個(gè)已有的字符都是依次輸入的字符中屬于最長匹配的字符串,如果由它們兩個(gè)組建的新字符不在字典中,則把新字符加入字典,否則就再次判斷是否有第二個(gè)最長匹配字符出現(xiàn),如有,重復(fù)以上判斷過程,一直到不再有字符輸入為止;在做解壓縮算法時(shí),如果得到的新字符不在字典中,就輸出新字符,否則,就再次判斷兩個(gè)已有的字符輸入,重復(fù)以上過程。
試驗(yàn)證明,采用本發(fā)明所提出的自動(dòng)壓縮/解壓縮文件系統(tǒng)及其壓縮算法達(dá)到了預(yù)期的目的。
本發(fā)明的壓縮文件系統(tǒng)是基于日志文件系統(tǒng)的。磁盤存儲塊抽象層是在本發(fā)明中提出的一個(gè)新的技術(shù),也是本發(fā)明的重點(diǎn)部分。這一部分分為三層,參見
圖1磁盤存儲塊抽象層(①)、日志結(jié)構(gòu)物理存儲數(shù)據(jù)塊映射層(②)、數(shù)據(jù)壓縮/解壓縮層(③)。
磁盤存儲塊抽象層是在普通文件系統(tǒng)和物理存儲器之間加入的一個(gè)新的模塊,如圖1所示。它為上層的普通文件系統(tǒng)提供一個(gè)虛擬磁盤邏輯數(shù)據(jù)塊存儲空間(虛塊空間),如圖2所示。一個(gè)邏輯數(shù)據(jù)塊是上層文件系統(tǒng)的最小存儲單元,一般是1kB、2kB、4kB或者更多,圖2中以1kB為例。從圖中可以看到,虛塊空間是一段連續(xù)的邏輯數(shù)據(jù)塊存儲區(qū)域,這個(gè)區(qū)域根據(jù)上層文件系統(tǒng)的對邏輯塊大小的要求進(jìn)行劃分,并給出編號。日志結(jié)構(gòu)物理存儲數(shù)據(jù)塊映射層則負(fù)責(zé)邏輯塊向磁盤物理數(shù)據(jù)塊的映射。映射使用日志結(jié)構(gòu)的算法。于是上層文件系統(tǒng)就可以將數(shù)據(jù)從虛塊空間通過映射層寫入磁盤,或者從磁盤讀出。數(shù)據(jù)的寫入或讀出都還要經(jīng)過壓縮層的處理。真正存放在磁盤上的數(shù)據(jù)是經(jīng)過壓縮的數(shù)據(jù)。
由于上層的文件系統(tǒng)只是通過虛塊空間接口進(jìn)行物理磁盤數(shù)據(jù)訪問,因此,磁盤存儲塊抽象層的使用,使上層文件系統(tǒng)和下層數(shù)據(jù)存儲方式完全隔離。這使得設(shè)計(jì)重點(diǎn)可以放在使用日志結(jié)構(gòu)并具有數(shù)據(jù)壓縮存儲功能的磁盤存儲塊抽象層,而上層的文件系統(tǒng)可以使用任何現(xiàn)有的文件系統(tǒng),這樣就可以得到一個(gè)自動(dòng)壓縮/解壓縮的文件系統(tǒng)了。而且,多個(gè)文件系統(tǒng)的實(shí)例可以共存于一個(gè)磁盤存儲塊抽象層之上,于是,在無需修改任何代碼的情況下就都可以獲得日志結(jié)構(gòu)和數(shù)據(jù)壓縮存儲所帶來的益處。由于該層與上層文件系統(tǒng)的無關(guān)性使得我們可以更進(jìn)一步,將這一層設(shè)計(jì)整合到物理存儲器的硬件當(dāng)中,從而大大提高系統(tǒng)性能。
下面以一臺安裝有Linux操作系統(tǒng)(文件系統(tǒng)為Ext2文件系統(tǒng))的計(jì)算機(jī)為例,結(jié)合附圖予以說明。
具體的物理存儲硬件是指計(jì)算機(jī)上所安裝的硬盤(或者軟盤、USB閃盤、RAM盤等等)。
1.虛擬磁盤邏輯數(shù)據(jù)塊存儲空間的實(shí)現(xiàn)(①),其內(nèi)部結(jié)構(gòu)如圖2所示我們采用一個(gè)數(shù)組來實(shí)現(xiàn)虛塊空間。數(shù)組的下標(biāo)就是虛擬邏輯塊(①)號,其內(nèi)容是一個(gè)32位的指針,指向物理存儲地點(diǎn)(具體的指針數(shù)據(jù)結(jié)構(gòu)詳情見后)。同時(shí),抽象層向上層文件系統(tǒng)提供以下接口1)申請保留塊int blk_reserve(int start_blk,int num_blk)該函數(shù)可以為上層文件系統(tǒng)保留一段虛塊空間以便以后使用。第一個(gè)參數(shù)start_blk為起始塊號,第二個(gè)參數(shù)為塊數(shù)。函數(shù)返回實(shí)際保留的塊數(shù)。
2)申請釋放塊int blk_free(int start_blk,int num_blk)該函數(shù)可以為上層文件系統(tǒng)釋放一段虛塊空間以便其他文件系統(tǒng)使用。第一個(gè)參數(shù)start_blk為起始塊號,第二個(gè)參數(shù)為塊數(shù)。函數(shù)返回實(shí)際釋放的塊數(shù)。
3)讀取塊int blk_read(int start_blk,int num_blk,char*buf)該函數(shù)將上層文件需要訪問的數(shù)據(jù)塊的內(nèi)容寫入指定的緩沖區(qū)buf。函數(shù)返回實(shí)際讀取的塊數(shù)。
4)寫入塊int blk_write(int start_blk,int num_blk,char*buf)該函數(shù)將上層文件需要保存的數(shù)據(jù)塊的內(nèi)容(由buf指定)寫入指定的虛擬塊。函數(shù)返回實(shí)際寫入的塊數(shù)。
5)刪除塊int blk_delete(int start_blk,int num_blk)上層文件系統(tǒng)在確認(rèn)虛擬塊中的數(shù)據(jù)失效的時(shí)候,例如刪除文件操作,應(yīng)該調(diào)用該接口來通知抽象層,以便物理存儲塊的回收能夠更高效的進(jìn)行。
實(shí)現(xiàn)虛塊空間的數(shù)組存儲在.blockmap文件中。選擇使用文件存儲虛塊空間映射表是為了貫徹日志的思想。由于這個(gè)索引表是系統(tǒng)在數(shù)據(jù)訪問的時(shí)候要經(jīng)常查詢和修改的,因此,如果放在一個(gè)固定的物理扇區(qū)段內(nèi)就會在系統(tǒng)訪問數(shù)據(jù)時(shí)帶來多余的磁頭機(jī)械運(yùn)動(dòng),這就違背了日志結(jié)構(gòu)的設(shè)計(jì)初衷了。我們將這個(gè)表實(shí)現(xiàn)為一個(gè)文件,它的信息節(jié)點(diǎn)保存在抽象層的超級塊中,而其內(nèi)容則隨數(shù)據(jù)一起寫入日志,但是不進(jìn)行壓縮存儲,以避免增加系統(tǒng)負(fù)荷。
2.日志結(jié)構(gòu)物理存儲數(shù)據(jù)塊映射層的實(shí)現(xiàn)(②),參見圖4日志結(jié)構(gòu)存儲是我們設(shè)計(jì)中一直貫徹的思想。
首先需要確定的是回收段的大小。綜合考察回收的效率和磁盤數(shù)據(jù)塊的使用靈活性,一個(gè)回收段的大小為512kB較為適宜。這里的回收段是物理磁盤上的,我們稱之為物理回收段(①)。物理回收段是經(jīng)過壓縮處理之后的。我們根據(jù)這個(gè)大小確定映射層的對應(yīng)段,稱之為邏輯回收段(②)的大小為2MB。這是為了使得一個(gè)邏輯回收段經(jīng)過壓縮之后能夠大于物理回收段的大小,否則就會由于段的結(jié)束而有一定的物理存儲空間被浪費(fèi)了。
為了得到較高的壓縮比,我們以16kB為一個(gè)數(shù)據(jù)單元(壓縮數(shù)據(jù)塊(③))進(jìn)行壓縮處理。因此,一個(gè)邏輯回收段中包含128個(gè)壓縮數(shù)據(jù)塊。由于上層文件系統(tǒng)的邏輯數(shù)據(jù)塊大小為1kB,所以每個(gè)壓縮數(shù)據(jù)塊中包含16個(gè)邏輯數(shù)據(jù)塊。
于是,我們可以得到虛塊空間的32位指針的數(shù)據(jù)結(jié)構(gòu),如圖3所示。
3.數(shù)據(jù)壓縮/解壓縮層的實(shí)現(xiàn)(③),這一層是真正的物理存儲層,它將日志層傳來的數(shù)據(jù)進(jìn)行壓縮存儲。物理回收塊與邏輯回收塊的對應(yīng)關(guān)系如圖4所示。為了優(yōu)化數(shù)據(jù)的讀寫,每一個(gè)壓縮后的壓縮數(shù)據(jù)塊起始地址是8的整數(shù)倍。于是,只需要16位就可以表示壓縮數(shù)據(jù)塊的地址了。
其中空間管理塊是記錄各個(gè)壓縮數(shù)據(jù)塊的起始地址以及該回收段內(nèi)空間使用的情況。它的結(jié)構(gòu)如圖5所示。除空間管理塊以外的都是數(shù)據(jù)塊(圖中未標(biāo)注)以下對各數(shù)據(jù)段進(jìn)行詳細(xì)的說明。
1)空閑壓縮數(shù)據(jù)塊映射表(①)表內(nèi)的每一個(gè)比特對應(yīng)一個(gè)壓縮數(shù)據(jù)塊的空閑情況。‘1’表示占用,‘0’表示空閑??臻g回收進(jìn)程依靠這個(gè)表所表示的信息來判斷是否要進(jìn)行回收。當(dāng)空閑塊數(shù)量大于一個(gè)閥值時(shí),需要回收該段。
2)空閑邏輯數(shù)據(jù)塊映射表(②)該表是由128個(gè)2字節(jié)數(shù)組組成。每一個(gè)數(shù)組元素對應(yīng)一個(gè)段內(nèi)的壓縮數(shù)據(jù)塊。每個(gè)數(shù)組元素由16比特組成,每個(gè)比特對應(yīng)一個(gè)壓縮數(shù)據(jù)塊內(nèi)的一個(gè)邏輯數(shù)據(jù)塊的空閑情況?!?’表示占用,‘0’表示空閑。當(dāng)上層文件系統(tǒng)對某一個(gè)邏輯數(shù)據(jù)塊進(jìn)行了更新,或者調(diào)用了blk_delete刪除了該塊,都會在這里進(jìn)行記錄。當(dāng)記錄進(jìn)程發(fā)現(xiàn)該壓縮數(shù)據(jù)塊內(nèi)部的邏輯數(shù)據(jù)塊的空閑數(shù)量大于某一個(gè)閥值的時(shí)候,就會在空閑壓縮數(shù)據(jù)塊映射表中進(jìn)行標(biāo)記。
3)壓縮數(shù)據(jù)塊地址索引表(③)這個(gè)表該表是由128個(gè)2字節(jié)數(shù)組組成。每一個(gè)數(shù)組元素對應(yīng)一個(gè)段內(nèi)的壓縮數(shù)據(jù)塊。數(shù)組元素的值與8相乘便得到了對應(yīng)壓縮數(shù)據(jù)塊的起始地址偏移量。這個(gè)偏移量是相對于數(shù)據(jù)塊的起始地址的偏移。前后兩個(gè)壓縮數(shù)據(jù)塊起始地址之差就是數(shù)據(jù)塊的長度。
4)下一空閑段指針(④)物理回收段在磁盤上是一個(gè)大的鏈表,這個(gè)數(shù)據(jù)段就是指向下一個(gè)空閑回收段的指針。它的長度是32比特?;厥者M(jìn)程負(fù)責(zé)維護(hù)和更新這一個(gè)數(shù)據(jù)段。
4.壓縮算法的實(shí)現(xiàn)算法采用動(dòng)態(tài)字典壓縮,新字由字典中兩個(gè)已有的字創(chuàng)建。具體描述如圖6。由流程圖可以看出,算法充分利用了字典中已有的編碼。在常用字符串出現(xiàn)很少的情況下就可將其加入字典。解壓縮算法如圖7。
實(shí)際的文件系統(tǒng)中包括大量不同格式的文件,這些文件大小不一,相應(yīng)的壓縮算法無法對它們保持統(tǒng)一的壓縮率。為了能夠?qū)嚎s率控制在50%的水平,壓縮算法在實(shí)現(xiàn)的時(shí)候向上層提供了可配置接口,即文件系統(tǒng)調(diào)用壓縮算法時(shí),可以指定編碼位數(shù)。這樣壓縮比較大的文件的時(shí)候就可以采用較長的編碼,從而避免了字典溢出的情況。同時(shí)由于編碼位數(shù)不是8的倍數(shù),即編碼不可能存儲于整數(shù)字節(jié)中,我們利用了兩個(gè)buffer來做緩沖輸入輸出數(shù)據(jù)。我們以編碼長度為12為例,具體的函數(shù)及其功能描述如下1)input_code(char*input)input中存放著需要解壓的數(shù)據(jù)塊,數(shù)據(jù)塊中的基本壓縮編碼長度為12位,所以函數(shù)需要將字節(jié)轉(zhuǎn)化為12位有效數(shù)據(jù)輸出。輸入緩沖為一32位的存儲單元,初始時(shí),從input數(shù)據(jù)塊中讀入四個(gè)字節(jié),然后將頭部12位數(shù)據(jù)移入臨時(shí)存儲單元,返回此臨時(shí)存儲單元中的數(shù)據(jù)。以后每次調(diào)用此函數(shù)時(shí),都要測試緩沖區(qū)中有效數(shù)據(jù)的位數(shù),如果小于24,則需從input中讀入新的數(shù)據(jù),直至其有效數(shù)據(jù)長度大于24。這樣就實(shí)現(xiàn)了輸入的8位數(shù)據(jù)到12位數(shù)據(jù)的轉(zhuǎn)化。
2)output_code(char*output,unsigned int code)函數(shù)將壓縮過后的編碼輸出到output數(shù)據(jù)塊中。編碼長度為12位,而output的基本單位為字節(jié)。所以此函數(shù)與input_code實(shí)現(xiàn)的功能相反,它將12位編碼轉(zhuǎn)換為8位字節(jié)數(shù)據(jù)輸出。算法中同樣采用了一32位的緩沖區(qū),首先將此緩沖區(qū)填充使其有效數(shù)據(jù)長度大于20位。然后從緩沖區(qū)頭開始輸出8位數(shù)據(jù),直至有效數(shù)據(jù)長度小于8為止。以后新的編碼數(shù)據(jù)來的時(shí)候會先使有效數(shù)據(jù)長度達(dá)到20位以上后,再輸出數(shù)據(jù)。最后的緩沖區(qū)中的數(shù)據(jù)需要額外的調(diào)用此函數(shù),將其輸出。
3)find_match(int hash_prefix,unsigned int hash_character)輸入為一編碼字符和一普通字符(其值小于256)。函數(shù)主要是在哈希表中查找字符串hash_prefix+hash_character是否在字典中。哈希函數(shù)采用hash_prefix右移4位然后與hash_character與或。通過函數(shù)操作后得到的值在相應(yīng)的哈希鏈表中順序查找字符串是否在字典中。如果有則返回在表中的索引值,如果沒有則返回表中最后一個(gè)節(jié)點(diǎn)索引值。此函數(shù)只能測試一個(gè)字典編碼+一個(gè)普通字符所構(gòu)成的新字是否在字典中。
4)longest_match(int hash_prefix,unsigned int hash_character)函數(shù)將輸出最長匹配字符串編碼。首先利用find_match()函數(shù)查找到一個(gè)最長字符串A,然后再利用find_match()查找下一個(gè)最長匹配字符串B,測試A+B是否在字典中,如果是則將其值置入A中,重復(fù)上述過程,直至A+B不在字典中,返回A。由于新字的構(gòu)成由兩個(gè)新字構(gòu)成,所以存在一個(gè)遞規(guī)過程來查找最長匹配字符串。
5)add_dictionary_item(int prefix,int sufix,int index)函數(shù)將prefix+sufix加入字典中。
6)char*decode_stnng(unsigned char*buffer,unsigned int code)Code為解壓縮塊中的某個(gè)字符,函數(shù)將其對應(yīng)的字符串解壓到buffer中。函數(shù)采用堆棧存儲解壓縮字符。初始化時(shí)將code壓入堆棧,然后循環(huán)做如下步驟查找堆棧頂端字符的解碼,如果它是一個(gè)字符則將其彈出,并壓入buffer中,如果是一壓縮編碼,則在字典中查找其對應(yīng)的兩個(gè)字符,彈出堆棧頂端字符,將兩個(gè)字符壓入堆棧。重復(fù)上述過程,直至堆棧為空,此時(shí)buffer中存儲的字符串即為code的解碼。
7)compress(char*input,int*size,char*output)輸入為待壓縮數(shù)據(jù)塊和其大小(字節(jié)數(shù)),輸出為壓縮數(shù)據(jù)塊,同時(shí)在size中返回壓縮好的數(shù)據(jù)塊的大小。函數(shù)利用longest_match()查找到最長匹配字符串,同時(shí)函數(shù)返回了一個(gè)未匹配字符串(也是字典中的字),調(diào)用函數(shù)output_code()輸出壓縮字符串,同時(shí)將longest_match()返回的兩個(gè)字加入到新的字典中。函數(shù)最后輸出編碼最大值(4k-1)以標(biāo)志壓縮數(shù)據(jù)塊的尾部。
8)expand(char*input,int*size,char*output)輸入為待解壓數(shù)據(jù)塊和大小,輸出為解壓數(shù)據(jù)塊,同時(shí)在size中返回解壓縮好的數(shù)據(jù)塊的大小。首先調(diào)用input_code()得到壓縮編碼,然后調(diào)用decode_string()輸出解碼,同時(shí)將此壓縮編碼和前一個(gè)壓縮編碼壓入字典中。
圖8、圖9和圖10分別為讀寫操作流程框圖、創(chuàng)建自動(dòng)壓縮/解壓縮磁盤分區(qū)操作流程圖、刪除自動(dòng)壓縮/解壓縮磁盤分區(qū)操作流程圖。圖中已示出了明確的操作步驟,不再敘述。
本發(fā)明大幅度提高嵌入式設(shè)備資源,特別是存儲資源的利用率,從而極大的改善其性能,不僅具有理論意義,而且具有非常大的應(yīng)用價(jià)值并且能帶來可觀的經(jīng)濟(jì)效益。
權(quán)利要求
1.自動(dòng)壓縮/解壓縮文件系統(tǒng),其特征在于在普通文件系統(tǒng)和用于存儲經(jīng)過壓縮的數(shù)據(jù)的物理存儲器之間加入了一個(gè)整合到物理存儲器的硬件當(dāng)中的磁盤存儲塊抽象層,所述磁盤存儲塊抽象層是一個(gè)把普通文件系統(tǒng)與壓縮過的磁盤數(shù)據(jù)相隔開,并通過修改該磁盤存儲塊抽象層去支持多種文件系統(tǒng)的模塊,它依次含有1)虛擬磁盤邏輯數(shù)據(jù)塊存儲空間,即虛塊空間它是為磁盤存儲塊抽象層向上層文件系統(tǒng)提供接口的一段連續(xù)的邏輯數(shù)據(jù)塊存儲區(qū)域,即下標(biāo)為虛擬邏輯塊號的一個(gè)數(shù)組,其內(nèi)容是一個(gè)指向物理存儲地點(diǎn)的指針;2)日志結(jié)構(gòu)物理存儲數(shù)據(jù)塊映射層它是日志結(jié)構(gòu)的算法,負(fù)責(zé)上述虛塊空間向磁盤物理數(shù)據(jù)塊映射,即供上層文件系統(tǒng)把數(shù)據(jù)從虛塊空間通過該映射層寫入或從磁盤讀出;3)數(shù)據(jù)壓縮/解壓縮層它用于存放經(jīng)過LZW算法壓縮的數(shù)據(jù)。
2.如權(quán)利要求1所述的自動(dòng)壓縮/解壓縮文件系統(tǒng),其特征在于所述虛塊空間帶一個(gè)含有邏輯數(shù)據(jù)塊號的32位的指針,當(dāng)該指針指向物理存儲地點(diǎn)的同時(shí),上述虛塊空間就替磁盤存儲塊抽象層向上層文件系統(tǒng)提供以下接口1)申請保留快它是一種為上層文件系統(tǒng)保留一段虛塊空間以便今后使用的函數(shù);2)申請釋放塊它是一種為上層文件系統(tǒng)釋放一段虛塊空間以便今后提供給其他文件系統(tǒng)使用的函數(shù);3)讀取塊它是一種把上層文件系統(tǒng)需要訪問的數(shù)據(jù)塊的內(nèi)容寫入指定緩沖區(qū)的函數(shù);4)寫入塊它是一種把上層文件系統(tǒng)需要提供的由上述緩沖區(qū)指定的數(shù)據(jù)塊的內(nèi)容寫入指定虛擬塊的函數(shù);5)刪除塊在上層文件系統(tǒng)確認(rèn)虛擬塊中的數(shù)據(jù)失效而要求執(zhí)行刪除文件操作時(shí),調(diào)用它來通知磁盤存儲塊抽象層。
3.如權(quán)利要求1所述的自動(dòng)壓縮/解壓縮文件系統(tǒng),其特征在于所述的日志結(jié)構(gòu)物理存儲數(shù)據(jù)塊映射層是一個(gè)內(nèi)容為連續(xù)的壓縮數(shù)據(jù)塊存儲區(qū)域的邏輯回收段;所述壓縮數(shù)據(jù)塊是對上述邏輯數(shù)據(jù)塊以一定的壓縮比進(jìn)行壓縮處理后形成的一個(gè)數(shù)據(jù)單元,所述邏輯回收段再以一定的壓縮比進(jìn)行壓縮處理后形成物理磁盤上存儲已壓縮數(shù)據(jù)的物理回收段;上述邏輯數(shù)據(jù)塊的塊號和壓縮數(shù)據(jù)塊的塊號、邏輯回收段的地址依次構(gòu)成了虛塊空間的32位空間指針的數(shù)據(jù)結(jié)構(gòu)。
4.如權(quán)利要求1所述的自動(dòng)壓縮/解壓縮文件系統(tǒng),其特征在于所述的數(shù)據(jù)壓縮/解壓縮層是對上述日志結(jié)構(gòu)物理存儲數(shù)據(jù)塊映射層傳來的數(shù)據(jù)進(jìn)行壓縮存儲的物理磁盤,它依次由空間管理塊和連續(xù)的物理回收塊存儲區(qū)域組成,其中,所述物理回收塊和上述邏輯回收塊的對應(yīng)關(guān)系由上述32位空間指針決定;所述空間管理塊則含有1)空閑壓縮數(shù)據(jù)塊映射表表內(nèi)每一個(gè)比特的二進(jìn)制碼對應(yīng)一個(gè)壓縮數(shù)據(jù)塊的空閑情況,并以空閑壓縮數(shù)據(jù)塊數(shù)是否大于設(shè)定的閥值來確定是否回收該段;2)空閑邏輯數(shù)據(jù)塊映射表一個(gè)邏輯回收段內(nèi)的每一個(gè)壓縮數(shù)據(jù)塊對應(yīng)一個(gè)2字節(jié)數(shù)組,一個(gè)2字節(jié)數(shù)組內(nèi)的每個(gè)比特用二進(jìn)制碼對應(yīng)一個(gè)壓縮數(shù)據(jù)塊內(nèi)的一個(gè)邏輯數(shù)據(jù)塊的空閑情況,以一個(gè)壓縮數(shù)據(jù)塊內(nèi)的邏輯數(shù)據(jù)塊的空閑數(shù)是否大于設(shè)定的閥值來確定是否應(yīng)在空閑壓縮數(shù)據(jù)塊映射表中進(jìn)行標(biāo)記;3)壓縮數(shù)據(jù)塊地址索引表它由數(shù)量上和邏輯回收段內(nèi)的壓縮數(shù)據(jù)塊數(shù)相同的數(shù)組組成,每一個(gè)數(shù)組對應(yīng)一個(gè)壓縮數(shù)據(jù)塊;為了優(yōu)化數(shù)據(jù)的讀寫,每一個(gè)壓縮后的壓縮數(shù)據(jù)塊起始地址是包含在每個(gè)壓縮數(shù)據(jù)中的邏輯數(shù)據(jù)塊數(shù)的n/2倍,n為大于1的整數(shù),從而使得前后兩個(gè)壓縮數(shù)據(jù)塊起始地址之差等于該壓縮數(shù)據(jù)塊的長度。
5.根據(jù)權(quán)利要求1所述的自動(dòng)壓縮/解壓縮文件系統(tǒng)所設(shè)計(jì)的壓縮算法,其特征在于它是一種動(dòng)態(tài)字典壓縮算法,每個(gè)新字符由字典中的兩個(gè)已有的字符創(chuàng)建;在做壓縮算法時(shí),上述兩個(gè)已有的字符都是依次輸入的字符中屬于最長匹配的字符串,如果由它們兩個(gè)組建的新字符不在字典中,則把新字符加入字典,否則就再次判斷是否有第二個(gè)最長匹配字符出現(xiàn),如有,重復(fù)以上判斷過程,一直到不再有字符輸入為止;在做解壓縮算法時(shí),如果得到的新字符不在字典中,就輸出新字符,否則,就再次判斷兩個(gè)已有的字符輸入,重復(fù)以上過程。
全文摘要
自動(dòng)壓縮/解壓縮文件系統(tǒng)及其壓縮算法屬于具有自動(dòng)壓縮/解壓縮功能的文件系統(tǒng)領(lǐng)域,其特征是在普通文件系統(tǒng)和用于存儲經(jīng)過壓縮的數(shù)據(jù)的物理存儲器之間加入了一個(gè)整合到物理存儲器的硬件中的磁盤存儲塊抽象層,它是一個(gè)把普通文件系統(tǒng)與壓縮過的磁盤數(shù)據(jù)隔開,并通過修改磁盤存儲塊抽象層而支持多種文件系統(tǒng)的模塊,它依次含有虛擬磁盤邏輯數(shù)據(jù)塊存儲空間(虛塊空間)、日志結(jié)構(gòu)物理存儲數(shù)據(jù)塊映射層和數(shù)據(jù)壓縮/解壓縮層。本發(fā)明還提出了基于該系統(tǒng)的數(shù)據(jù)壓縮算法,它是每個(gè)新字符由字典中的兩個(gè)已有的字符創(chuàng)建。本發(fā)明尤其適用于嵌入式系統(tǒng),能夠大幅度提高嵌入式設(shè)備資源,特別是存儲資源的利用率,極大的改善其性能。
文檔編號G06F12/06GK1425986SQ0310060
公開日2003年6月25日 申請日期2003年1月17日 優(yōu)先權(quán)日2003年1月17日
發(fā)明者張躍, 甄成 申請人:清華大學(xué)