Loading AI tools
来自维基百科,自由的百科全书
在许多类 Unix 计算机系统中, procfs 是 进程 文件系统 (file system) 的缩写,包含一个伪文件系统(启动时动态生成的文件系统),用于通过内核访问进程信息。这个文件系统通常被挂载到 /proc
目录。由于 /proc 不是一个真正的文件系统,它也就不占用存储空间,只是占用有限的内存。
以下操作系统支持 procfs :
Tom J. Killian 实现了 UNIX 8 版本的 /proc
:他1984年6月向 USENIX 提交了一份题为 "Processes as Files" 的论文。procfs 的设计目标是用来替代进行进程跟踪的 ptrace 系统调用。 详细文档请参考当时的 proc(4) 用户手册[1]。
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 实现了一个进程文件系统,但比 V8 做得更多。V8 的进程文件系统中,对一个进程相关的所有函数都在一个文件进行操作。九号计画使用单独的文件,提供这些函数,使得 /proc
成为文件系统真正的一部分。
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 从一开始就提供对 /proc
的支持。 在1996年, Solaris 2.6 引入了由 Roger Faulkner 编写的 procfs2 。
Linux中的 /proc
实现也克隆了 九号计画 中对应的部分。
每个正在运行的进程对应于/proc
下的一个目录,目录名就是进程的PID,每个目录包含:
(用户可以获得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
上面):
"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]
Linux下使用 /proc
的基本工具是 procps (/proc
processes) 中的程序,这个程序只对 procfs 具有意义。procfs 对部分功能从核心态移到用户态的过程中产生重大的意义。像是 GNU 版本的 ps 只需在用户态底下运作透过 procfs 取得资料便可以完成所有的工作。
相关命令:
Cygwin实现的 /proc
与Linux基本一致。