內容已複查
37 分鐘 · 6 張概念卡 · 8 題對應考古題

檔案、儲存與 I/O:從 inode 到 buffering

本頁為依教材與考古題整理的原創摘要;考古題答案經技術覆核,但不是官方答案。

第一次接觸也沒關係

這堂先懂這些詞

先記住白話意思,不必急著背英文。看到正文時,再把正式名稱接回來。

緩衝

也會看到:buffer、buffering、I/O buffer

先把速度不一致的資料暫放一區,再分批處理或傳送。

生活例子:
像外送員先把多張訂單集中,再一次送往同一區域。
別搞混:
buffer 重點是平滑資料流;cache 重點是重複使用以加速。

裝置驅動程式

也會看到:device driver、firmware

作業系統透過 driver 控制硬體;firmware 則是運行在裝置內部的低階程式。

生活例子:
像作業系統請翻譯員下達命令,而家電內建控制板自己執行裝置細節。
別搞混:
Driver 與 firmware 所在位置和責任不同,也不是一般應用程式。

動態連結

也會看到:dynamic linking、dynamic linker、loader、shared library

程式啟動或執行時,再把需要的共享程式庫載入並接到程式上。

生活例子:
像活動開始時才從共用器材室領取大家都會用的麥克風。
別搞混:
動態連結不是每次都重新編譯原始碼,且缺少相容程式庫仍可能啟動失敗。

inode

也會看到:index node、索引節點

Unix 類檔案系統用來保存檔案屬性與資料位置的紀錄。

生活例子:
像圖書館書目卡記錄書在哪個書架,但書名標籤可另行管理。
別搞混:
inode 通常不直接保存檔名;檔名由目錄項目連到 inode。

排隊式輸出

也會看到:spooling、print spooler

先把多個輸出工作存入佇列,再由慢速或獨占裝置依序處理。

生活例子:
多人送印時先進列印佇列,印表機一次完成一份。
別搞混:
Spooling 管理整份工作排隊;buffering 通常平衡資料傳輸速度,兩者不完全相同。

從作業系統提供的 file abstraction 出發,理解 directory、inode、device driver、buffering、spooling 與 dynamic linking 的角色。完成後能判斷資料放在哪裡、誰負責控制裝置,以及慢速 I/O 如何與程式執行解耦。對應考古題答案均為非官方技術覆核。

先抓住這幾件事

  • 說明 file system 如何以 directory entry、metadata 與 data blocks 組織檔案。
  • 區分 device driver、firmware 與一般 application 的責任。
  • 比較 buffering 與 spooling 的資料流與適用情境。
  • 追蹤 executable 啟動時 loader 與 dynamic linker 使用持久儲存和 RAM 的流程。

先想像這個場景

機場如何從旅客名字找到行李

機場不會把旅客名字直接刻在行李存放格上。櫃檯先用目錄找到行李紀錄,紀錄保存擁有者、大小與存放位置,再去正確區塊取出內容。行李輸送設備也不直接理解每個應用程式的請求,需要作業系統中的專用控制軟體把通用 I/O 要求轉成裝置操作。

先別急著往下看,花十秒想一想:

如果兩張不同的領取單都指向同一筆行李紀錄,撕掉其中一張後,行李是否必然立刻被丟棄?

把故事換成電腦語言

生活中的角色對應到技術概念
櫃檯目錄把旅客使用的名稱連到一筆行李紀錄directory entry 將 filename 對應到檔案識別資訊/inode
行李紀錄保存權限、大小、時間與存放格位置,但不是行李本身inode 保存 metadata 與 data-block pointers,通常不保存 filename 或完整內容
輸送帶操作員把櫃檯的通用要求轉成特定機器命令device driver 將 OS 的通用 I/O requests 轉成裝置操作並協調 interrupts/data transfer
輸送帶旁的小暫存區吸收送入與取走速度差buffering 以 memory 暫存資料流,吸收 producer/consumer 的速度或單位差異
一整車一整車的行李工作先排隊,再由單一裝卸口依序處理spooling 保存可獨立排程的完整 jobs,讓慢速裝置稍後依 queue 服務

題目出現這些字,先想到

  • Filename 通常在 directory entry;inode 放 metadata 與 data-block pointers;實際 bytes 在 data blocks。
  • 把通用 OS I/O request 轉成特定裝置操作的是 device driver,不是一般 application 或 firmware 的同義詞。
  • 平滑持續資料流的速度差先想到 buffering;讓 printer 等慢速裝置排完整 jobs 先想到 spooling。
  • 啟動時尋找 shared library、映射 code、解析 symbols/relocations 是 dynamic linker;它不是 compiler 或 assembler。

1.File abstraction 與常見 file systems

