二、檔案操作的實作
這裡主要是以
UNIX
作業系統為例。
2.1 檔案操作的實作
-
建立檔案
建立系統與檔案的聯系,實質是建立檔案的
FCB
* 在目錄中為新檔案建立一個目錄項(在`UNIX`中還需要`i`節點),根據提供的參數及需要填寫相關内容
-
- 配置設定必要的存儲空間
-
打開檔案
根據檔案名目錄中檢索,并将該檔案的目錄項讀入記憶體,建立相應的資料結構,為後續的檔案操作做好準備。打開檔案後一般會傳回一個值,這個值一般叫檔案描述符或檔案句柄,之後的操作是通過檔案描述符來進行的。
2.2 檔案操作:建立檔案
create
(檔案名,通路權限)
-
1、檢查參數的合法性
例如:檔案名是否符合命名規則;有無重名檔案,合法則進行下一步,否則報錯傳回。
- 2、申請空閑目錄項,并填寫相關内容
- 3、為檔案申請磁盤塊
- 4、傳回
2.3 檔案操作:打開檔案
為檔案讀寫做準備:給出檔案路徑名,獲得檔案句柄(file handler)或檔案描述符(file descripter),需将該檔案的目錄項讀到記憶體fd = open(檔案路徑名,打開方式)
1、根據檔案路徑名查目錄,找到目錄項(或i節點号)
2、根據檔案号查系統打開檔案表,看檔案是否已被打開,如果是,則共享計數加一,否則,将目錄項(或i節點)等資訊填入系統打開檔案表空表項,共享計數置為一。
3、根據打開方式、共享說明和使用者身份檢查通路合法性
4、在使用者打開檔案表中擷取一空表項,填寫打開方式等,并指向系統打開檔案表對應表項,傳回資訊:fd(檔案描述符,是一個非負整數,用于以後讀寫檔案)
2.4 檔案操作:指針定位
seek
(
fd
, 新指針位置):系統為每個程序打開的每個檔案維護一個讀寫指針,即相對于檔案開頭的偏移位址(讀寫指針指向每次檔案讀寫的開始位置 ,在每次讀寫完成後,讀寫指針按照讀寫的資料量自動後移相應的數值)
- 1、由
查使用者打開檔案表,找到對應的表項fd
- 2、将使用者打開檔案表中檔案讀寫指針位置設為新指針的位置,供後繼讀寫指令存取該指針處檔案内容。
2.5 檔案操作:讀檔案
read(檔案描述符,讀指針,要讀的長度,記憶體目的位址)
1、根據打開檔案時得到的檔案描述符,找到相應的檔案控制塊(目錄項),确定讀操作的合法性,讀操作合法則進行下一步,否則出錯處理。
2、将檔案的邏輯塊号轉換為實體塊号。根據參數中的讀指針、長度與檔案控制塊中的資訊,确定塊号、塊數、塊内位移
3、申請緩沖區
4、啟動磁盤I/O操作,把磁盤塊中的資訊讀入緩沖區,再送到指定的記憶體區(多次讀盤)
5、反複執行3、4直至讀出所需數量的資料或讀至檔案尾
三、檔案系統的管理
3.1 檔案系統的可靠性
可靠性:抵禦和預防各種實體性破壞和人為性破壞的能力
- 塊壞問題
-
備份
通過轉儲操作,形成檔案或檔案系統的多個副本。
3.2 檔案系統備份
-
全量轉儲
定期将所有檔案拷貝到後援存儲器
-
增量轉儲
隻轉儲修改過的檔案,即兩次備份之間的修改。減少系統開銷。
-
實體轉儲
從磁盤第零塊開始,将所有磁盤塊按序輸出到錄音帶
-
邏輯轉儲
從一個或幾個指定目錄開始,遞歸地轉儲子給定日期後所有更改的檔案和目錄
3.3 檔案系統一緻性
-
問題的産生:
磁盤塊–>記憶體–>寫回磁盤塊
若在寫回之前,系統崩潰,則檔案系統出現不一緻
-
解決方案
設計一個使用程式,當系統再次啟動時,運作該程式,檢查磁盤塊和目錄系統
3.4 磁盤塊的一緻性檢查
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5CMhZzY1QWZ0UTM5czY4IWOwQ2M0gTZ4UmZiJGOjVjN08CX5d2bs92Yl1iclB3bsVmdlR2LcNWaw9CXt92Yu4GZjlGbh5yYjV3Lc9CX6MHc0RHaiojIsJye.png)
**說明::**一緻性檢查時,檢查所有的檔案和空閑塊,檢查完之後可能會出現四種結果。第一種是一個一緻性的結果,即某個磁盤塊要麼配置設定給了某個檔案,要麼在空閑塊中。第二種結果是在空閑塊中找不到,但是也沒有配置設定給某個檔案,于是我們通過在空閑塊表中将磁塊标記為一來解決。第三種結果是某個磁盤塊在空閑塊表中出現了兩次,同樣是不合理的,對這一位進行修改。最後一種結果是在兩個檔案中出現,這種情況較為複雜,我們應該在空閑塊中找一個,然後将其中一個磁盤塊内容拷貝到這個空閑塊中,然後将使用塊表中的這一位減一。
3.5 檔案系統的寫入政策
對某些檔案做出了修改,那麼什麼時候将修改後的内容寫入到檔案中。這裡需要考慮檔案系統一緻性和速度。下面有幾種寫入政策
通寫(write-through)
記憶體中的修改立即寫到磁盤。缺點是速度性能差,如FAT檔案系統。
延遲寫(lazy-write)
利用回寫(write back)緩存的方法得到高速。其缺點就是可恢複性較差,可能會導緻資訊丢失
可恢複寫(tansaction log)
采用事務日志來實作檔案系統的寫入,既考慮安全性,又考慮速度性能,如NTFS
四、檔案系統的安全性
這裡我們讨論如何確定未經授權的使用者不能存取某些檔案?
4.1 檔案保護機制
- 用于提供安全性、特定的作業系統機制
- 對擁有權限的使用者,應該讓其進行相應的操作,否則,應禁止
- 防止其他使用者冒充對檔案進行操作
- 于是在實作的時候需要考慮使用者身份驗證和通路控制。對于使用者身份我們可以采用比如密碼、密碼等方式。
4.2 檔案的通路控制
有不同的通路控制手段,比如主動控制(使用通路控制表)和能力表(使用權限表)。
-
主動控制
每個檔案一個
記錄使用者
和通路權限ID
-
使用者可以是一組使用者
檔案可以是一組檔案
-
能力表
每個使用者一個
記錄檔案名及通路權限
4.3 UNIX的檔案通路控制
采用檔案的二級存取控制,審查使用者的身份、審查操作的合法性
第一級:對通路者身份的識别
對使用者分類:
* 檔案主(`owner`)
-
- 檔案主的同組使用者(
)group
- 其他使用者(
other
- 檔案主的同組使用者(
-
第二級:對操作權限的識别
對操作分類:
* 讀操作(`r`)
-
- 寫操作(
w
- 執行操作(
x
- 不能執行任何操作(
-
- 寫操作(
五、檔案系統的性能
5.1 檔案系統的性能問題
- 磁盤服務:速度成為系統性能的主要瓶頸之一。是以,在設計檔案系統時應盡可能減少磁盤通路次數
-
提高檔案系統性能的方法:
目錄項(
)分解、目前目錄、磁盤碎片整理、塊高速緩存、磁盤排程、提前讀取、合理配置設定磁盤空間、資訊的優化分布、FCB
技術等等RAID
5.2 提高檔案系統性能:塊高速緩存(BLOCK CACHE)
又稱為檔案緩存、磁盤高速緩存、緩沖區高速緩存。是指在記憶體中為磁盤塊設定的一個緩沖區,儲存了磁盤中某些塊的副本。當對檔案系統進行操作的時候:
檢查所有的讀請求,看所需塊是否在塊高速緩沖中
如果在,則可直接進行讀操作;否則,先将資料塊讀入塊高速緩存,再拷貝到所需的地方。
由于通路的局部性原理,當一資料塊被讀入塊高速緩存以滿足一個I/O請求時,和可能将來還會再次通路到這一資料塊。
5.3 如何實作塊高速緩存
- 塊高速緩存的組織方式
-
作業系統之檔案管理(下)二、檔案操作的實作三、檔案系統的管理四、檔案系統的安全性五、檔案系統的性能 - **說明:**在塊高速緩存中有若幹個資料塊,首先将這些塊使用一個雙向連結清單組織起來,當要通路這個鍊的時候就将其從此鍊中拿出來,然後挂接到鍊尾,而我們對于某個檔案使用的塊要檢查其是否在高速緩存中,是以這裡又使用塊号進行散列以提高檢查速度。
塊高速緩存的置換問題(修改LRU)
因為此緩存的空間肯定是不會很大的,是以當其滿時我們需要對其進行置換。對于以後可能會再次使用的塊我們将其放在鍊尾,而對于使用機率很小的塊可能就需要将其剔除。
塊高速緩存的寫入政策
在檔案系統中,我們需要考慮該塊是否會影響檔案系統的一緻性。這裡如前面所講,不同的作業系統采用了不同的一緻性解決方案。
提前讀取
* 思路:每次通路磁盤,多讀入一些磁盤塊
-
- 依據:程式執行的空間局部性原理
- 開銷:較小(隻有資料傳輸時間)
- 具有針對性
5.4 Windows的檔案通路方式
一般有下面三種方式:
不使用檔案緩存
* 普通方式
-
- 通過
提供的Windows
函數實作FlushFileBuffer
- 通過
- 使用檔案緩存(塊高速緩存)
* 預讀取。每次讀取的塊大小、緩沖區大小、置換方式
-
- 寫回。寫回時機選擇、一緻性問題
- 異步模式
* 不再等待磁盤操作的完成。
-
- 使處理器和
并發工作I/O
- 使處理器和
使用者對磁盤的通路通過通路檔案緩存來實作:
- 由
的Windows
實作對緩存的控制Cache Manager
* 讀取資料的時候預取
-
- 在
滿時,根據Cache
原則清除緩存的内容LRU
- 定期更新磁盤内容使其與
一緻(每秒)Cache
- 在
-
機制write-back
* 在使用者要對磁盤寫資料時,隻更改`Cache`中的内容,由`Cache Manager`決定何時将更新反映到磁盤
5.5 提高檔案系統性能:合理配置設定磁盤空間
配置設定磁盤塊時,把有可能順序存取的塊放在一起(盡量配置設定在同一柱面上,進而減少磁盤臂的移動次數和距離)
**說明:**我們讀取檔案系統時,每次都要先找到i節點區,然後再去找到檔案位置,如果i節點區在最外道,而相關檔案在最裡道,則在讀取的時候磁臂就需要不斷的移動,這樣顯示效率低下。一種解決方案如(a),我們将i節點區和相關檔案放在距離較近的磁道上;另一種是如(b),首先将磁道分成了若幹組,然後将i節點區也劃分成若幹部分,每一組磁道都有一個i節點區,而每個檔案都和其i節點區在同一組,這樣磁臂也不需要很大的移動。
5.6 提高檔案系統性能:磁盤排程(重點)
當有多個訪盤請求等待時,采用一定的政策,對這些請求的服務順序調整安排,進而降低平均磁盤服務時間,達到公平、高效的目的。
- 公平
- 一個IO請求在有限時間内滿足
-
高效
減少裝置機械運動帶來的時間開銷
一次訪盤時間 = 尋道時間 + 旋轉延遲時間 + 傳輸時間
- 減少尋道時間
- 減少延遲時間
5.7 磁盤排程算法(重點)
例子:假設磁盤通路序列:
98、183、37、122、14、124、65、67
,這些數字表示柱面号或磁道号。讀寫頭起始位置為
53
。請計算磁頭服務序列和磁頭移動總距離(道數)。下面使用幾種算法進行計算:
- 1、先來先服務(
FCFS
- 按通路請求到達的先後次序服務
* 優點:簡單、公平
- 缺點:效率不高,相鄰兩次請求可能會造成最内到最外的柱面尋道,使磁頭反複移動,增加了服務時間,對機械也不利。
-
作業系統之檔案管理(下)二、檔案操作的實作三、檔案系統的管理四、檔案系統的安全性五、檔案系統的性能 - 磁道服務序列和通路序列一緻,磁頭移動總距離為640,平均80。
2、最短尋道時間優先(Shortest Seek Time First)(重點)
用于磁盤
優先選擇距目前磁頭最近的通路請求進行服務,主要考慮尋道優先。
優點
改善了磁盤平均服務時間
缺點
造成某些通路請求長期等待而得不到服務
3、掃描算法(
SCAN
電梯算法)(重點)
當裝置無通路請求時,磁頭不動;當有通路請求時,磁頭按一個方向移動,在移動過程中遇到的通路請求進行服務,然後判斷該方向上是否有通路請求,如果有則繼續掃描;否則改變移動方向,并為經過的通路請求服務,如此反複。其實是一種對距離和方向的折中算法。
4、單向掃描算法(
C-SCAN
這是對掃描算法的一種改進。
* 總是從零号柱面開始向裡掃描
按柱面(磁道)位置選擇通路者
移動臂到達最後一個柱面後,立即帶動讀寫磁頭快速傳回到零号柱面
傳回時不為任何的等待通路者服務
傳回後可再次進行掃描
主要的目的是減少了新請求的最大延遲。
5、N-step-SCAN政策
把磁道請求隊列分成長度為N的子隊列,每一次用SCAN處理一個子隊列
在處理某一個隊列時,新請求添加到其他子隊列中
如果最後剩下請求數小于N,則它們全部都将在下一次掃描時處理
N值比較大時,其性能接近SCAN;當N = 1時,即FIFO
主要是為了解決磁頭臂的粘性問題。
6、FSCAN政策
使用兩個子隊列
掃描開始時,所有請求都在一個隊列中,而另一個隊列為空
掃描過程中,所有新到的請求都放入另一個隊列中
對新請求的服務延遲到處理完所有老請求之後
主要是為了解決磁頭臂的粘性問題。本算法及以上都是對磁臂移動的優化算法。
7、旋轉排程算法
根據延遲時間來決定執行次序的排程。一般有三種情況:
若幹等待通路請求通路同一磁頭上的不同扇區
若幹等待通路請求通路不同磁頭上的不同扇區
若幹等待通路請求通路不同磁頭上的相同扇區
-
- 解決方案:
-
-
- 對于前兩種情況:總是讓首先到達讀寫磁頭位置下的扇區先進行傳送操作
-
-
- 對于第三種情況:這些扇區同時到達讀寫磁頭位置下,可任意選擇一個讀寫磁頭進行傳送操作
5.8 提高檔案系統性能:資訊優化分布
記錄在磁道上的排列方式也會影響輸入輸出操作的時間。
**說明:**如果資訊是按左邊那樣分布的,那麼如果首先讀到1号記錄,然後花5ms處理,但是此時磁盤已經轉到了4号記錄,于是如果我們要處理2号記錄,則必須将4、5、6、7、8都旋轉過去之後才能處理2号記錄;而如果資訊是按右邊那樣分布的,當處理完1号記錄,而此時磁盤也剛好旋轉到了2号記錄處,這樣就能極大的提高檔案系統的性能。
5.9 提高檔案系統性能:記錄的成組與分解
-
記錄的成組
把若幹個邏輯記錄合成一組存放在一塊的工作
- 進行成組操作時必須使用記憶體緩沖區,緩沖區的長度等于邏輯記錄長度乘以成組的塊因子(成組的長度)。
- 成組的目的:提高了存儲空間的使用率;減少了啟動外設的次數,提高系統的工作效率。
-
記錄的分解
從一組邏輯記錄中把一個邏輯記錄分離出來
典型的例子就是目錄檔案的存儲。
5.10 提高檔案系統性能:RAID技術
起始就是獨立磁盤備援陣列(Redundant Arrays of Independent Disks),就是将多塊磁盤按照一定要求構成一個獨立的儲存設備。目的就是提高可靠性和性能。在實作時,需要考慮存儲系統的速度、容量、容錯、資料災難發生後的資料恢複。
資料是如何組織的
* 通過把多個磁盤組織在一起,作為一個邏輯卷提供磁盤跨越功能
- 通過把資料分成多個資料塊,并行寫入/讀出多個磁盤,以提高資料傳輸率(資料分條
stripe
- 通過鏡像或校驗操作,提供容錯能力(備援資訊的儲存)
- 最簡單的組織方式是鏡像,最複雜的是塊交錯校驗。
- 例1:
- 條帶化RAID 0
* 資料分布在陣列的所有磁盤上
- 有資料請求時,同時多個磁盤并行操作
- 充分利用總線寬帶,資料吞吐率提高,驅動器負載均衡
-
作業系統之檔案管理(下)二、檔案操作的實作三、檔案系統的管理四、檔案系統的安全性五、檔案系統的性能 - 這種方式沒有備援資訊儲存,即無差錯控制,性能是最佳的。
- 例2:
-鏡像RAID 1
* 最大限度保證資料安全和可恢複性
-
- 所有資料同時存在與兩塊磁盤的相同位置
- 磁盤使用率為50%
-
作業系統之檔案管理(下)二、檔案操作的實作三、檔案系統的管理四、檔案系統的安全性五、檔案系統的性能 - 9
資料的安全性是最好的,但是磁盤使用率較低。
- 例3:
-交錯塊奇偶校驗RAID 4
* 帶奇偶校驗
-
- 以資料塊為機關
-
作業系統之檔案管理(下)二、檔案操作的實作三、檔案系統的管理四、檔案系統的安全性五、檔案系統的性能 - 資料儲存在前四塊盤上,而校驗資訊儲存在第五塊盤上。