Linux proc

17 Mar 2025 | 6 分钟阅读

在类Unix操作系统中,proc 是一个独特的文件系统,它以分层的文件结构展示了关于进程和其他系统的信息。

与直接访问内核内存或传统的跟踪机制或直接访问相比,它提供了一种更标准化、更便捷的机制来动态访问内核中持有的进程数据。

它通常在启动时映射到挂载点 /proc。proc 文件系统作为内核中的一个接口数据结构实现。它可以用于获取系统信息以及在运行时更改一些内核参数。

各种类Unix操作系统都支持proc文件系统,例如 Plan 9 来自 Bell Labs,IBM AIX,QNX,Linux,BSD,Tru64 Unix,IRIX,Solaris。OpenBSD 在2015年5月发布的5.7版本中取消了对它的支持。

Linux内核开发了它以用于非进程相关的数据。

proc文件系统提供了用户空间和内核空间之间的通信方式。例如, GNU版本的进程报告工具ps就利用proc文件系统获取数据,而无需使用专门的系统调用。

proc文件系统的历史

Linux proc

UNIX 第8版

Tom J. Killian 实现了 proc UNIX 第8版 (V8) 版本。1984年6月,他在 USENIX 上发表了一篇题为 "Processes as Files" 的论文。proc文件系统的设计重点是取代用于进程跟踪的系统调用 ptrace

SVR4

Ron GomesRoger FaulkerV8 /proc版本 移植到了 SVR4,并于1991年1月在 USENIX 上发表了一篇题为 "The Process File System and Process Model In Unix System V" 的论文。这种proc文件系统支持ps的创建,但文件只能与 ioctl()、read()write() 等函数一起使用。

在1995年至1996年间,Roger Faulker 为Solaris的2.6版本建立了 procfs-2 接口,提供了一个组织良好的 /proc 文件系统,并包含许多子目录。

4.4BSD

4.4BSD通过Plan 9复制了其 /proc 实现。逐步地,截至2011年2月,procfs在 FreeBSD 中逐渐被淘汰。它在2015年5月发布的 OpenBSD 5.7版本中被删除,因为它“一直存在许多竞争条件,现在已不再使用”。

Plan 9

Plan 9 实现了一个进程文件系统。然而,它比V8走得更远。V8的进程文件系统为每个进程执行一个文件。这个版本将 /proc 文件作为原始文件系统的一部分,并创建了一个隔离文件的层次结构来提供这些功能。

Linux

1992年,Linux在 v0.97.3 中首次添加了 /proc,并于1992年12月在 v0.98.6 中开始将其开发用于非进程相关的数据。

截至2020年,Linux的实现包含一个目录,用于所有正在运行的进程,包括内核进程,这些进程位于 /proc/PID 目录中,其中PID是进程的编号。

所有目录都包含有关单个进程的详细信息。其中一些目录解释如下:

  • /proc/PID cmdline: 这是最初启动该进程的命令。
  • /proc/PID/cwd: 这是指向进程当前工作目录的符号链接。
  • /proc/PID/exe: 当实际可执行文件仍然可用时,它指向真实可执行文件的符号链接(进程可能在其实际可执行文件被替换或删除后继续运行)。
  • /proc/PID/environ: 它包含了影响进程的许多环境变量的名称和值。
  • /proc/PID/fdinfo: 这是一个目录,包含指定所有打开文件描述符的标志和位置的条目。
  • /proc/PID/fd: 这是一个目录,包含每个打开文件描述符的符号链接。
  • /proc/PID/maps: 这是一个文本文件,包含有关映射的块和文件(如 stackheap)的信息。
  • /proc/PID/root: 这是指向进程所检查的根路径的符号链接。对于大多数进程,它链接到 / 目录,除非进程在一个chroot jail中执行。
  • /proc/PID/mem: 这是一个二进制图像,代表进程的虚拟内存。它只能被ptrace进程使用。
  • /proc/PID/status: 它包含关于进程及其内存使用和运行状态的通用信息。
  • /proc/PID/task: 这是一个目录,包含指向该进程启动的操作(即 父进程)的硬链接。

/proc 中非进程相关的系统信息

