在許多類 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.