# OS筆記-Chapter 10: File-System Interface
###### tags: `OS`
---
#### 目錄
* 總論
[Chapter 1: Introduction](https://hackmd.io/NoZq3J7IQvOQpcbo_tctjA)
[Chapter 2: Operating-System Structures](https://hackmd.io/OKykRLBESI6v9a13HgS35A)
* 行程管理
[Chapter 3: Processes](https://hackmd.io/HOqN-iQ3RIKIC-NB9QjBIQ)
[Chapter 4: Threads](https://hackmd.io/qzAIHeSASmKuecdkqidmHw)
[Chapter 5: CPU Scheduling](https://hackmd.io/IT5g2wHzTdOtMSDXPVEpOw)
[Chapter 6: Process Synchronization](https://hackmd.io/rv-PNe3ESxi08PElyUTc4Q)
[Chapter 7: Deadlocks](https://hackmd.io/Uu0jDK-rSyKNKq690y146g)
* 記憶體管理
[Chapter 8: Main Memory](https://hackmd.io/4KS_yPkBQzGZfHDisPciog)
[Chapter 9: Virtual Memory](https://hackmd.io/yirxZFn8Rz2wT56AAR7Sxw)
* 儲存裝置
<font color="red">Chapter 10: File-System Interface</font>
[Chapter 11: File System Implementation](https://hackmd.io/bFcrlmefQsGp6hZdbI1MHQ)
[Chapter 12: Mass-Storage Systems](https://hackmd.io/9Y7Qo0OERda6htK7OOI36Q)
[Chapter 13: I/O Systems](https://hackmd.io/VNwXrhJPSo-l_t9tUBhYIg)
* 保護和安全
[Chapter 14: Protection](https://hackmd.io/izkd4JwXRwub_ZmhSMTlNw)
[Chapter 15: Security](https://hackmd.io/ofyvDidvQf-PxLMMZYhtsg)
---
### 檔案的觀念
* 檔案系統組成
* 一群檔案(資料)
* 目錄結構(directory structure)
* 檔案(file):邏輯上的儲存單位
* 資料必須放入檔案中,否則無法寫入儲存裝置
* 文字檔案(text file)
* 原始檔案(source file)
* 可執行檔案(executable file)
* 檔案特性
* 名稱(Name)
* 識別符號(Identifier):獨一無二的標籤,通常是數字,用來辨識檔案系統內的檔案
* 型態(Type)
* 位置(Location)
* 大小(Size)
* 保護(Protection):讀、寫、執行等權限
* 時間、日期和使用者辨識(Time, date, and user identification )
* 檔案資訊視窗(file info window):

* 檔案運作
* 建立檔案(Create)
* 寫入檔案(Write):必須更新寫入指標(write pointer)到檔案的位置
* 讀取檔案(Read):必須更新讀出指標(read pointer)到檔案的位置
* 目前檔案位置指標(current-file-position pointer):通常一個行程只會讀取或寫入一個檔案,因此讀和寫使用共同的指標,能減省目錄空間
* 重置檔案(Reposition within file):搜尋目錄以找到相關的進入點,也稱為搜尋(seek)
* 刪除檔案(Delete)
* 縮減檔案(Truncate):將檔案長度重置,並將檔案空間釋放
* 開啟檔案列表(open-file table)
* 包含所有已開啟檔案的資訊
* 不須搜尋整個目錄,只需搜尋此表格
* 每一個開啟的檔案包含
* 檔案指標:作為目前檔案位置的指標
* 檔案開啟計數(open count):因為許多行程可開啟同一檔案,當檔案開啟計數為零,系統就可以將該檔從開啟檔案列表上移去
* 檔案的磁碟位置
* 存取權限
* 對多行程存取同一開啟檔案提供鎖
* 共用鎖(shared lock):類似讀取者鎖,可多個行程同時獲得
* 互斥鎖(exclusive lock):類似寫入者鎖,每次只有一個行程能獲得
* 強制(mandatory):作業系統確認上鎖的狀態
* 建議(advisory):取決於軟體開發者,鎖是否獲得與釋放
* 檔案型態(File Types)
* 檔名包含檔案型態
* 主檔名
* 副檔名:檔案型態

* 檔案結構
* 檔案型態用來指出檔案內部的結構
* 所有作業系統至少必須支援可執行檔的結構
* 檔案可視為一連串的區段(每個區段固定大小)
* 檔案可能存在內部斷裂
### 存取方式(Access Methods)
* 循序存取(Sequential Access)
* 依照記錄次序一一存取區段
* 可以向前或向後n個紀錄

* 直接存取(Direct Access)
* 檔案由邏輯紀錄(logical record)組成
* 相對性的區段號碼(relative block number):開頭為0,下一個是1,實際上開頭對應的實體記憶體可能是14703,而下一個實體記憶體是3192之類的
* 可直接讀入指定的區段,使用cp代表現在的位置

* 其他存取方式
* 索引(index)

* 若有索引檔案本身太大的問題,則設定索引檔案的索引
* 主索引指向副索引,再指向檔案
### 目錄和磁碟結構(Disk Structure and Directory Structure)
* 磁碟可被分割成多個檔案系統

* 卷(volume):每個包含一個檔案系統的實體
* 每個檔案系統將系統中的檔案資訊存放在裝置目錄(device directory)或卷表內容(volume table of content)
* 目錄概觀
* 目錄可視為把檔名轉換成目錄進入點的符號表
* 目錄操作
* 搜尋
* 建檔
* 刪除
* 列出目錄
* 更改檔名
* 追蹤檔案系統
* 單層目錄(Single-Level Directory)
* 最簡單的目錄結構
* 當檔案增加,追蹤變得困難
* 必須使用獨一無二的檔案名稱(不同使用者也是)

* 雙層目錄(Two-Level Directory)
* 每個使用者擁有自己的使用者檔案目錄(UFD,user file directory)
* 主目錄檔使用使用者的名稱作為索引
* 如果要指定一個檔案
* 路徑名稱(path name)
* 例如:使用者A希望使用自己的測試檔,他只需使用test.txt,若使用者A希望使用使用者B的測試檔,他則需使用/userb/test.txt

* 樹狀目錄
* 允許使用者建立自己的子目錄

* 現用目錄(currrent directory):包含使用者目前最感興趣的大部分檔案
* 如果要指定一個檔案
* 以上圖first來說
* 絕對路徑名稱(absolute path name):root/spell/mail/ptr/first
* 相對路徑名稱(relative path name):/ptr/first(目前目錄為root/spell/mail)
* 非循環圖形目錄(Acyclic-Graph Directories)
* 允許共用的子目錄或檔案共享
* 鍊(link):指向其他檔案或目錄的指標
* 不會有循環,但要避免循環的代價高

* 一般圖形目錄(General Graph Directory)
* 會有循環,可能導致搜尋時無限迴圈(解決:限制目錄被存取的次數)
* 廢置空間收集法(garbage collection):判斷資料何時被刪除及磁碟空間可否重新分配

### 檔案系統安裝(File System Mounting)
* 檔案系統必須先安裝才可以被系統的行程取得
* 安裝點(mount point):系統和連結上此檔案系統的檔案結構中的位置


### 檔案分享(File Sharing)
* 多位使用者
* 系統必須對分享製作保護
* 檔案或目錄的
* 擁有者(owner)/使用者(user):可以更改屬性、授予存取權利、最大控制權的使用者
* 群組(group):可以分享檔案的一小組使用者
* 遠端檔案系統
* 遠端檔案分享的方法
* 使用檔案傳輸協定(FTP,File Transfer Protocol):在機器間傳輸
* 分散式的檔案系統(DFS,distributed file system):讓遠端的目錄在本地端能被發現
* 全球資訊網(World Wide Web):網頁瀏覽器用來取得遠端檔案的存取權
* 匿名存取(anonymous access):允許使用者在遠端系統上沒有帳號就可以傳輸
* 客戶-伺服器模型(Client-server)
* 伺服器(sever):包含檔案
* 客戶(client):希望存取檔案
* 認證客戶較難,辨識符號(IP等等)可以偽造
* 分散式資訊系統(distributed information system)
* 領域名稱系統(DNS,domain name system):提供主機名稱到網路位址的轉換
* 使客戶-伺服器的管理更簡單
* 失效模式
* 因為網路或伺服器的錯誤,遠端檔案系統有許多失效模式
* 製作從失效復原的模式,需維護客戶及伺服器的狀態資訊(state information)
* UNIX的網路檔案系統(NFS,network file system)傳送所有必要的資訊來找到檔案,容易復原,但安全性低
* 一致性語意(consistency semantics)
* 規定多個使用者同時存取一個共同檔案的語意
* 檔案會議(file session):一個使用者對檔案存取的一連串動作
* UNIX系統
* 一位使用者寫入時,可被其他也開啟該檔案的使用者看見
* Andrew系統(OpenAFS):
* 一位使用者寫入時,無法被其他也開啟該檔案的使用者看見
* 所做的改變只能在下一次到會議中看見(其他使用者要重開才看的到改變)
* 不變共用檔案(immutable shared file):唯讀,不會改變
### 保護(Protection)
* 保護需要的是帶有管制的存取
* 存取型態(Types of access)
* 讀取
* 寫入
* 執行
* 附加
* 刪除
* 列出
* 存取控制
* 存取控制列表(ACL,access-control list):對應使用者與他被允許的存取類型
* 如果每個使用者都要對應,ACL可能會很長,將使用者分為三類
* 擁有者(owner)
* 群組(group)
* 其他人(iniverse)
* UNIX系統中使用九個位元紀錄三類使用者的權限(rwxrwxrwx)
* r-讀取
* w-寫入
* x-執行

* Windows經由GUI管理存取控制列表

* 其他保護方法
* 使用密碼
* 除了保護檔案,還要保護目錄
* 例如:刪除或列出目錄中的檔案