Procfs

来自Local Chinese Wikipedia
imported>Ohtashinichiro2023年12月19日 (二) 09:24的版本 参考
(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)
跳转到导航 跳转到搜索

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 上面):

  • 电源管理系统(如果有的话)对应的目录Template:MonoTemplate:Mono
  • Template:Mono, 信息关于脚本错误:没有“ilh”这个模块。用于处理内存碎片。[5]
  • Template:Mono, 包含对应于计算机上各种总线的目录, 如input/PCI/USB. 在/sys/bus下包含更丰富的信息。
  • Template:Mono, 可利用的帧缓冲的列表
  • Template:Mono, 传递给内核的启动选项。
  • Template:Mono, 包含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]

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内核