檔案系統:介面
開啟檔案表(open-file table)
當你開啟一個檔案時,作業系統並不會在每一次讀取時都重新把它查一遍。那就像你每讀一個字就要重新到書架上找一次那本圖書館的書。取而代之,當你開啟檔案時,作業系統會在記憶體裡做一個小書籤,記住檔案使用期間它所需要的一切:檔案的中繼資料在哪、你目前在檔案的哪個位置、你被允許做什麼。開啟檔案表就是這些書籤的集合。
其實有兩層表格一起運作。有一張全系統的開啟檔案表,整台機器上每一個不同的開啟檔案各佔一筆,存放共享的事實,像是檔案在磁碟上的位置,以及目前有多少個開啟者正在用它(它的參考計數)。還有一張每行程的表,每個執行中的程式各有一張,存放那個程式自己的代號。你每行程表裡的一個代號指向全系統表裡的一筆,而那一筆又指向檔案的中繼資料。一個關鍵的「每次開啟」細節——你目前正在讀寫的位置——存在共享的開啟檔案結構裡,這正是為什麼對同一個檔案的兩次獨立開啟,各自會有自己獨立的位置。
為什麼重要:正是這種兩層設計,讓許多程式(以及一個程式的許多部分)能乾淨地共享檔案,也讓作業系統在恰好正確的時刻收回資源。全系統那筆的參考計數就是安全機制:作業系統只有在「最後一個」持有者關閉它時,才真正關閉檔案並釋放它在記憶體裡的結構。一個常見的混淆是以為你的檔案描述符本身存著位置——它並沒有,它是索引到這些表格中,而真正的狀態住在那裡。
兩個程式開啟同一個設定檔。全系統表裡那個檔案有一筆、參考計數為 2;每個程式的每行程表各有自己的代號指向它。當第一個程式關閉時,計數降為 1;只有當第二個也關閉,作業系統才釋放那一筆。
每行程的代號指向一張全系統表;參考計數守護著釋放的時機。
作業系統只有在「最後一個」開啟者關閉它(參考計數歸零)時,才釋放開啟檔案在記憶體裡的結構。忘記關閉會在這些有限的表格中洩漏出格子。
又称
另见