Procfs

在許多類 Unix 計算機系統中， procfs 是 進程 文件系統 (file system) 的縮寫，包含一個偽文件系統（啟動時動態生成的文件系統），用於通過內核訪問進程信息。這個文件系統通常被掛載到 /proc 目錄。由於 /proc 不是一個真正的文件系統，它也就不佔用存儲空間，只是佔用有限的內存。
以下操作系統支持 procfs :- Solaris- BSD- Linux（將此概念擴展到了非進程相關數據）- IBM AIX （其實現基於Linux以提高兼容性）- QNX- 貝爾實驗室九號計畫（此概念之源頭）

**歷史**

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

**SVR4**
Roger Faulkner 和 Ron 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 ，轉而使用sysctl接口來獲取進程相關信息。默認安裝的 base 系統不依賴 procfs，FreeBSD 原生 ports 也不再依賴 procfs。macOS則完全棄用了procfs，只支持sysctl接口。
為了提供對Linux用戶空間程序的二進制兼容性，FreeBSD內核也提供類似於 Linux /proc/ 的linprocfs。

**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化進程訪問.- /proc/PID/root, 該進程所能看到的根路徑的符號鏈接。如果沒有chroot監獄，那麼進程的根路徑是/.- /proc/PID/status包含了進程的基本信息，包括運行狀態、內存使用。 - /proc/PID/task, 一個目錄包含了硬鏈接到該進程啟動的任何任務 
(用戶可以獲得PID使用工具如pgrep, pidof或ps:
$ 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, 信息關於夥伴內存分配器用於處理內存碎片。- /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"分別表示:
"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不支持超線程.   - /proc/crypto, 可利用的加密模塊列表- /proc/devices,  字符設備與塊設備列表，按照設備ID排序，但給出了/dev名字的主要部分- /proc/diskstats, 給出了每一塊邏輯磁盤設備的一些信息 - /proc/filesystems, 當前時刻內核支持的文件系統的列表 - /proc/interrupts, /proc/iomem, /proc/ioports, /proc/irq, 設備的一些與中斷、內存訪問有關的信息- /proc/kmsg, 用於跟蹤讀取內核消息 - /proc/meminfo, 包含內核管理內存的一些彙總信息 - /proc/modules, 是/proc最重要的文件之一, 包含了當前載入的內核模塊列表- /proc/mounts, 包含了當前安裝設備及安裝點的符號鏈接- /proc/net/, 一個目錄包含了當前網絡棧的信息，特別是/proc/net/nf_conntrack列出了存在的網絡連接(對跟蹤路由特別有用，因為iptables轉發被用於重定向網絡連接)- /proc/partitions, 一個設備號、尺寸與/dev名的列表，內核用於辨別已存在的硬盤分區- /proc/scsi, 給出任何通過SCSI或RAID控制器掛接的設備的信息- /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**

**外部鏈接**
  A MacFUSE-Based Process File System for Mac OS Xdate=20081002065916 -  Access the Linux kernel using the Procfsdate=20080602171649  An IBM developerWorks article by M. Tim Jones-  Linux-Filesystem-Hierarchydate=20080915163240  Linux Documentation Project

**參考**
  Red Hat, Inc. Tips & Tricks Featured Article: /proc/meminfo Explained, March 2003.date=20081008030727