本文內(nèi)容

1 文件控制塊
??計算機中目錄像樹狀結(jié)構(gòu),一個目錄下既可以有目錄文件也可以有普通文件。這種目錄結(jié)構(gòu)使文件之間組織結(jié)構(gòu)清晰,易于查找。假設(shè)磁盤D的根目錄文件如下圖所示

??文件目錄表表示該文件下文件記錄,上圖中的一個表記錄表示一個文件,目錄文件本身也是一種有結(jié)構(gòu)文件,每條記錄記錄了該文件在外存中地址,當(dāng)我們雙擊打開一個目錄文件時,操作系統(tǒng)會根據(jù)文件名查詢目錄表找到要查詢的文件在外存中的位置,然后把該文件的目錄信息讀入內(nèi)存,于是該文件目錄中的內(nèi)容就顯示出來。如下圖表示打開“照片”目錄

??FCB的有序集合稱為“文件目錄”,一個FCB就是一個文件目錄項。
??FCB中包含了文件的基本信息(文件名、物理地址、邏輯結(jié)構(gòu)、物理結(jié)構(gòu)等),存取控制信息(是否可讀/可寫、禁止訪問的用戶名單等),使用信息(如文件建立時間、修改時間)。
??FCB中最重要、最基本的信息還是文件名、文件存放的物理地址。
??FCB實現(xiàn)了文件名和文件之間的映射。使用戶(用戶程序)可以實現(xiàn)“按名存取”。
??下面時一些對目錄的操作
搜索:當(dāng)用戶要使用一個文件時,系統(tǒng)要根據(jù)文件名搜索目錄,找到該文件對應(yīng)的目錄項。
創(chuàng)建文件:創(chuàng)建一個新的文件時,需要在器所屬的目錄中增加一個目錄項。
刪除文件:當(dāng)刪除一個文件時,需要在目錄中刪除相應(yīng)的目錄項。
顯示目錄:用戶可以請求去顯示目錄中的內(nèi)容,如顯示該目錄中所有文件及相應(yīng)的屬性。
修改目錄:某些文件屬性保存在目錄中,因此這些屬性變化時需要修改相應(yīng)的目錄項(如文件重命名)。
2 目錄結(jié)構(gòu)
??前面說到有序的文件控制塊集合組成了目錄,目錄結(jié)構(gòu)在發(fā)展過程中出現(xiàn)了一下幾種目錄結(jié)構(gòu):單級目錄結(jié)構(gòu)、兩級目錄結(jié)構(gòu)、多級目錄結(jié)構(gòu)、無環(huán)圖目錄結(jié)構(gòu)。
?? 2.1 單級目錄結(jié)構(gòu)
??早期操作系統(tǒng)并不支持多級目錄,整個系統(tǒng)只建立一張目錄表,每個文件占一個目錄項。

??單級目錄實現(xiàn)了“按名存取”,但是不允許文件重名。
??在創(chuàng)建一個文件時,需要先檢查目錄表中有沒有重名文件,確定不重名后才能允許建立文件,并將新文件對應(yīng)的目錄項插入目錄表中。顯然,單級目錄結(jié)構(gòu)不適用多用戶操作系統(tǒng)。
?? 2.2 兩級目錄結(jié)構(gòu)
??在早期多用戶操作系統(tǒng),采用兩級目錄結(jié)構(gòu)。分為主文件目錄(MFD,Master File Director)和用戶文件目錄(UFD,User File Directory)。

??如上圖所示,主文件目錄中存放的是用戶名及相應(yīng)用戶文件目錄存放的位置。用戶文件目錄由該用戶的文件FCB組成。
??兩級目錄結(jié)構(gòu)允許不同用戶的文件名重名,也可以在目錄上實現(xiàn)訪問限制(檢查此時登錄的用戶名是否匹配)。但是兩級目錄依然缺乏靈活性,用戶不能像現(xiàn)在操作系統(tǒng)一樣可以對自己的文件進行分類。
?? 2.3 多級目錄結(jié)構(gòu)(樹狀目錄結(jié)構(gòu))
??由于兩級目錄缺乏靈活性,用戶不可以對自己的文件進行分類,所以出現(xiàn)了多級目錄結(jié)構(gòu)。

