在許多類 Unix 計算機系統中, procfs進程 文件系統 (file system) 的縮寫,包含一個偽文件系統(啟動時動態生成的文件系統),用於通過內核訪問進程信息。這個文件系統通常被掛載到 /proc 目錄。由於 /proc 不是一個真正的文件系統,它也就不占用存儲空間,只是占用有限的內存。

以下操作系統支持 procfs :

歷史 編輯

UNIX 8 編輯

Tom J. Killian 實現了 UNIX 8 版本的 /proc:他1984年6月向 USENIX 提交了一份題為 "Processes as Files" 的論文。procfs 的設計目標是用來替代進行進程跟蹤的 ptrace 系統調用。 詳細文檔請參考當時的 proc(4) 用戶手冊[1]

SVR4 編輯

Roger FaulknerRon Gomes 將 Unix 8 的 /proc 移植到了 SVR4,並在1991年1月的 USENIX 上發表了一篇題為 "The Process File System and Process Model in UNIX System V" 的論文。 此類 procfs 在功能上已經足夠實現 ps 命令了, 但是其中的文件只能通過 read()write()ioctl() 系統調用來訪問。從1995到1996年, Roger Faulkner 又為 Solaris 2.6 編寫了 procfs-2 接口, 提供了一個結構化的, 基於子目錄的 /proc 文件系統。

Plan 9 編輯

Plan 9 實現了一個進程文件系統,但比 V8 做得更多。V8 的進程文件系統中,對一個進程相關的所有函數都在一個文件進行操作。九號計畫使用單獨的文件,提供這些函數,使得 /proc 成為文件系統真正的一部分。

4.4BSD 編輯

4.4BSD 從 Plan 9 復刻了 /proc 的實現。然而從2011年2月開始, FreeBSD 逐步淘汰了 procfs [2],轉而使用sysctl接口來獲取進程相關信息。默認安裝的 base 系統不依賴 procfs,FreeBSD 原生 ports 也不再依賴 procfs。macOS則完全棄用了procfs,只支持sysctl接口。[3]

為了提供對Linux用戶空間程序的二進制兼容性,FreeBSD內核也提供類似於 Linux /proc/ 的linprocfs[4]

Solaris 編輯

Solaris 從一開始就提供對 /proc 的支持。 在1996年, Solaris 2.6 引入了由 Roger Faulkner 編寫的 procfs2 。

Linux 編輯

Linux中的 /proc實現也克隆了 九號計畫 中對應的部分。

每個正在運行的進程對應於/proc下的一個目錄,目錄名就是進程的PID,每個目錄包含:

  • /proc/PID/cmdline, 啟動該進程的命令行.
  • /proc/PID/cwd, 當前工作目錄符號鏈接.
  • /proc/PID/environ 影響進程的環境變量的名字和值.
  • /proc/PID/exe, 最初的可執行文件的符號鏈接, 如果它還存在的話。
  • /proc/PID/fd, 一個目錄,包含每個打開的文件描述符的符號鏈接.
  • /proc/PID/fdinfo, 一個目錄,包含每個打開的文件描述符的位置和標記
  • /proc/PID/maps, 一個文本文件包含內存映射文件與塊的信息。
  • /proc/PID/mem, 一個二進制圖像(image)表示進程的虛擬內存, 只能通過ptrace英語ptrace化進程訪問.
  • /proc/PID/root, 該進程所能看到的根路徑的符號鏈接。如果沒有chroot監獄,那麼進程的根路徑是/.
  • /proc/PID/status包含了進程的基本信息,包括運行狀態、內存使用。
  • /proc/PID/task, 一個目錄包含了硬鏈接到該進程啟動的任何任務

(用戶可以獲得PID使用工具如pgrep, pidofps:

$ ls -l /proc/$(pgrep -n python)/fd        # List all file descriptors of the most recently started `python' process
samtala 0
lrwx------ 1 baldur baldur 64 2011-03-18 12:31 0 -> /dev/pts/3
lrwx------ 1 baldur baldur 64 2011-03-18 12:31 1 -> /dev/pts/3
lrwx------ 1 baldur baldur 64 2011-03-18 12:31 2 -> /dev/pts/3
$ readlink /proc/$(pgrep -n python)/exe    # List executable used to launch the most recently started `python' process  
/usr/bin/python3.1

)

Linux 2.6把 /proc 下大量的非進程相關的系統信息移動到一個專門的偽文件系統,稱為 sysfs(該文件系統是掛載到 /sys 上面):

  • 電源管理系統(如果有的話)對應的目錄/proc/acpi/proc/apm
  • /proc/buddyinfo, 信息關於夥伴內存分配器英語Buddy memory allocation用於處理內存碎片。[5]
  • /proc/bus, 包含對應於計算機上各種總線的目錄, 如input/PCI/USB. 在/sys/bus下包含更豐富的信息。
  • /proc/fb, 可利用的幀緩衝的列表
  • /proc/cmdline, 傳遞給內核的啟動選項。
  • /proc/cpuinfo, 包含CPU信息, 諸如廠商(vendor),型號 (family, model,model names), 速度, 緩存大小, 邏輯核數 , 物理核數, CPU flags,以及BogoMips.對於多核CPU,/proc/cpuinfo的邏輯核數"siblings"與物理核數"cpu cores"分別表示:[6]
