46 inode分配給新文件
內核使用算法IGET分配已知的Inode,該Inode先前已確定了該算法的(文件係統和Inode編號)。例如,在算法rtamei中,內核通過將路徑名組件與目錄中的名稱匹配來確定inode編號。另一種算法IALLOC將磁盤inode分配給新創建的文件。
該文件係統包含inodes的線性列表,如第2章所述。如果其類型字段為零,則免費。當過程需要新的Inode時,內核可以從理論上搜索Inode列表中的免費Inode。但是,這樣的搜索將是昂貴的,每個Inode都需要至少一個讀取操作(可能來自磁盤)。為了提高性能,文件係統超級塊包含一個數組來緩存文件係統中的免費indodes數量。
圖4.12顯示了用於分配新Inodes的算法IALLOC。由於稍後引用的原因,內核首先驗證了其他過程沒有鎖定對超級塊免費Inode列表的訪問。如果清單inode編號在超級塊中不是空的,內核分配了下一個inode編號,使用算法Iget為新分配的磁盤分配免費的核心inode(如有必要,請從磁盤中讀取inode),將磁盤複製到Indode中,核心複製,初始化Inode中的字段,然後返回鎖定的Inode。它更新了磁盤INODE以指示INODE現在正在使用中:非零文件類型字段指示分配了磁盤INODE。在最簡單的情況下,內核具有良好的inode,但是存在種族條件,需要進行更多檢查,這將很快解釋。寬鬆定義的是,當幾個過程更改通用數據結構時,就會出現種族條件,從而使所得的計算取決於該過程執行的順序,即使所有過程都遵守了鎖定協議。例如,這裏暗示一個過程可以獲取二手Inode。種族條件與第2章定義的相互排斥問題有關,隻是鎖定計劃解決了那裏的相互排斥問題,但本身可能沒有解決所有種族條件。
如果免費inodes的超級塊列表為空,則內核將搜索磁盤,並將盡可能多的免費inode編號放入超級塊中。內核讀取磁盤上的Inode列表,逐個塊上的塊,並將Inode編號的超級塊列表填充到容量中,並記住它找到的最高數字的inode。將其稱為“記憶” inode;這是保存在超級塊中的最後一個。下次內核搜索磁盤免費inodes時,它將記憶的Inode作為起點,從而確保它不會浪費時間閱讀磁盤塊
算法¡alloc / *分配inode * /輸入:文件係統
輸出:鎖定Inode(
而(未完成){
if(超級鎖定){
睡眠(事件超級塊成為免費);繼續;/ *循環 */
}
如果(超級塊中的inode列表為空){
鎖定超級塊;
被記住以獲取免費的Inode搜索;搜索磁盤免費indodes直到超級塊滿,
或不再有免費的indodes(算法麵包和BRCLSC);解鎖超級塊;
喚醒(事件超級塊免費);如果(在磁盤上找不到免費的inodes)
返回(否inode);設置記住的Inode,以獲取下一個免費Inode搜索;
}
/ *超級塊Inode列表中有Inodes */從超級塊Inode列表中獲取Inode號碼;得到inode(算法iget);
如果(«畢竟是沒有免費的) /* !!!*/ [
寫入磁盤的節點;
Release Inode(算法IPUT);
繼續;/ *循環 */
)
/*'節點是免費的v初始化inode;將Inode寫入磁盤;
免費文件係統免費inode count;返回(inode);
)
}
圖4.12。用於分配新Inodes的算法
不應該存在免費的indodes。收集了一組新的免費Inode編號後,它從一開始就啟動了Inode分配算法。每當內核分配磁盤INODE時,它都會減少超級塊中記錄的自由計數。
超級塊免費inode列表
免費indodes |
繼續在這裏閱讀:47磁盤塊的分配 本文是否有幫助? 讀者的問題
|