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，每个目录包含:
 , 启动该进程的命令行.
 , 当前工作目录的符号链接.
  影响进程的环境变量的名字和值.
 , 最初的可执行文件的符号链接, 如果它还存在的话。 
 , 一个目录，包含每个打开的文件描述符的符号链接.
 , 一个目录，包含每个打开的文件描述符的位置和标记
 , 一个文本文件包含内存映射文件与块的信息。
 , 一个二进制图像(image)表示进程的虚拟内存, 只能通过化进程访问.
 , 该进程所能看到的根路径的符号链接。如果没有chroot监狱，那么进程的根路径是/.
 包含了进程的基本信息，包括运行状态、内存使用。 
 , 一个目录包含了硬链接到该进程启动的任何任务 

(用户可以获得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 上面）:

 电源管理系统（如果有的话）对应的目录或 
 , 信息关于用于处理内存碎片。
 , 包含对应于计算机上各种总线的目录, 如input/PCI/USB. 在/sys/bus下包含更丰富的信息。
 , 可利用的帧缓冲的列表
 , 传递给内核的启动选项。
 , 包含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不支持超线程.   
 , 可利用的加密模块列表
 ,  字符设备与块设备列表，按照设备ID排序，但给出了名字的主要部分
 , 给出了每一块逻辑磁盘设备的一些信息 
 , 当前时刻内核支持的文件系统的列表 
 , , , , 设备的一些与中断、内存访问有关的信息
 , 用于跟踪读取内核消息 
 , 包含内核管理内存的一些汇总信息 
 , 是最重要的文件之一, 包含了当前载入的内核模块列表
 , 包含了当前安装设备及安装点的符号链接
 , 一个目录包含了当前网络栈的信息，特别是列出了存在的网络连接(对跟踪路由特别有用，因为iptables转发被用于重定向网络连接)
 , 一个设备号、尺寸与名的列表，内核用于辨别已存在的硬盘分区
 , 给出任何通过SCSI或RAID控制器挂接的设备的信息
  (即其中进程ID是当前进程的) 为当前进程的符号链接 
 , Linux内核频繁使用的对象的统计信息 
 , 活动交换分区的信息，如尺寸、优先级等。 
 ，动态可配置的内核选项. 其下的目录对应与内核区域，包含了可读与可写的虚拟文件（virtual file）. 
 , 包括共享内存与进程间通信 (IPC)信息
 , 包含当前终端信息; 是可利用的tty类型列表，其中的每一个是该类型的可用设备列表。
 , 内核启动后经过的秒数与idle模式的秒数 
 , 包含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 X
 Access the Linux kernel using the Procfs An IBM developerWorks article by M. Tim Jones
 Linux-Filesystem-Hierarchy Linux Documentation Project

 参考 

 Red Hat, Inc. Tips & Tricks Featured Article: /proc/meminfo Explained, March 2003.

Category:Unix文件系统技术
Category:Linux内核功能
Category:特殊目的文件系统
Category:Linux内核接口