2016-01-21 4 views
6

Ich versuche, die Laufzeit des Systemaufrufs fork() zu finden. Jeder untergeordnete Prozess muss sofort beendet werden, und das übergeordnete Element muss wait() für jedes untergeordnete Element aufweisen, bevor das nächste erstellt werden kann. Ich möchte auch den Shell-eingebauten Befehl mit dem Namen time verwenden, um die Ausführungszeit eines Programms zu messen.Wie berechnet man die Laufzeit für den Systemaufruf fork() in C?

Ich habe diesen Code bisher, aber nicht sicher, ob ich es richtig mache.

#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

Werfen Sie einen Blick auf die ' Systemaufruf von getrusage. – Kaz

+0

Funktioniert der Code? Wenn ja, sollten Sie auf codereview.stackexchange.com posten. Wenn der Code nicht funktioniert, sagen Sie bitte genau, warum Sie das denken: Welchen Fehler oder unerwartetes Verhalten beobachten Sie? –

+0

Sie sind wahrscheinlich verwirrt, weil sich 'local' und' global' für Ihren Parent-Prozess nicht ändern, aber ja, Ihr Code sieht korrekt aus. – tkausl

Antwort

2

Lesen Sie zuerst time(7) und betrachten clock_gettime(2) & getrusage(2) verwendet wird; Sie könnten clock_gettime um die fork (im übergeordneten Prozess) verwenden, wenn Sie nur die Zeit für diese fork(2) syscall selbst messen wollten (es ist sehr klein - vielleicht eine Millisekunde - und nicht wirklich signifikant).

Verwenden Sie errno (z. B. Drucken strerror(errno) oder perror) in Fehlerfällen.

Beachten Sie, dass fork Timing möglicherweise etwas von der Größe Ihrer virtual address space und resident set size abhängt. Sie können auch strace Timing-Fähigkeiten verwenden; in der Praxis ist fork schnell genug (oft weniger als einer Millisekunde, und manchmal ein paar Dutzend Mikrosekunden, weil sie faul copy-on-write Techniken verwendet)

So ist die fork ist schnell, das Kind execve ein paar Mikrosekunden dauern könnte, die Startzeit des Programms im Kind ist auch signifikant (ld-linux(8) führt einige relocation vor Ihrem main des exec -ed-Programm startet ...). Was genau möchten Sie messen?

Im Allgemeinen wird das Kind Prozess execve(2) schnell Anrufe, die auch eine gewisse Zeit in Anspruch nimmt (und natürlich auch das ausgeführte Programm kann etwas beliebig lange Zeit zu beenden, und vielleicht sogar „nie“ beenden, wenn es Server wie ist). was könnte vielleicht wichtig ist die Zeit zwischen kurz vor den fork und dem ersten sinnvollen Unterricht in den main des execve -d Programm im Kindprozess ...

In der Tat kann man viele Prozesse starten; Nach einer Faustregel ist höchstens ein paar hundert Mal pro Sekunde zu fork, und nur, wenn das Kind schnellexecve einige schnell Programm (wie /bin/ls von ein paar Dutzend Dateien oder date) -Ing. Allerdings möchten Sie nicht mehr als ein Dutzend oder zwei von Runnable Prozesse auf einmal (auf einem Laptop oder Desktop), und vielleicht sogar weniger als 5 lauffähige Prozesse ...