Open File Table Implementation

Open-file table 讓 open() 後的 file access 不必重複 pathname lookup。User 看到 file descriptor / handle;kernel 內部通常分成兩層。


System-Wide Open-File Table

全系統共享,每個 currently-open file 一筆 entry:

  • FCB / inode 的 in-memory copy。
  • data-block pointers、extent/index metadata。
  • open count / reference count。
  • shared locks、dirty metadata state。

同一 file 被多個 process open 時可共用此 entry,省下 directory lookup 與 metadata I/O。


Per-Process Open-File Table

每個 process 自己的 fd/handle namespace;entry 通常保存:

  • pointer to system-wide entry。
  • current file offset。
  • access mode / flags,例如 append、close-on-exec。

這讓不同 process 可 open 同一 file,但各有自己的 descriptor 與 offset;fork 後是否共享 offset 取決於 OS semantics。


Flow

open(pathname)
  → lookup/create system-wide entry
  → create per-process entry
  → return fd/handle
 
read(fd) / write(fd)
  → per-process entry
  → system-wide entry
  → FCB / block mapping

close(fd) 刪 per-process entry、遞減 open count;count 歸零才移除 shared entry,並寫回 dirty metadata。