作業系統把持久儲存裝置(硬碟、SSD)的原始區塊抽象成 file(檔案)和 directory(目錄),讓應用程式透過統一的介面(open、read、write、close)存取資料,不需要直接操作磁碟的 sector 和 track。 【File 的屬性】每個 file 有:name(檔名)、type(類型,通常由副檔名暗示但不絕對)、size(大小)、location(磁碟上的位置)、timestamps(建立/修改/存取時間)、permissions(讀/寫/執行權限)、owner(擁有者)。 【Directory 結構】目錄本身也是一種特殊的 file,內容是「檔名 → inode/metadata 位置」的對照表。目錄可以包含子目錄,形成樹狀階層結構。路徑(path)用來定位檔案:absolute path 從根目錄開始(如 /home/user/file.txt),relative path 從目前目錄開始(如 ./file.txt)。 【常見 File Systems】 • FAT32:簡單、跨平台相容(USB 隨身碟常用),但單一檔案最大 4 GB、分割區最大 2 TB。 • NTFS:Windows 的標準檔案系統,支援權限、加密、日誌、大檔案。 • ext4:Linux 的主流檔案系統,支援日誌、大容量、快速恢復。 • APFS:Apple 的現代檔案系統(macOS/iOS),支援快照、加密、space sharing。 • HFS+:Apple 的舊檔案系統,已被 APFS 取代。 注意:MS-DOS 是作業系統的名稱,不是 file system。exFAT 是 FAT32 的改良版(解除 4GB 限制),常用於大容量 SD 卡。 【考試連結】(1) 區分 file system(FAT32、NTFS、ext4)和 operating system(Windows、Linux、macOS)。(2) FAT32 的 4GB 單檔限制是常考知識點。(3) File system 的選擇通常取決於作業系統相容性和功能需求。

  • file system 定義命名、metadata、空間配置與存取規則。
  • directory 建立名稱到檔案識別資訊的對應,不等於保存全部檔案內容。
  • 不同 file systems 支援的權限、journal、容量與平台相容性不同。
  • 『常見』會隨平台改變;作答應先辨認候選項是否確實是 file system。

2.inode、metadata 與 data blocks

在 Unix-like file systems(如 ext4)中,檔案的管理資訊和實際資料是分開儲存的: 【inode(Index Node)】每個 file 和 directory 對應一個 inode,存放 metadata(元資料): • File type(普通檔案、目錄、symbolic link 等) • Permissions(rwx for owner/group/others) • Owner UID 和 Group GID • File size(bytes) • Timestamps(atime, mtime, ctime) • 指向 data blocks 的 pointer 注意:inode 不存儲檔名!檔名存在 directory entry 中(directory 是「檔名 → inode number」的對照表)。這就是為什麼一個 file 可以有多個 hard link — 多個 directory entry 指向同一個 inode。 【Data blocks】檔案的實際內容(文字、圖片、程式碼…)存在 data blocks 中。inode 中有指向這些 blocks 的 pointer。對於小檔案,直接 pointer 就夠了。對於大檔案,使用多級間接 pointer(indirect, double indirect, triple indirect)來索引更多 blocks。 【具體範例】 $ ls -li /home/user/ 12345 -rw-r--r-- 2 user group 1024 Aug 17 file.txt • 12345 是 inode number • -rw-r--r-- 是 permissions • 2 是 hard link count • user/group 是 owner • 1024 是 file size • Aug 17 是修改時間 • file.txt 是檔名(存在 directory entry 中,不在 inode 中) 【Hard link vs Symbolic link】Hard link 是另一個 directory entry 指向同一個 inode(link count 增加)。Symbolic link(soft link)是一個特殊檔案,內容是目標檔案的路徑。刪除原檔後,hard link 仍可存取(因為 inode 還在),symbolic link 變成 dangling(斷裂的)。 【考試連結】(1) inode 存什麼、不存什麼(不存檔名)。(2) Hard link 和 symbolic link 的差異。(3) inode 的 pointer 結構如何支援大檔案。

  • metadata 描述檔案;data blocks 保存實際 bytes。
  • 多個 hard links 可讓不同 directory entries 指向同一 inode。
  • 刪除一個名稱不一定立刻刪除內容,仍取決於 link count 與開啟參照。
  • inode 是 Unix-like 設計概念,不應硬套成所有 file systems 的相同內部結構。

3.Device driver 與 storage management 責任

