Procfs

来自Local Chinese Wikipedia
跳转到导航 跳转到搜索

Template:NoteTA Template:Lowercase 在许多类 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,每个目录包含:

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

"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 取得资料便可以完成所有的工作。

相关命令:

  • sysctl
  • lsdev 收集相关设备的DMA, IRQ, I/O端口信息并汇总显示
  • procinfo

Cygwin[编辑]

Cygwin实现的 /proc 与Linux基本一致。

Cobalt[编辑]

外部链接[编辑]

参考[编辑]

Template:Filesystem Template:Linux内核