??用戶(用戶進程)要訪問某個文件時要用文件路徑名標(biāo)識文件,文件路徑名是一個字符串。各級目錄之間用"/"隔開。從根目錄出發(fā)的路徑程絕對路徑。
??例"/照片/2015-08/自拍.jpg"就是一個絕對路徑。系統(tǒng)根據(jù)絕對路徑一層一層地找到下一級目錄。剛開始從外存讀入根目錄的目錄表;找到“照片”存放位置后,從外存讀入對應(yīng)的目錄表;在找到“2015-08”目錄的存放位置,再從外存讀入對應(yīng)目錄表;最后才找到文件“自拍.jpg”的存放位置。整個過程需要3次磁盤I/O操作。
??很多時候,用戶會連續(xù)訪問用一個目錄內(nèi)的多個文件(如接連查看2015-08目錄的多個粘片文件夾),顯然每次都從根目錄開始查找,是很低效的。因此可以設(shè)置一個“當(dāng)前目錄”。
??例如,此時打開了“照片”的目錄文件,也就是說,這張目錄表已調(diào)入內(nèi)存,那么可以把它設(shè)置為“當(dāng)前目錄”。當(dāng)用戶想要訪問某個文件時,可以使用從當(dāng)前目錄出發(fā)的相對路徑。這樣可以磁盤減少I/O次數(shù),從而提高了訪問文件效率。例如,此時打開了“照片”的目錄文件,也就是說這張目錄表已調(diào)入內(nèi)存,那么可以把它設(shè)置為“當(dāng)前目錄”。當(dāng)用戶想要訪問“自拍.jpg”時,可以使用從當(dāng)前目錄出發(fā)的相對路徑“./2015-08/自拍.jpg”。
??優(yōu)缺點:樹狀目錄結(jié)構(gòu)可以很方便地對文件進行分類,層次結(jié)構(gòu)清晰,也能夠更有效地進行文件的管理和保護。但是,樹狀結(jié)構(gòu)不便于實現(xiàn)文件共享。為此,提出了無環(huán)圖目錄結(jié)構(gòu)。
?? 2.4 無環(huán)圖目錄結(jié)構(gòu)
??無環(huán)圖目錄結(jié)構(gòu)是在樹狀目錄結(jié)構(gòu)基礎(chǔ)上,增加一些指向同一節(jié)點的有向邊,使整個目錄形成一個有向無環(huán)圖??梢愿奖愕膶崿F(xiàn)多個用戶間文件共享。
??可以用不同的文件名指向同一個文件,甚至可以指向同一個目錄(共享同一個目錄下的所有內(nèi)容)。需要為每個共享節(jié)點設(shè)置一個共享計數(shù)器,用于記錄此時有多少個地方在共享該節(jié)點。

??用戶提出刪除節(jié)點請求時,只是刪除該用戶的FCB、并使共享計數(shù)器減1,并不會直接刪除共享節(jié)點。只有共享計數(shù)器減為0時,才刪除節(jié)點。下圖表示User1用戶刪除了共享文件

注:共享文件不同于復(fù)制文件。在共享文件中,由于用戶指向同一個文件,因此只要一個用戶修改了文件數(shù)據(jù),那么所有用戶都可以看到文件數(shù)據(jù)的變化。
3 索引節(jié)點(FCB的改進)
??操作在查找各級目錄的過程中,只需要用到“文件名”這個信息,而文件存儲權(quán)限、修改時間、文件大小等信息暫時用不到,只有在文件名匹配時才需要讀出文件的其他信息。因此可以考慮讓目錄表進行“瘦身”來提升效率。

??使用索引節(jié)點后的目錄表如下

??這樣做的好處可以大大提升文件檢索速度。
假設(shè)一個FCB是64B,磁盤塊大小為1KB,則每個磁盤塊只能存放16個FCB。若一個文件目錄中共有640個目錄項,則共需要占用640/16=40個磁盤塊。因此按照文件名檢索該目錄,平均需要查詢320個目錄項,平均需要啟動磁盤20次(每次磁盤I/O讀入一塊)。
若使用索引節(jié)點機制,文件名占14B,指針占2B,則每個磁盤塊可以存放64個目錄項,那么按文件名檢索目錄平均只需320/64=5個磁盤塊,即平均需要5次磁盤I/O。顯然,大大提升了文件檢索的速度。
??當(dāng)找到文件名對應(yīng)的目錄項時,才需要將索引節(jié)點調(diào)入內(nèi)存,索引節(jié)點中記錄了文件的各種信息,包括文件在外存中存放位置,根據(jù)“存放位置”即可找到文件。
??存放在外存中的索引節(jié)點稱為“磁盤索引節(jié)點”,當(dāng)索引節(jié)點放入內(nèi)存后稱為“內(nèi)存索引節(jié)點”。相比之下,內(nèi)存索引節(jié)點中需要增加一些信息,如文件是否被修改,此時有幾個進程正在訪問該文件等。
4 小結(jié)