Device driver 是作業系統中與特定硬體裝置溝通的軟體模組。它把 OS kernel 的通用 I/O request 翻譯成該裝置能理解的具體操作指令,並處理裝置的中斷回應。 【Driver vs Firmware】 • Driver 在 OS 軟體層級執行,隨 OS 載入。每種裝置型號通常需要對應的 driver。 • Firmware 在裝置本身或主機板上的 ROM/Flash 中執行(如 BIOS/UEFI、SSD controller firmware)。Firmware 在 OS 啟動之前就已運作。 【OS 的 Storage Management 責任】 作業系統管理儲存裝置的多個面向: (1) File system management — 建立和維護 file/directory 的邏輯結構。 (2) Free space management — 追蹤哪些 disk blocks 是空閒的(bitmap 或 linked list)。 (3) Disk scheduling — 決定讀寫 request 的執行順序(適用於 HDD,SSD 因無機械臂不太需要)。常見演算法:FCFS(先來先服務)、SSTF(最短尋道時間優先)、SCAN(電梯演算法,一個方向掃到底再反轉)、C-SCAN(只往一個方向掃描,到底後跳回起點)。 (4) Backup and recovery — 定期備份到穩定儲存媒體。 【RAID 回顧】RAID 把多顆磁碟組合成邏輯上的一個儲存單元。RAID 0(striping,效能↑容錯×)、RAID 1(mirroring,容錯↑容量×0.5)、RAID 5(distributed parity,效能↑容錯↑,允許壞一顆碟)、RAID 6(double parity,允許壞兩顆)、RAID 10(1+0,striping + mirroring)。 【考試連結】(1) Driver 和 firmware 的差異。(2) Disk scheduling 演算法的比較。(3) RAID 各等級的特性。(4) 注意 RAID 不等於備份 — RAID 防硬體故障,但不防人為刪除、病毒或邏輯錯誤。

  • application 呼叫系統提供的 I/O API,不需知道裝置暫存器細節。
  • driver 處理裝置命令、interrupt 與資料傳輸協調。
  • disk scheduling 決定等待中的 storage requests 如何服務。
  • 備份到 stable storage 可列入 OS storage management;不要與 file integrity check 混淆。

4.Buffering、spooling 與載入共享程式庫

【Buffering(緩衝)】Buffer 是記憶體中的暫存區域,用來調和 producer 和 consumer 之間的速度差異或資料單位差異。例如鍵盤輸入一個字元是 1 byte,但磁碟讀寫以 block(通常 4 KB)為單位 — buffer 把零散的鍵盤輸入累積到足夠大小後再一次寫入磁碟。 類型:Single buffer(一個 buffer 交替讀寫)、Double buffer(兩個 buffer,producer 寫 A 的同時 consumer 讀 B,提高平行度)、Circular buffer(多個 buffer 組成環形佇列)。 【Spooling(Simultaneous Peripheral Operations On-Line)】Spooling 把完整的 job 排入持久的佇列,讓慢速且一次只服務一個 job 的裝置依序處理。最經典的例子是印表機 spooler:多個程式同時提交列印任務,spooler 把它們存到磁碟上的佇列中,印表機依序取出列印。這避免了一個程式佔住印表機等待其他程式完成的問題。 【Buffering vs Spooling】Buffer 在記憶體中暫存正在傳輸中的資料(短期、小量),Spooling 把完整的 job 存到磁碟佇列中排隊等待(長期、大量)。Buffer 是 byte/block 等級的流量匹配,Spool 是 job/document 等級的排隊系統。 【Dynamic Linking 與 Shared Libraries】執行程式(executable)時,loader 在記憶體中建立 process image。如果程式使用 shared libraries(如 Linux 的 .so、Windows 的 .dll),dynamic linker 在程式啟動時(或首次呼叫時)把需要的 library 映射到 process 的 address space。多個 process 可以共享同一份 library 的 physical memory,節省記憶體。 靜態連結(static linking)在編譯時就把 library code 複製到 executable 中 — 檔案更大但不依賴外部 library。動態連結(dynamic linking)在執行時載入 — 檔案小但需要 library 在系統中存在。 【考試連結】(1) Buffering 和 spooling 的差異是常考選擇題。(2) Shared library 的優點(節省記憶體、更新方便)和缺點(DLL hell、版本衝突)。(3) 不要把 buffer 和 cache 混淆 — buffer 是流量匹配,cache 是利用 locality 加速存取。

  • streaming read/write 常以 buffers 減少小量 I/O 次數與速度落差。
  • printer spool 讓 application 提交 job 後繼續執行,printer 再依 queue 處理。
  • buffer 通常服務正在進行的資料流;spool 通常保存可獨立排程的完整 jobs。
  • dynamic linker 在 runtime 解析 shared-library dependencies;它不是 assembler,也不是產生 source code 的工具。

一起拆題目

