我必须获取进程的内存使用信息。我知道它可以在/proc/${pid}/statm
但是否有系统功能来获取它。解析文件似乎效率很低。
答案1
您错误地认为解析文件似乎效率低下,因为您断章取义。您可能已经知道下面的信息/proc
仅在您请求时“创建”,并且不是每当有变化时都会更新。因此,您不仅必须解析它,内核还必须将其生成为文本。
直接将几个字节读入 long 当然比调用atoi()
字符串更有效。但您必须将其视为必须执行系统调用的上下文的一部分。为读取某些文件内容(或调用内核可能提供的某些二进制 API)而执行的所有额外代码都会使字符串转换所需的时间相形见绌。
内核进程比普通程序更频繁地需要此类数据,因此没有必须执行系统调用来获取此类数据的开销,并且它们可以直接访问此类数据。
答案2
你没有提到你想获得什么样的信息,但Linux重新实现了pmap <pid>
Solaris的命令。它不打印完全相同的信息,但输出是可比的。您可能想检查 Linux 是否从 Solaris 的各种 p* 命令中重新实现了更多内容。有趣的psig
是 Linux 不支持。
出于安全原因,UNIX 上的特定信息仅对进程本身可用,超出此范围的信息是有限的,通常仅适用于ps
类似的程序。
请注意,一般的 UNIX 哲学是通过函数提供特殊信息ioctl()
,这就是/proc
20 世纪 80 年代末首次实现的工作原理。每个进程都是 /proc 中的一个文件,只有 ioctl 对该文件起作用。请注意,在引入 /proc 之前,UNIX 用户被迫自由读取内核内存以获取特殊信息,并且由于没有锁,因此当相关进程死亡或被换出时,这可能会导致垃圾。
1980 年,UNOS(第一个 UNIX 克隆)为 ps 命令实现了 getpsinfo() 系统调用。/proc
可以看作是抽象视图的更好实现。
大约在 90 年代中期,procfs-2 定义了一个进程,使其成为一个目录和其中的文件,允许读取复杂的二进制数据(例如,用于/proc/<pid>/as
地址空间文件)。该目录内的其他文件具有可以的结构化二进制数据(定义的 C 结构)read()
(例如,/proc/<pid>/usage
用于资源使用)。
Linux不兼容procfs和procfs2文件,路径名不同,文件内容不同。/proc/<pid>/fd/
on Linux 与 AT&T procfs2 论文存在明显冲突。