簡單說,文件系統(tǒng)就是實(shí)現(xiàn)數(shù)據(jù)“按名存取”。
文件系統(tǒng)屏蔽了底層硬件的處理細(xì)節(jié),使得用戶可以用“名字”訪問數(shù)據(jù)。文件系統(tǒng)可以分為以下5層:
用戶接口層:打開(創(chuàng)建)fopen、關(guān)閉fclose、讀fread、寫fwrite、定位fseek、文件屬性fattribute等。所有文件系統(tǒng),這個部分的接口都是相似的,方便用戶使用和應(yīng)用程序移植。對于用戶來說,文件系統(tǒng)就是給出“文件名”,得到對應(yīng)的數(shù)據(jù),至于數(shù)據(jù)放在哪,如何存放,如何處理,對用戶透明。此層只定義了接口形式卻沒有給出具體實(shí)現(xiàn)的規(guī)范,設(shè)計者在這一層的自由度最大,難點(diǎn)是如何處理多用戶并發(fā)操作,如何充分發(fā)揮所采用的文件數(shù)據(jù)結(jié)構(gòu)的優(yōu)點(diǎn),如何提高效率(緩沖操作,寫入時機(jī)),如何提供安全保障和恢復(fù)等。
文件數(shù)據(jù)結(jié)構(gòu)層(不是實(shí)際的層,而是包含在操作里的抽象數(shù)據(jù)結(jié)構(gòu)):FAT12/16/32、ext2、NTFS、JFFS等。不同數(shù)據(jù)結(jié)構(gòu)對安全性、存取效率、擴(kuò)展性等有不同影響,各有優(yōu)缺點(diǎn),請按需選用。
轉(zhuǎn)義層:有些物理介質(zhì)寫次數(shù)有限,反復(fù)向同一位置寫入會造成芯片整體壽命急劇縮短,通過轉(zhuǎn)義層使得實(shí)際寫入能在整個介質(zhì)上均勻操作,提高介質(zhì)壽命。若介質(zhì)沒有此特性,可以取消這一層。另外,有些安全性要求較高的系統(tǒng),可能會把同一個寫入數(shù)據(jù)存儲到多個介質(zhì)上,這也需要轉(zhuǎn)義層將寫命令翻譯成實(shí)際的操作。
物理接口層:ATA接口(IDE硬盤/CF卡)、SCSI、并行IO口PIO、USB、1394、網(wǎng)絡(luò)等。這一層一般有標(biāo)準(zhǔn)規(guī)范。
物理介質(zhì):硬盤、光盤、flash、網(wǎng)絡(luò)等。實(shí)際存儲數(shù)據(jù)的物理設(shè)備,各有特色,一般有標(biāo)準(zhǔn)規(guī)范。
綜上,實(shí)現(xiàn)文件系統(tǒng),就是提供給用戶fopen、fclose、fread、fwrite等API,使其能按名字存取位于任意介質(zhì)(fs over anyting)上的數(shù)據(jù),并保證多用戶并發(fā)訪問、高效率、高安全性、故障可恢復(fù)。
舉例:
fp=fopen("/tmp/yy.c",RW); //用讀寫模式打開/tmp/yy.c
fread(fp,&buf,100); //讀出100字節(jié)
buf[6]=‘y‘; //將第7字節(jié)改為字符‘y‘
fwrite(fp,&buf,100); //將改變的數(shù)據(jù)重新寫入
fclose(fp); //關(guān)閉文件
你只要在某個介質(zhì)(硬盤、CF卡等)上按某個數(shù)據(jù)結(jié)構(gòu)(FAT、ext3等)實(shí)現(xiàn)以上出現(xiàn)的API(fopen、fread、fwrite、fclose等),就可以認(rèn)為自己實(shí)現(xiàn)了文件系統(tǒng),若還能夠保證多用戶并發(fā)訪問、高效率、高安全性、故障可恢復(fù)當(dāng)然就更完美了。
文件系統(tǒng)是操作系統(tǒng)用于明確磁盤或分區(qū)上的文件的方法和數(shù)據(jù)結(jié)構(gòu);即在磁盤上組織文件的方法。也指用于存儲文件的磁盤或分區(qū),或文件系統(tǒng)種類。因此,可以說"我有2個文件系統(tǒng)"意思是他有2個分區(qū),一個存文件,或他用 "擴(kuò)展文件系統(tǒng)",意思是文件系統(tǒng)的種類。
磁盤或分區(qū)和它所包括的文件系統(tǒng)的不同是很重要的。少數(shù)程序(包括最有理由的產(chǎn)生文件系統(tǒng)的程序)直接對磁盤或分區(qū)的原始扇區(qū)進(jìn)行操作;這可能破壞一個存在的文件系統(tǒng)。大部分程序基于文件系統(tǒng)進(jìn)行操作,在不同種文件系統(tǒng)上不能工作。
一個分區(qū)或磁盤能作為文件系統(tǒng)使用前,需要初始化,并將記錄數(shù)據(jù)結(jié)構(gòu)寫到磁盤上。這個過程就叫建立文件系統(tǒng)。
大部分UNIX文件系統(tǒng)種類具有類似的通用結(jié)構(gòu),即使細(xì)節(jié)有些變化。其中心概念是超級塊superblock, i節(jié)點(diǎn)inode, 數(shù)據(jù)塊data block,目錄塊directory block, 和間接塊indirection block。超級塊包括文件系統(tǒng)的總體信息,比如大小(其準(zhǔn)確信息依賴文件系統(tǒng))。 i節(jié)點(diǎn)包括除了名字外的一個文件的所有信息,名字與i節(jié)點(diǎn)數(shù)目一起存在目錄中,目錄條目包括文件名和文件的i節(jié)點(diǎn)數(shù)目。 i節(jié)點(diǎn)包括幾個數(shù)據(jù)塊的數(shù)目,用于存儲文件的數(shù)據(jù)。 i節(jié)點(diǎn)中只有少量數(shù)據(jù)塊數(shù)的空間,如果需要更多,會動態(tài)分配指向數(shù)據(jù)塊的指針空間。這些動態(tài)分配的塊是間接塊;為了找到數(shù)據(jù)塊,這名字指出它必須先找到間接塊的號碼。
UNIX文件系統(tǒng)通常允許在文件中產(chǎn)生孔(hole) (用lseek ; 請看手冊), 意思是文件系統(tǒng)假裝文件中有一個特殊的位置只有0字節(jié),但沒有為這文件的這個位置保留實(shí)際的磁盤空間(這意味著這個文件將少用一些磁盤空間)。這對小的二進(jìn)制文件經(jīng)常發(fā)生,Linux共享庫、一些數(shù)據(jù)庫和其他一些特殊情況。 (孔由存儲在間接塊或i節(jié)點(diǎn)中的作為數(shù)據(jù)塊地址的一個特殊值實(shí)現(xiàn),這個特殊地址說明沒有為文件的這個部分分配數(shù)據(jù)塊,即,文件中有一個孔。)
孔有一定的用處。在筆者的系統(tǒng)中,一個簡單的測量工具顯示在200MB使用的磁盤空間中,由于孔,節(jié)約了大約4MB。在這個系統(tǒng)中,程序相對較少,沒有數(shù)據(jù)庫文件。有關(guān)這個測量工具的細(xì)節(jié)請看附錄 A.
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請
點(diǎn)擊舉報。