範例 1路徑 /home/mei/report.txt 已存在。請用 inode 模型說明系統如何找到檔案內容。

  1. 從 root directory 的 entry 找到 home 對應的檔案系統識別資訊。
  2. 依序查 home 與 mei directories 的 entries。
  3. 由 report.txt 的 directory entry 取得對應 inode。
  4. 讀取 inode 的權限、size 與 data-block pointers,再從 blocks 取得內容。

所以答案是:directory entries 負責名稱解析,inode 提供 metadata 與資料區塊位置,實際內容位於 data blocks。

範例 2音訊播放程式先讀入一小段資料再持續播放;列印程式把 200 頁工作交出後立刻返回。兩者分別較像 buffering 還是 spooling?

  1. 音訊是持續資料流,需要暫存一段資料吸收讀取與播放速度差。
  2. 這符合 buffering。
  3. 列印工作可作為完整 job 排隊,由單一慢速裝置稍後處理。
  4. 這符合 spooling。

所以答案是:音訊使用 buffering;列印工作使用 spooling。前者平滑資料流,後者排程完整 jobs。

範例 3程式啟動時宣告缺少 libcalc.so。請從 persistent storage 到執行前說明 dynamic linker 原本應做的事。

  1. loader 先建立 executable 的 process image。
  2. dynamic linker 讀取 executable 記錄的 shared-library dependencies。
  3. 它尋找 libcalc.so,將必要 pages 映射或載入 RAM。
  4. 接著解析 symbols、處理必要 relocations;找不到 library 時啟動失敗。

所以答案是:dynamic linker 必須找到並映射 shared library,再完成 symbol resolution/relocation;缺少 library 使相依關係無法滿足。

範例 4兩個 hard links,/a/report 與 /b/archive,指向同一 inode。刪除 /a/report 後資料是否必然立即消失?

  1. 兩個 directory entries 指向同一 inode。
  2. 刪除 /a/report 只移除其中一個名稱並降低 link count。
  3. /b/archive 仍指向同一 inode。
  4. 只要仍有 link 或開啟參照,檔案內容通常不會被回收。

所以答案是:不會必然立即消失;/b/archive 仍可存取同一 inode 與資料,直到 links 與相關開啟參照都釋放。

這裡最容易選錯

  • 看到名稱含 Disk 就把 MS-DOS 當成 file system;它是 operating system。
  • 把 inode 說成保存檔名或完整檔案內容;檔名通常在 directory entry,內容在 data blocks。
  • 把 firmware 與 device driver 混為一談,忽略 driver 與 OS 介面的角色。
  • 把所有 temporary storage 都叫 spooling;一般資料流暫存較接近 buffering。
  • 把 file integrity check 當成標準 OS storage-management 責任清單項目;典型清單反而包含備份到 stable storage。
  • 把 dynamic linker 誤認為 compiler、assembler 或一般 code generator。

換你快速判斷

先在心中作答,再展開答案。答不出來時,回頭找本課的對照關係。

1File system 與 operating system 有何差別?

File system 是命名、metadata 與儲存配置的資料組織規則;operating system 是管理 CPU、memory、I/O 等資源的整體系統。

NTFS、exFAT、APFS、ext3 是 file systems;MS-DOS 是 operating system。

2Unix-like file system 的 inode 主要保存什麼?

檔案類型、權限、owner、size、timestamps,以及定位 data blocks 所需的資訊。

檔名通常位於 directory entry;實際檔案 bytes 位於 data blocks。

3Device driver 與 firmware 的角色如何區分?

Driver 在 OS 軟體堆疊中把通用 I/O request 轉成裝置操作;firmware 通常在裝置或平台環境中直接控制較底層硬體。

Driver 需符合裝置與 OS 介面,因此常同時具有 hardware-dependent 與 OS-specific 特性。

4Buffering 與 spooling 的核心差異是什麼?

Buffering 暫存進行中的資料流以吸收速度/單位差;spooling 將完整 jobs 排隊,交由慢速或獨占裝置稍後處理。

音訊串流常用 buffer;列印工作 queue 是典型 spool。

5Dynamic linker 在 executable 啟動時做什麼?

找到並映射所需 shared libraries,解析 symbols,並處理必要 relocations,使程式能呼叫 library code。

它在 runtime 連結相依元件,不是 assembler 或 source-code generator。

6哪些 storage-management 工作通常屬於 OS 核心責任?

Files/directories 的建立刪除與操作 primitives、空間管理、disk scheduling,以及備份到 stable storage;file integrity check 不在典型責任清單。

這是標準教材式的責任分類;實際系統仍可能由不同 utilities、services 或管理政策執行具體備份工作。

最後用考古題驗證

本課連結的題目都已通過可重現的技術覆核,可逐題練習與判分。

開始本課考古題練習

參考來源