此外,/proc 文件还包含有关系统的非进程相关信息。然而,在内核的2.6版本中,许多信息已迁移到独立的sysfs伪文件系统,挂载在/sys下。

/proc/apm 或 /proc/acpi 目录依赖于电源管理模式,它依赖于sysfs,并包含有关电源管理状态的许多信息位。

  • /proc/bus: 它包含说明系统中各种总线(如 USB/PCI)的目录。它已被sysfs文件系统在/sys/bus文件上取代,后者信息更丰富。
  • /proc/buddyinfo: 它提供了关于伙伴算法的详细信息。该算法管理内存碎片。
  • /proc/cmdline: 它提供了将传递给内核的许多引导选项。
  • /proc/fb: 它定义了一个存在的帧缓冲区的列表。
  • /proc/cpuinfo: 它包含 CPU 信息,如供应商(CPU系列、型号和型号名称,应允许用户识别 CPU)、速度(CPU时钟频率)、CPU标志、核心数、同线程数和缓存大小。

此目录包含 “bogomips” 值,该值常被误解为 CPU 速度测量,如基准测试。然而,它对最终用户来说并没有衡量任何有意义的值。它是一个内核计时器校准的副作用,并且高度依赖于具有相同时钟速度的 CPU 类型,因此会产生变化的值。

CPU 封装

CPU 封装表示一个物理 CPU,它可能拥有多个核心(四核表示四个,双核表示两个,单核表示一个)。它允许区分双核和超线程,即每个 CPU 封装的超线程可以通过 CPU 或同线程数来衡量,如果任何 CPU 封装的这两个值相等,则不支持超线程。

例如, 一个带有 cpu cores=2 和 siblings=2 的 CPU 封装是一个双核 CPU,但不支持超线程。

  • /proc/crypto: 它定义了一个存在的加密模块列表。
  • /proc/diskstats: 它提供了所有逻辑磁盘设备的一些详细信息(包括设备编号)。
  • /proc/devices: 它定义了一个由设备 ID 排序的块设备和字符设备列表。尽管如此,它也提供了 /dev 名称的大部分内容。
  • /proc/interrupts:/proc/interrupts、/proc/irq、/proc/ioports/proc/iomem 这样的目录提供了有关具有各种系统资源的设备(逻辑或物理)的信息。
  • /proc/filesystems: 它定义了内核在列出期间支持的文件系统列表。
  • /proc/meminfo: 它包含了内核如何处理其内存的摘要。
  • /proc/kmsg: 它包含内核发出的消息。
  • /proc/mounts: 它是 mounts/self 的符号链接,其中包含当前挂载的设备和挂载点的列表。
  • /proc/modules: 它是 /proc 文件系统中最重要的文件之一。它包含当前已加载内核模块的列表。它提供了一些依赖关系(并不总是完全正确)。
  • /proc/scsi: 它提供了有关通过 RAID 或 SCSI 控制器连接的设备的信息。
  • /proc/partitions: 它表示内核已识别为可用分区的设备大小、/dev 名称以及它们的编号的列表。
  • /proc/slabinfo: 它列出了 Linux 内核中常用对象的缓存统计信息。
  • /proc/sysvipc: 它包含了进程间通信和内存共享信息。
  • /proc/uptime: 它表示内核自启动以来运行的时间长度,以及处于空闲模式的时间。
  • /proc/version: 它包含了 Linux 内核版本、用于构建内核的 gcc 版本号、发行版号以及与当前运行的内核版本相关的其他相关详细信息。
  • 所有其他文件都取决于模块配置、许多硬件和内核修改。
  • 在 Linux 上使用 /proc 文件系统的常用实用程序属于 /proc 进程(procps)包。

Solaris

在 Solaris 中,/proc 文件从一开始就存在。Solaris 的 2.6 版本由 Roger Faulker 于1996年发布了 /proc2

专有开发

各种项目和公司为他们的系统向 /proc 文件系统添加了许多额外功能。例如, 文件 /proc/lcd 可能包含前面板 LCD 屏幕的内容。此文件中提到的文本将显示在屏幕上。


下一个主题Linux 任务管理器