如何在 C 语言中计算 fork() 系统调用的运行时间



我正在尝试查找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 个可运行的进程......

相关内容

  • 没有找到相关文章

最新更新