Overview

- 當 User Process 要讀 Hard Disk 時,會 Trapped in Kernel 後,先查看 buffer cache 中以前有沒有取過同一段資料:
- 如果有,則從 buffer cache 取出直接回傳
- 反之,進入 Hard Disk 取出所需資料(因為 SSD 和 HDD 物理限制,一次取出的資料可能會大於所需資料)

Per-Process Data Structure
在此範圍內的物件都是對於每一個 Process 都會建立一個新的物件
FILE Object
包括 File Descriptor 和 buffer,當我們要取用資料 Buffered I/O 都會先查看此處 buffer 是否已經取用資料
- 如果已取用,就不用 Trapped in kernel 到 Open file desc. table
- 否則需要進入 kernel mode 進入更深處尋找資料 每個 Process 都有 File Descriptor 的上限,當超過上限,就不可以再開啟新的檔案了
只有此層在 User Space/Mode,橘線往右都是 Kernel Space/Mode 運行處
Unbuffered I/O 的 Unbuffered 指的是他沒有 user space 的 buffer,所以所有 Unbuffered I/O 都需要 Trapped in kernel
Open File Desc. Table
此處將 FILE Object 儲存的 file descriptor 映射到 Open file table 的物件
Kernel (global & shared) Data Structures
這裡的物件是整個 OS 共享的,每個 Process 都會存取同一個這裡的物件
Open File Table
任何 Process 進行資料存取操作都會在此產生一個條目,他會記錄
- 開啟的模式(read、write…)
- 訪問什麼文件
- Non-Blocking
- Asynchronized IO
所以每次開啟都會被記錄在上面
Table 中的每個條目都有 Reference Count ,紀錄有幾個 descriptor 指向它
i-node table (index-node table)
此處紀錄了資料的 Metadata,對於一個檔案,就算多個 process 開啟這個檔案好幾次,在 i-node table 只會被記錄一次
Table 中每個條目都有 Reference Count,紀錄有多少個 Open File 條目指向它
當 Reference Count 減至 0 ,就可以安全地清理這個條目用到的資源了
Buffer Cache
我們會將最近取用過的文件存在 Buffer Cache,這樣再次取用就不用再去 Hard Disk 讀
Disk
儲存資料的地方