gpt4 book ai didi

c - 如何计算 C 中 fork() 系统调用的运行时间?

转载 作者:太空狗 更新时间:2023-10-29 17:25:33 30 4
gpt4 key购买 nike

我试图找到 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: %i\n", global, local);
printf("parent -- child exited with code %i\n", child_ret);
} else {
global++;
local++;

printf("child -- global: %i, local: %i\n", global, local);
exit (0);
}
}

最佳答案

先读time(7)并考虑使用 clock_gettime(2) & getrusage(2) ;如果您只想测量 fork(2) 的时间,您可以在 fork 周围使用 clock_gettime(在父进程中)系统调用本身(它非常小——可能是一毫秒——而且并不重要)。

在失败情况下使用 errno(例如打印 strerror(errno) 或使用 perror)。

请注意,fork 时间可能略微取决于您的 virtual address space 的大小和 resident set size .您还可以使用 strace 计时功能;实际上 fork 足够快(通常不到一毫秒,有时几十微秒;因为它使用了惰性 copy-on-write 技术)

因此 fork 很快,子 execve 可能需要多花几微秒,子程序启动时间也很长(ld-linux(8) 正在执行一些relocation 在您的 exec 程序的 main 开始之前...)。 究竟想衡量什么?

一般情况下,子进程会快速调用execve(2)这也需要一些时间(当然,执行的程序可能需要任意长的时间才能完成,如果它是服务器类的,甚至可能“永远不会”完成)。也许重要的是 fork 之前和 execve-d 子程序的 main 中第一条有意义的指令之间的时间过程...

其实可以启动很多进程;一个经验法则是每秒最多 fork 几百次,并且只有当 child 快速 execve-ing 一些quick 程序(如几十个文件的 /bin/ls,或 date)。但是,您不希望同时拥有超过一打或两个可运行进程(在笔记本电脑或台式机上),甚至可能少于 5 个可运行进程...

关于c - 如何计算 C 中 fork() 系统调用的运行时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34917051/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com