共享檔案:硬連結和軟連結
檔案共享使多個使用者(程序)共享同一份檔案,系統中只需保留該檔案的一份副本。如果系統不能提供共享功能,那麼每個需要該檔案的使用者都要有各自的副本,會造成對儲存空間的極大浪費。隨著計算機技術的發展,檔案共享的範圍已由單機系統發展到多機系統,進而通過網路擴充套件到全球。這些檔案的分享是通過分散式檔案系統、遠端檔案系統、分散式資訊系統實現的。這些系統允許多個客戶通過C/S模型共享網路中的伺服器檔案。
現代常用的兩種檔案共享方法有:
基於索引結點的共享方式(硬連結)
在樹形結構的目錄中,當有兩個或多個使用者要共享一個子目錄或檔案時,必須將共享檔案或子目錄連結到兩個或多個使用者的目錄中,才能方便地找到該檔案,如圖4-7所示。
圖4-7 基於索引結點的共享方式
在這種共享方式中引用索引結點,即諸如檔案的實體地址及其他的檔案屬性等資訊,不再是放在目錄項中,而是放在索引結點中。在檔案目錄中只設置檔名及指向相應索引結點的指標。在索引結點中還應有一個連結計數count,用於表示連結到本索引結點(亦即檔案) 上的使用者目錄項的數目。當count=2時,表示有兩個使用者目錄項鍊接到本檔案上,或者說是有兩個使用者共享此檔案。
當用戶A建立一個新檔案時,它便是該檔案的所有者,此時將count置為1。當有使用者 B要共享此檔案時,在使用者B的目錄中增加一個目錄項,並設定一指標指向該檔案的索引結點。此時,檔案主仍然是使用者A,count=2。如果使用者A不再需要此檔案,不能將檔案直接刪除。因為,若刪除了該檔案,也必然刪除了該檔案的索引結點,這樣便會便使用者B的指標懸空,而使用者B則可能正在此檔案上執行寫操作,此時使用者B會無法訪問到檔案。因此使用者A不能刪除此檔案,只是將該檔案的count減1,然後刪除自己目錄中的相應目錄項。使用者B仍可以使用該檔案。當count=0時,表示沒有使用者使用該檔案,系統將負責刪除該檔案。如圖4-8給出了使用者B連結到檔案上的前、後情況。
圖4-8 檔案共享中的連結計數
利用符號鏈實現檔案共享(軟連結)
為使使用者B能共享使用者A的一個檔案F,可以由系統建立一個LINK型別的新檔案,也取名為F,並將檔案F寫入使用者B的目錄中,以實現使用者B的目錄與檔案F的連結。在新檔案中只包含被連結檔案F的路徑名。這樣的連結方法被稱為符號連結。
新檔案中的路徑名則只被看做是符號鏈,當用戶B要訪問被連結的檔案F且正要讀 LINK類新檔案時,作業系統根據新檔案中的路徑名去讀該檔案,從而實現了使用者B對檔案 F的共享。
在利用符號鏈方式實現檔案共享時,只有檔案的擁有者才擁有指向其索引結點的指標。而共享該檔案的其他使用者則只有該檔案的路徑名,並不擁有指向其索引結點的指標。這樣,也就不會發生在檔案主刪除一共享檔案後留下一懸空指標的情況。當檔案的擁有者把一個共享檔案刪除後,其他使用者通過符號鏈去訪問它時,會出現訪問失敗,於是將符號鏈刪除,此時不會產生任何影響。當然,利用符號鏈實現檔案共享仍然存在問題,例如:一個檔案釆用符號鏈方式共享,當檔案擁有者將其刪除,而在共享的其他使用者使用其符號連結訪問該檔案之前,又有人在同一路徑下建立了另一個具有同樣名稱的檔案,則該符號鏈將仍然有效,但訪問的檔案已經改變,從而導致錯誤。
在符號鏈的共享方式中,當其他使用者讀共享檔案時,需要根據檔案路徑名逐個地查詢目錄,直至找到該檔案的索引結點。因此,每次訪問時,都可能要多次地讀盤,使得訪問檔案的開銷變大並增加了啟動磁碟的頻率。此外,符號鏈的索引結點也要耗費一定的磁碟空間。符號鏈方式有一個很大的優點,即網路共享只需提供該檔案所在機器的網路地址以及該機器中的檔案路徑即可。
上述兩種連結方式都存在一個共同的問題,即每個共享檔案都有幾個檔名。換言之,每增加一條連結,就增加一個檔名。這實質上就是每個使用者都使用自己的路徑名去訪問共享檔案。當我們試圖去遍歷整個檔案系統時,將會多次遍歷到該共享檔案。
硬連結和軟連結都是檔案系統中的靜態共享方法,在檔案系統中還存在著另外的共享需求,即兩個程序同時對同一個檔案進行操作,這樣的共享可以稱為動態共享。