在运行GNU时间(/usr/bin/time)并检查内存消耗时,它的输出是否考虑到我的目标程序的子进程的内存使用情况?

在GNU的时间手册中找不到任何内容。

最佳答案

是。

您可以轻松地通过以下方式进行检查:

$ /usr/bin/time -f '%M' sh -c 'perl -e "\$y=q{x}x(2*1024*1024)" & wait'
8132
$ /usr/bin/time -f '%M' sh -c 'perl -e "\$y=q{x}x(8*1024*1024)" & wait'
20648

GNU时间正在Linux上使用 wait4 系统调用(通过wait3 glibc包装器),并且尽管未记录,但它在struct rusage中返回的资源使用情况还包括等待的进程的后代。您可以在 wait4 中查看kernel/exit.c的内核实现,以获取所有详细信息:
$ grep -C2 RUSAGE_BOTH include/uapi/linux/resource.h
#define RUSAGE_SELF     0
#define RUSAGE_CHILDREN (-1)
#define RUSAGE_BOTH     (-2)            /* sys_wait4() uses this */
#define RUSAGE_THREAD   1               /* only the calling thread */

FreeBSD和NetBSD也有一个 wait6 系统调用,它为等待的进程及其后代返回单独的信息。他们还清楚地证明wait3wait4返回的骚扰还包括孙辈。

10-06 00:48