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