在许多类 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]

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中的 /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.