procfs

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

簡介

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

以下作業系統支持 procfs:

•Solaris

•BSD

•Linux(將此概念擴展到了非進程相關數據)

•IBM AIX(其實現基於Linux以提高兼容性)

•QNX

•貝爾實驗室九號項目(此概念之源頭)

歷史

UNIX 8th Edition

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

SVR4

Roger Faulkner和Ron Gomes將 V8 的/proc移植到了SVR4,並在1991年1月的USENIX上發表了一篇題為 "The Process File System and Process Model in UNIX System V" 的論文。此類 procfs 支持ps的創建,但是檔案只能由如下函式訪問:read(),write(),ioctl().

九號項目

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

4.4BSD

4.4BSD基於九號項目 克隆得到了其/proc系統。注意,在 FreeBSD 中 procfs 已被放棄。默認安裝的 base 系統不依賴 procfs,FreeBSD 原生 ports 也不再依賴 procfs。

Solaris

Solaris 2.6 的/proc(完成於 1996)也克隆了九號項目.

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' processsamtala 0lrwx------ 1 baldur baldur 64 2011-03-18 12:31 0 -> /dev/pts/3lrwx------ 1 baldur baldur 64 2011-03-18 12:31 1 -> /dev/pts/3lrwx------ 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

)

Linux2.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(/procprocesses) 中的程式,這個程式只對 procfs 具有意義。procfs 對部分功能從核心態移到用戶態的過程中產生重大的意義。像是 GNU 版本的 ps 只需在用戶態底下運作透過 procfs 獲取數據便可以完成所有的工作。

相關命令:

•sysctl

•lsdev 收集相關設備的DMA, IRQ, I/O連線埠信息並匯總顯示

•procinfo

相關詞條

相關搜尋

熱門詞條

聯絡我們