|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Jan 2004
Città: Montignoso(MS)
Messaggi: 9453
|
[C] Il tempo di una... fork()...
Ciao, vorrei sapere se, volendo calcolare il tempo necessario per effettuare una fork() e' indifferente far terminare subito il figlio nato dalla fork o no.
Ovvero: questi 2 modi di calcolare il tempo di fork si "equivalgono" ? Modo 1: Codice:
int pid; long int forkTime; struct timeval * start = (struct timeval*) malloc(sizeof(struct timeval)); struct timeval * end = (struct timeval*) malloc(sizeof(struct timeval)); gettimeofday(start, NULL); pid = fork();/*Ometto il controllo sull'errore per brevita'...*/ if (pid == 0) exit(EXIT_SUCCESS); /*Qui arriva solo il padre*/ gettimeofday(end, NULL); forkTime = (end->tv_sec - start->tv_sec) * 1000000 + (end->tv_usec - start->tv_usec); /*Tempo in microsecondi/* free(start); free(end); Codice:
int pid; long int forkTime; struct timeval * start = (struct timeval*) malloc(sizeof(struct timeval)); struct timeval * end = (struct timeval*) malloc(sizeof(struct timeval)); gettimeofday(start, NULL); pid = fork();/*Ometto il controllo sull'errore per brevita'...*/ if (pid == 0) { /*Qua faccio qualcosa*/ /*Ad esempio...*-/ int i = 0; while(i < 300) { printf("Child> nel ciclo"); i++; } exit(EXIT_SUCCESS); } /*Qui arriva solo il padre*/ gettimeofday(end, NULL); forkTime = (end->tv_sec - start->tv_sec) * 1000000 + (end->tv_usec - start->tv_usec); /*Tempo in microsecondi/* free(start); free(end);
__________________
"Il Meglio che si possa ottenere è evitare il peggio." I.C. Ultima modifica di Ed_Bunker : 14-02-2005 alle 13:04. |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Jan 2004
Città: Montignoso(MS)
Messaggi: 9453
|
Ho provato sperimentalmente e nel primo modo il tempo medio di fork() (Eseguendone mille una dietro l'altra) e' di circa 23 microsecondi mentre nel secondo modo risulta essere di 64 microsecondi.
Nessun parere ?!?
__________________
"Il Meglio che si possa ottenere è evitare il peggio." I.C. |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
A me ritorna circa lo stesso valore.
Nota che il metodo che usi non è proprio affidabile, in quanto normalmente il controllo passa al child dopo una fork. Quindi in realtà quello che stai misurando è il tempo di fork, più il tempo di esecuzione del figlio (al più fino al suo naturale context switch, ma non è il tuo caso), più il tempo per effettuare un giro di scheduling dal figlio a nuovamente il padre. Questo tempo può dipendere da quello che fa il figlio, ma tra una exit e una sleep non c'è molta differenza.
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
![]() |
![]() |
![]() |
#4 | |
Senior Member
Iscritto dal: Jan 2004
Città: Montignoso(MS)
Messaggi: 9453
|
Quote:
se il figlio consuma completamente o in parte il suo quanto di tempo (Supponendo che il controllo dopo la fork sia passato proprio al figlio) il tempo misurato dal padre sara' poco attendibile. No ? Invece se il figlio fa subito una exit (E non consuma quindi il suo quanto), sia che il controllo passi al padre, sia che passi al figlio (Ma non a qualche altro processo sulla macchina) il valore registrato dovrebbe essere piu' attendibile.
__________________
"Il Meglio che si possa ottenere è evitare il peggio." I.C. |
|
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Jan 2004
Città: Montignoso(MS)
Messaggi: 9453
|
Adesso ho modificato; il codice in rosso non e' quello con cui avevo fatto le prove. Facendo una sleep come prima, infatti, il processo figlio rilascia il controllo che, presumibilmente, viene preso dal padre che cosi' calcola un valore piuttosto attendibile. Adesso si dovrebbe notare qualche differenza. Prova...
__________________
"Il Meglio che si possa ottenere è evitare il peggio." I.C. |
![]() |
![]() |
![]() |
#6 | |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
|
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 16:56.