1. 程式人生 > >第十二章 檔案管理及Linux實現問與答

第十二章 檔案管理及Linux實現問與答

12.10 Linux核心是否每次進行磁碟讀寫時,都要為之分配磁碟緩衝區?當需要分配一個磁碟

緩衝區時,它採取的分配策略是什麼?

答:當每次進行磁碟讀/寫時,核心都要讀/寫操作對應的磁碟塊是否在緩衝池中。如果在緩衝池中,則直接引用緩衝池中的資料;如果不在,則分配一個空閒緩衝區。當需要空閒緩衝區時,應從空閒佇列首部摘下緩衝區。

詳細過程是這樣的:每當進行磁碟讀/寫操作時,核心呼叫getblk過程分配緩衝區。當要讀磁碟資料時,核心首先檢查要讀入的磁碟塊內容是否已在某個緩衝區中,若發現已在某個緩衝區中,便不必再從磁碟上讀入。僅當資料未在任何緩衝區中時,核心才需從磁碟上將資料讀入,這時才需為其分配一空閒緩衝區。類似地,當要把資料寫入一特定磁碟塊時,核心應先檢查該塊內容是否已在某緩衝區中,僅當該塊內容尚不在緩衝區中時,才需要分配一空閒緩衝區。獲取空閒緩衝區時應提供的輸入引數是檔案系統號和磁碟塊號。Getblk過程分配緩衝區時,可分為兩

情況:

① 緩衝區在雜湊佇列上,進入getblk過程後,首先根據檔案系統號和磁碟塊號去查詢雜湊佇列,若找到與檔案系統號和塊號相匹配的緩衝區,便可進一步檢查該緩衝區是否空閒。若空閒,則應先上鎖,以防止其他程序對它進行訪問,然後把它從空閒佇列上摘下;若忙,則表明緩衝區已被其他程序上鎖,因此暫時不能對它進行訪問而進入睡眠,直至該緩衝區變為空閒時再將它喚醒。

② 緩衝區不在雜湊佇列上。若在雜湊佇列中找不到與檔案系統號及塊號相匹配的緩衝區,便只有從空閒連結串列中找一個緩衝區。若空閒連結串列已空,則無法進行分配,程序睡眠,直到空閒連結串列中出現緩衝區為止;若空閒連結串列不空,這時可從鏈首摘下一緩衝區,若此緩衝區標記有:“延遲寫”,此時應將該緩衝區內容非同步地寫到磁碟上,再從空閒連結串列中摘下一個緩衝區,並調整該緩衝區所在的雜湊佇列,即該雜湊佇列從原來的雜湊佇列調整到新的雜湊佇列中。因為當該緩衝區重新分配後,緩衝區對應的磁碟塊號發生了變化,從而也相應地改變了其所在的雜湊佇列。

12.11  Linux檔案系統為什麼設計了一個磁碟i節點又設計了一個記憶體i節點,為什麼內I

節點的內容和磁碟i節點內容不完全相同?

答:索引節點又稱為i節點,其中存放檔案的說明資訊。索引節點以靜態形式存放在磁碟上,故又稱為磁碟索引節點。每個檔案都有一個唯一的一個磁碟索引節點,它由下述欄位構成:

檔案所有者識別符號

檔案型別

檔案存取許可權

存放檔案的實體地址

檔案長度

檔案連線記數

檔案存取時間

為了加快檔案的存取速度和減輕磁碟I/O壓力,系統又專門在記憶體中建立了一個記憶體索引節點表,將那些要被引用的磁碟索引節點複製到記憶體索引節點表中,並增加了如下欄位:

 索引節點號

記憶體索引節點狀態

記憶體索引節點引用計數

裝置號

    記憶體索引節點指標

12.12為什麼使用者在第一次訪問任何檔案之前,都必須先呼叫open()系統呼叫來開啟指定的檔案,然後才能對該檔案執行讀、寫以及修改操作,在對檔案操作結束必須關閉檔案。

答:作業系統需要處理大量使用者檔案,而訪問一個檔案需要查詢目錄,有時甚至需要多次查詢目錄。由於檔案目錄與檔案一起存放在輔存上,當存取檔案時,必須先到輔存中讀取檔案目錄資訊,從中獲得檔案的存放地址,然後再去存取檔案。這樣一來,檔案資訊的存取將花費很多時間。如果將整個檔案目錄放入主存,雖然可以提高存取速度,但這需要佔用大量的主存空間。顯然也是不可取的。實際上,在一段時間內使用的檔案數總是有限的,因此只要將目錄中當前使用的那些檔案的目錄表複製到記憶體中就可以了。這樣即不佔用太多的主存空間,又可顯著提高查詢檔案目錄的速度。為此,大多數作業系統中設定了兩個檔案操作:開啟檔案和關閉檔案。開啟檔案操作完成的功能是將檔案的有關目錄資訊複製到主存活動檔案表中,以建立使用者和這個檔案的聯絡。關閉檔案操作的功能是使用者宣佈這個檔案當前不再使用,系統將其在主存中的相應目錄資訊刪去,從而也就切斷了使用者同這個檔案的聯絡。