2016-01-21 83 views
6

fork()システムコールの実行時間を調べようとしています。各子プロセスはすぐに終了する必要があり、次の子プロセスを作成する前に、各子プロセスで親プロセスにwait()が必要です。また、プログラムの実行時間を測定するために、シェル組み込みコマンドtimeを使用したいと思います。Cでfork()システムコールの実行時間を計算する方法は?

私はこのコードをこれまで持っていますが、わかりません。

#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); 
    } 
} 
+2

' getrusage'システムコールです。 – Kaz

+0

コードは機能しますか?はいの場合は、codereview.stackexchange.comに投稿する必要があります。コードがうまくいかない場合は、その理由を正確に述べてください:どのようなエラーや予期しない動作が観察されていますか? –

+0

'local'と' global'はあなたの親プロセスのために変更されないので、混乱するでしょうが、あなたのコードは正しいように見えます。 – tkausl

答えて

2

最初time(7)を読み、clock_gettime(2) & getrusage(2)を使用することを検討してください。そのfork(2)システムコール自体の時間(それは非常に小さい - おそらくミリ秒 - そしてそれほど重要ではない)を測定したい場合は、親プロセスのforkの周りにclock_gettimeを使用することができます。

エラーケースではerrno(例:print strerror(errno)またはperror)を使用してください。

forkのタイミングは、virtual address spaceresident set sizeのサイズによって若干異なる場合があります。また、straceタイミング能力を使用することもできます。実際forkで十分速いです(多くの場合、1ミリ秒未満、およびマイクロ秒の、時には数十、それは怠惰なcopy-on-write技術を使用しているため)

のでforkは迅速で、子供execveは、さらにいくつかのマイクロ秒を取ることができ、子供のプログラム起動時間も重要です(はrelocationを実行してから、のexec -edプログラムが開始されます)。 何を正確に測定しますか?

一般的に、子プロセスはexecve(2)を素早く呼び出します(実行されたプログラムの終了には時間がかかります)。サーバであれば "決して"終了しないこともあります。おそらく、何も問題でしたことは直前forkと子プロセスでexecve -dプログラムのmainの最初の意味の命令との間の時間は

実際には、あなたは多くのプロセスを開始することができます...です。経験則では、毎秒百最も数回にforkにあり、そして子供はいくつか迅速プログラム(のような数十ファイルの/bin/ls、またはdate)を-ing 迅速execveである場合にのみ。しかし、の実行可能ファイル(ラップトップまたはデスクトップ上)を一度に12個以上2つ以上、さらには5個未満の実行可能なプロセスにしたいとは思わない...

関連する問題