• 沒有找到結果。

分頁取代與交易提交

Disk Journal

3.4 分頁取代與交易提交

本章到上一節為止, 已介紹 ext3檔案系統的日誌功能運作原理以及實作所使用的資料結 構,ext3檔案系統是建立在ext2的架構上再加入日誌功能與ext2相結合, 而有關ext3的日誌功 能被抽象成一個核心層 (kernel layer) 稱為 JBD(journal block device), 它並不是一個真正的

裝置, 在 Linux 底下並沒有對應的裝置檔案 (device file)。 本章所敘述的日誌運作原理及所各

種資料結構的操作都包含在這一層裡面, 例如交易、 處理、 日誌首部等資料結構, 交易運行、 提 交等處理流程都算是在JBD 一層中,我們可以說 ext3 = ext2 + JBD。

Operating system

Page cache

Ext3

JBD

disk

Flush data

Add to transaction

Flush to disk

Ext3 Application

Modify data in page cache Write

圖3.13: page cache, ext3 and JBD kernel layers

Linux的分頁快取與檔案系統是分開的兩層核心層, 當分頁快取之資料要寫回磁碟時, 會呼

叫該磁區掛載的檔案系統之對應函式 write page, 這是一個函式指標, 該指標會指向掛載的 檔案系統其相對應函式, 由此可見, 分頁快取並不干涉檔案系統如何操作這些寫回的資料, 如 果掛載的是日誌式檔案系統, 那麼會對資料採取特殊的寫回機制以實現日誌功能, 分頁快取也 跟該寫回機制無關。 若掛載的是 ext3檔案系統的 ordered 模式,write page 指標會指向 ext3 ordered writepage, 由 JBD 相關函式處理後續的流程。 如圖3.13所示, 當使用者在修改 資料時, 作業系統會根據要修改的資料, 讓檔案系統把資料找出來, 並將資料暫時存放在分頁快 取中, 以便使用者修改。 當分頁快取中的資料要衝回磁碟, 會呼叫 ext3對應的函式,ext3則 會將資料將資料分配日誌首部並加日運行中交易, 這些日誌功能的相關動作是由 ext3JBD 完成,最後資料由 JBD 衝回磁碟, 完成寫回程序。

當檔案系統的架構改變時,ext3會用一個處理 (handle) 保護這一連串對元資料修改之原子 性, 使這些修改的元資料資料在一個處理開始到結束這段期間, 逐一交由 JBD 接手, 做之後寫 入磁碟的之相關準備。 改變系統架構的時機有兩個:

1. 執行系統呼叫造成檔案系統架構之改變(例如: 刪除一個檔案)

2. 將使用者資料寫回磁碟時造成檔案系統架構上的改變(例如: 分配一個新的磁碟區塊給某 個檔案)

以下對於這兩種時機分別作說明。

第一個時機點是在執行系統呼叫時, 可能會對應該呼叫改變檔案系統之架構, 而遭到修改 的元資料則會交由 JBD 接手, 並且 JBD 會在一個處理期間 (處理開始到結束) 把這些資料 加入到運行中交易。 這裡檔案系統架構的改變對於該系統呼叫是即時性的, 也就是說, 隨著該 系統呼叫的過程中, 這些元資料就被加入到運行中交易。 比如說 ext3刪除一個檔案時, 會呼叫 ext3 dirty inode函式, 並開始一個處理。 接著檔案系統會完成下述步驟:

1. 在釋放檔案各個區塊,透過索引節點的 direct, indirect, double indirect, triple indriect 等等區塊指標, 將所有區塊都釋放 (實際上就是將這個檔案占用的區塊所對應的區塊位圖 (block bitmap) 中的位元設為0)

2. 將上述修改的區塊位圖加入到運行中交易

3. 把索引節點的 direct, indirect, double indirect, triple indriect 設為0 4. 將索引節點部分欄位清除, 並寫下刪除時間

5. 將索引節點表中(inode table), 包含此索引點之區塊的緩衝區加入運行中交易

6. 釋放索引節點,也就是修改索引節點位圖(inode bitmap),然後將此索引節點位圖之區塊 緩衝區也加入運行中交易

最後在ext3 dirty inode函式返回前,呼叫 ext3 journal stop結束該處理。 這些修改在操作執 行的同時,就被逐步加入運行中交易, 等到交易可以提交時,資料就會被寫到磁碟。

第二個時機點是在使用者資料寫回磁碟時, 也可能會因此改變檔案系統之架構。 舉個例子 來說, 我們開啟了一個檔案, 並新增寫入了一個磁碟區塊大小的內容。 這裡有一點要注意的是, 在我們增新檔案內容的時候,Linux並不會即時把資料寫到磁碟,而是先將資料放在分頁快取中, 因此對於新增的資料,檔案系統尚未分配磁碟區塊給予該資料。 假設經過一段時間後, 分頁快取 演算法選出一個分頁要進行寫回, 而這個分頁恰是我們所增新的檔案內容。 對於被選出寫回磁 碟的分頁, 系統會呼叫 ext3的 ext3 ordered writepage, 該函式首先會開始一個處理, 並將寫 回之資料加入運行中交易,由於這個新增的資料並沒有對應的磁碟區塊,因此系統還必須分配磁 碟上的一個區塊, 以便之後存放該分頁的資料。 如此一來, 檔案系統的架構受到改變, 對於這個 改變所需要修改的各個元資料,也必須在同一個處理中加入運行中交易。 這裡修改元資料包含了 檔案系統的一個區塊位圖 (block bitmap), 該檔案的索引節點, 以及新增區塊如果不是索引節 點 direct 可以直接存下區塊位址 (檔案已經超過12個區塊), 而需要透過 indirect(也有可能是 double indirect或triple indirect)存放的話,那在該分支最後一個區塊也要增新寫入一個區塊 的號碼, 也就是說這個區塊也被修改, 這些種種元資料都要加入到運行中交易。 最後才會將這個 處理結束 (由此可見,這些有修改的元資料以及寫回的使用者資料被視為同一個處理之內)

上述舉例的情況, 檔案系統架構的改變是非即時性的, 因為新增的使用者資料, 被暫時存放 在分頁快取中,等到該分頁資料被寫回時系統才會分配磁碟區塊,也就是說等到分頁被寫回時檔 案系統的架構才改變。

相關文件