我正在尝试查找fork()
系统调用的运行时间。每个子进程都需要立即退出,父进程需要在创建下一个子进程之前wait()
每个子进程。我还想使用名为 time
的 shell 内置命令来测量程序的执行时间。
有这段代码,但不确定我是否做对了。
#include <sys/types.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
int global = 100;
int main(int argc, char** argv)
{
int local = 5;
pid_t pid;
pid = fork();
if (pid < 0) {
fprintf(stderr, "error -- failed to fork()");
return 1;
}
if (pid > 0) {
int child_ret;
waitpid(pid, &child_ret, 0);
printf("parent -- global: %i, local: %in", global, local);
printf("parent -- child exited with code %in", child_ret);
} else {
global++;
local++;
printf("child -- global: %i, local: %in", global, local);
exit (0);
}
}
第一次阅读(7)并考虑使用clock_gettime(2)和getrusage(2);如果你只想测量fork(2)系统调用本身的时间(它非常小 - 也许是毫秒 - 并且不是很重要),则可以在fork
周围使用clock_gettime
(在父进程中)。
在故障情况下使用errno
(例如打印strerror(errno)
或使用perror
)。
请注意,fork
计时可能略微取决于虚拟地址空间的大小和驻留集的大小。您还可以使用strace
计时功能;实际上,fork
足够快(通常不到一毫秒,有时几十微秒;因为它使用的是惰性写入复制技术)
所以fork
很快, 子程序execve
可能需要几微秒, 子程序的启动时间也很长 (ld-linux(8) 在main
exec
-ed 程序开始之前执行一些重定位...你到底想测量什么?
一般来说,子进程会快速调用 execve(2),这也需要一些时间(当然,执行的程序可能需要任意长的时间才能完成,如果它是类似服务器的,甚至可能"永远不会"完成)。也许重要的是在fork
之前到子进程中execve
-d 程序main
中第一个有意义的指令之间的时间......
事实上,你可以启动许多进程;经验法则是每秒最多fork
几百次,并且只有当孩子快速execve
一些快速程序(如几十个文件中的/bin/ls
,或date
)。但是,您不希望一次(在笔记本电脑或台式机上)拥有十几个或二十个可运行的进程,甚至可能少于 5 个可运行的进程......