簡體   English   中英

如何在C中計算fork()系統調用的運行時間?

[英]How to calculate run time for fork() system call in C?

我正在嘗試查找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);
    }
}

閱讀第一時間(7)並考慮使用clock_gettime(2)getrusage(2) ; 如果您只想測量fork(2) syscall本身的時間(它非常小-可能是一毫秒-並不重要),則可以在fork (在父進程中)周圍使用clock_gettime

在失敗的情況下使用errno (例如print strerror(errno)或使用perror )。

請注意, fork時間可能會稍微取決於您的虛擬地址空間的 大小駐留集的大小 您可能還會使用strace計時功能; 實際上, fork是足夠快的(通常少於一毫秒,有時幾十微秒;因為它使用了懶惰的寫時復制技術)

所以fork快,孩子execve可能需要幾個微秒,程序啟動時在孩子的時間也顯著( LD-Linux操作系統(8)正在執行一些搬遷之前,你的main的的exec -ed程序啟動... )。 到底要測量什么?

通常,子進程會快速調用execve(2) ,這也需要一些時間(當然,執行的程序可能需要花費任意長時間才能完成,如果像服務器一樣,甚至可能“永不”完成)。 可能重要的是fork之前到子進程中execve -d程序的main中的第一條有意義的指令之間的時間...

實際上,您可以啟動許多流程。 經驗法則是,以fork以每秒最多幾百倍,且僅當孩子很快 execve -ing一些快速的程序(如/bin/ls的幾十個文件,或date )。 但是,您不希望一次(在便攜式計算機或台式機上)擁有一打或十二個以上的可運行進程,甚至可能少於五個。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM