1. 程式人生 > >檔案系統中的索引與目錄

檔案系統中的索引與目錄

檔案系統操作居於高速緩衝演算法之上。

1. 索引節點

UNIX系統中每個檔案有一個唯一的索引節點,包含為程序存取檔案所必須的資訊。

inode以靜態形式存在於磁碟上,核心把他們鍍金記憶體索引節點表中以便操縱它們。包含內容:檔案所有者、型別、時間、檔案資料磁碟地址明細表,檔案大小(偏移量表示)。

把索引節點的內容寫入磁碟,和把檔案內容寫入磁碟不同,要注意區別。

記憶體中的索引節點與磁碟索引節點相比,還包含一些額外欄位如狀態(上鎖等)、磁碟未知節點號、引用數等。當一個程序開啟一個檔案時,索引節點的引用數加一。知道其引用計數為0時,這個索引節點才能被放入空閒表,重新分配給另一個磁碟索引節點。與高速緩衝中的緩衝首部類似。

1)索引節點的存取

iget分配一個索引節點的記憶體拷貝,與高速緩衝的getblk幾乎完全相同。核心把裝置號和索引節點號對映到一個雜湊佇列上,同時有一個空閒表,以進行搜尋和分配。索引節點除鎖控制外,還有一個計數器,一方面及時釋放鎖,另一方面防止節點被意外釋放。

塊號=((索引節點號 - 1)/每塊的索引節點數目) + 索引節點表的起始塊號

當核心知道裝置和磁碟塊號後,使用演算法bread(會呼叫getblk得到緩衝區)讀出該塊,然後使用下面公式計算索引節點在該塊中的位元組偏移量:

((索引節點號 - 1) mod (每塊索引節點數目)) * 磁碟索引節點大小

然後從磁碟索引節點把資料拷貝到記憶體索引節點上,並返回一個上鎖狀態的索引節點。

索引節點本身有一個快取記憶體,與bread中的快取記憶體不是同一個?

2. regular file structure

索引節點包含檔案資料在磁碟上的未知明細表(用磁碟塊序號表示)。為使索引節點保持較小的結構又能允許組織大檔案,磁碟塊地址存取分為三級索引:直接、一次間接、二次間接和三次間接。檔案大小限制為4G(16G?)

程序存取檔案中的資料時使用位元組偏移量,核心把使用者位元組流轉換成塊:檔案從第一個邏輯塊開始,知道相應於該檔案大小的邏輯塊號。核心存取索引節點並把邏輯檔案塊轉換成磁碟塊。

檔案偏移量轉換成物理磁碟塊演算法為bmap。對於一個大的位元組偏移量,特別是經過三次間接引用的,核心除存取索引節點與資料塊之外,還要存取三個磁碟塊,及時在高速緩衝中能找到這些磁碟塊,但由於需要等候上了鎖的緩衝區,操作代價仍會很高。

3. 目錄

目錄也是檔案,只是它的資料是一系列目錄表項,每個目錄表項有一個索引節點號好一個包含在這個目錄中的檔名組成。

4. 路徑名到索引節點轉換

namei每次分析路徑名的一個分量,根據這個名字及正在搜尋的目錄,把這個分量轉換成一個索引節點。每個程序在其工作目錄中工作,所有路徑名搜尋都從程序的當前目錄開始(或從指定的根目錄)。

namei分析路徑名時使用工作索引節點,

5. 為新檔案分配索引節點

iget用來分配已知的索引節點,ialloc則用來把一個磁碟索引節點分配給一個新建立的檔案。

檔案系統包含一個索引節點線性表,如果型別欄位為0,說明這個索引節點是空閒的。超級塊包含一個數組,用於包檔案系統中空閒的索引節點號快取起來。(注意,是索引節點號,得到索引節點號後可用iget分配記憶體)。

當超級塊中空閒索引節點表為空時,通過銘記索引節點來確定從磁碟上開始搜尋空閒索引節點的位置,並把超級塊中空閒表填滿。銘記索引節點是最小的空閒索引節點號。

6. 磁碟塊的分配

當程序往檔案上寫資料時,核心必須從檔案系統中分配磁碟塊,一用作資料塊。超級塊包含一個用來把檔案系統中空閒磁碟塊高速緩衝起來的陣列。

mkfs把一個檔案系統資料塊組織到一個連結串列中,表中的每一個鏈是一個磁碟塊。當核心想要從檔案系統中分配一塊時(演算法alloc),它把超級塊表中下一個可用塊分配出去。如果該可用塊是最後一個可用塊,則讀出該塊內容(bread),把讀出的所有塊號拷貝到超級塊中以填滿空閒塊備用。