"siblings" = (HT per CPU package) * (# of cores per CPU package)
"cpu cores" = (# of cores per CPU package)

CPU package是指單獨封裝的一顆CPU。這可以區分超線程與雙核,例如每顆CPU超線程數量為siblings / CPU cores. 如果二者的值相等,則CPU不支持超線程.[7]

  • /proc/crypto, 可利用的加密模塊列表
  • /proc/devices, 字符設備與塊設備列表,按照設備ID排序,但給出了/dev名字的主要部分
  • /proc/diskstats, 給出了每一塊邏輯磁盤設備的一些信息
  • /proc/filesystems, 當前時刻內核支持的文件系統的列表
  • /proc/interrupts, /proc/iomem, /proc/ioports, /proc/irq, 設備的一些與中斷、內存訪問有關的信息
  • /proc/kmsg, 用於跟蹤讀取內核消息 [8]
  • /proc/meminfo, 包含內核管理內存的一些匯總信息
  • /proc/modules, 是/proc最重要的文件之一, 包含了當前載入的內核模塊列表
  • /proc/mounts, 包含了當前安裝設備及安裝點的符號鏈接
  • /proc/net/, 一個目錄包含了當前網絡棧的信息,特別是/proc/net/nf_conntrack列出了存在的網絡連接(對跟蹤路由特別有用,因為iptables轉發被用於重定向網絡連接)
  • /proc/partitions, 一個設備號、尺寸與/dev名的列表,內核用於辨別已存在的硬盤分區
  • /proc/scsi, 給出任何通過SCSIRAID控制器掛接的設備的信息
  • /proc/self (即/proc/PID/其中進程ID是當前進程的) 為當前進程的符號鏈接
  • /proc/slabinfo, Linux內核頻繁使用的對象的統計信息
  • /proc/swaps, 活動交換分區的信息,如尺寸、優先級等。
  • /proc/sys,動態可配置的內核選項. 其下的目錄對應與內核區域,包含了可讀與可寫的虛擬文件(virtual file).
  • /proc/sysvipc, 包括共享內存與進程間通信 (IPC)信息
  • /proc/tty, 包含當前終端信息; /proc/tty/driver是可利用的tty類型列表,其中的每一個是該類型的可用設備列表。
  • /proc/uptime, 內核啟動後經過的秒數與idle模式的秒數
  • /proc/version, 包含Linux內核版本,發布號(distribution number), 編譯內核的gcc版本,其他相關的版本
  • 其他文件依賴於不同的硬件,模塊配置與內核改變

Linux下使用 /proc 的基本工具是 procps (/proc processes) 中的程序,這個程序只對 procfs 具有意義。procfs 對部分功能從核心態移到用戶態的過程中產生重大的意義。像是 GNU 版本的 ps 只需在用戶態底下運作透過 procfs 取得資料便可以完成所有的工作。

相關命令:

  • sysctl
  • lsdev 收集相關設備的DMA, IRQ, I/O端口信息並匯總顯示
  • procinfo

Cygwin 編輯

Cygwin實現的 /proc 與Linux基本一致。

Cobalt 編輯

外部連結 編輯

參考 編輯

  1. ^ proc(4) manual page. [2011-01-05]. (原始內容存檔於2012-02-19). 
  2. ^ procfs:已是过去式但仍未被遗忘. [2011-03-21]. (原始內容存檔於2011-04-05). 
  3. ^ Amit Singh. /proc on Mac OS X. Mac OS X Internals: The Book. 2003 [2021-07-10]. (原始內容存檔於2012-05-04). 
  4. ^ linprocfs(5). FreeBSD Manual Pages. The FreeBSD Project. 2019-11-13 [2021-06-12]. (原始內容存檔於2021-06-12) (英語). 
  5. ^ 3.2.2. /proc/buddyinfo. centos.org. [2016-10-02]. (原始內容存檔於2013-09-02). 
  6. ^ Baron, Jason. HT vs. dual-core. [2016-10-02]. (原始內容存檔於2016-05-13). 
  7. ^ Understanding Linux /proc/cpuinfo. richweb.com. [2015-04-21]. (原始內容存檔於2012-04-03). 
  8. ^ Nguyen, Binh. Linux Filesystem Hierarchy. Binh Nguyen: 63. 2004-07-30 [2016-07-18]. (原始內容存檔於2016-12-14). /proc/kmsg[:] Messages output by the kernel. These are also routed to syslog.