|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Jan 2004
Città: Montignoso(MS)
Messaggi: 9427
|
[C] Misurare tempo di esecuzione
Dovrei realizzare una specie di mini server che accetti richieste di lettura ed operazioni varie sui file di una certa directory. Per ciascuna delle possibili operazioni previste il server deve mantenere traccia del tempo (medio) di esecuzione (Sia dato per scontato che cio' sia fatto...). In base a tale statistica verificare se una certa richiesta (Riconosciuta e di cui guardo il tempo medio di exec...) richieda un tempo di exec maggiore di una fork(): se si l'operazione viene svolta dal proc figlio altrimenti dal proc padre.
Volendo fare tale controllo sul tempo di exec, dovrei effettuare ogni volta una fork() misurandone il tempo ovvero: .... struct timeval start, end; gettimeofday(&start, NULL); fork(); gettimeofday(&end, NULL); long execTime = (end.tv_sec - start.tv_sec) + (end.tv_usec - end.tv_usec); .... Ma, a questo punto, una fork() e' gia' stata eseguita ed un nuovo processo e' in exec . No ?!? E quindi, anche se la richiesta avesse un tempo di exec. inferiore ad una fork() che vantaggio ne trarrei ?!?! Sono assai confusetto... thks
__________________
"Il Meglio che si possa ottenere è evitare il peggio." I.C. |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Sì anch'io. Puoi spiegare meglio cosa devi fare? Magari con qualche esempio...
__________________
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 |
![]() |
![]() |
![]() |
#3 | ||
Senior Member
Iscritto dal: Jan 2004
Città: Montignoso(MS)
Messaggi: 9427
|
Quote:
![]() ![]() Quote:
Il server accetta richieste dai client attraverso una pipe con nome nota e creata all'avvio dal server. Le risposte del server ai client avvengono sulle pipe che i client stessi specificano, inviandone il nome (Attraverso la pipe del server) al server stesso. Vedi ESEMPIO e relativa LEGENDA. Il server, alla ricezione di una generica richiesta: -controlla che la richiesta sia "lecita" (Il modo i cui lo faccia per ora non ci interessa). -se il controllo precedente e' soddisfatto controlla (Accedendo ad una tabella privata, magari...) qual e' il tempo medio di exec. per soddisfare tale richiesta. Confronta tale valore (TEMPO_FUN) con quello rischiesto per fare una fork() (TEMPO_FORK) (Il tempo per fare una fork() viene calcolato come sopra...) e quindi: TEMPO_FUN > TEMPO_FORK ==> il server crea un processo figlio il quale soddisfera' la richiesta per poi terminare. Il server avra' cosi' la possibilita' di restare "in acolto" di nuove richieste. TEMPO_FORK > TEMPO_FUN ==> il server richiama direttamente la funzione in grado di soddisfare la richiesta del client senza dare il controllo a nessun processo figlio. Ad ogni modo si terra' traccia del tempo impiegato a soddisfare la richiesta (Dal padre o dal figlio) in modo da poterne aggiornare (Nella tabella privata) il valore corrispondente del tempo medio di exec. Adesso e' piu' chiaro ?? La mia perplessita' e' la stessa...
__________________
"Il Meglio che si possa ottenere è evitare il peggio." I.C. Ultima modifica di Ed_Bunker : 18-06-2004 alle 22:15. |
||
![]() |
![]() |
![]() |
#4 | ||
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
![]() chmod +x images chmod +r images/* ![]() Quote:
__________________
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 |
||
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Jul 2002
Città: Roma
Messaggi: 806
|
TEMPO_FORK lo calcoli una volta per sempre all'inizio dei tempi, quando tiri su il server e prima che esso dia la disponibilità ai client di collegarsi ad esso. E questo è il tuo tempo di riferimento (ci devi aggiungere anche il tempo di esecuzione di una exec() e di una eventuale wait() ).
A questo punto, ad ogni richiesta, non c'è bisogno di invocare la fork() se TEMPO_FORK > TEMPO_FUN. ![]() |
![]() |
![]() |
![]() |
#6 | |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
__________________
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 |
|
![]() |
![]() |
![]() |
#7 | |
Senior Member
Iscritto dal: Jan 2004
Città: Montignoso(MS)
Messaggi: 9427
|
Quote:
/*Tralasciando, per ora, il discorso sul controllo del controllo sui tempi di exec e supponendo di fare eseguire sempre la richiesta mediante un processo figlio...*/ ... ... int main(....) { ... int pid; if ((pid = fork()) == -1) { perror("Errore nella fork(); exit(0); } if(pid)/*Sono il padre*/ { /*Mi metto in ascolto di ulteriori richieste*/ } if (pid == 0)/*Sono il figlio*/ { /*Per esempio...*/ funzione1(); exit(0); } ... ... } void funzione1() { ... } void funzione2() { ... ... } void funzione3() { ... ... } Pertanto nessun problema per la exec. Ma...
__________________
"Il Meglio che si possa ottenere è evitare il peggio." I.C. |
|
![]() |
![]() |
![]() |
#8 | |
Senior Member
Iscritto dal: Jan 2004
Città: Montignoso(MS)
Messaggi: 9427
|
Quote:
__________________
"Il Meglio che si possa ottenere è evitare il peggio." I.C. |
|
![]() |
![]() |
![]() |
#9 | |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
__________________
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 |
|
![]() |
![]() |
![]() |
#10 | |
Senior Member
Iscritto dal: Jan 2004
Città: Montignoso(MS)
Messaggi: 9427
|
Quote:
__________________
"Il Meglio che si possa ottenere è evitare il peggio." I.C. |
|
![]() |
![]() |
![]() |
#11 |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
E' un pò strano come design, il server dovrebbe continuare ad essere attivo anche dopo aver soddisfatto la richiesta...
Comunque sia, la fork dovrebbe essere più veloce.
__________________
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 |
![]() |
![]() |
![]() |
#12 | |
Senior Member
Iscritto dal: Jan 2004
Città: Montignoso(MS)
Messaggi: 9427
|
Quote:
__________________
"Il Meglio che si possa ottenere è evitare il peggio." I.C. |
|
![]() |
![]() |
![]() |
#13 |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Ah te intendevi "exec" per "esecuzione"....credevo stessi parlando della _funzione_ exec, spesso usata insieme a fork
![]()
__________________
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 |
![]() |
![]() |
![]() |
#14 | |
Senior Member
Iscritto dal: Jan 2004
Città: Montignoso(MS)
Messaggi: 9427
|
Quote:
![]() ![]() ![]() Era tanto per abbreviare un po'... ![]()
__________________
"Il Meglio che si possa ottenere è evitare il peggio." I.C. |
|
![]() |
![]() |
![]() |
#15 |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Ora che l'arcano è svelato, cosa vuoi sapere? Come ottenere la latenza di una fork?
__________________
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 |
![]() |
![]() |
![]() |
#16 | |
Senior Member
Iscritto dal: Jan 2004
Città: Montignoso(MS)
Messaggi: 9427
|
Re: [C] Misurare tempo di esecuzione
Quello che vorrei sapere e' semplicemente quello che ho detto fin dall'inizio:
![]() Quote:
__________________
"Il Meglio che si possa ottenere è evitare il peggio." I.C. |
|
![]() |
![]() |
![]() |
#17 |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Una fork è implementata in maniera molto veloce, però ci sono un paio di cose che devi considerare:
- Normalmente dopo la syscall fork, il controllo passa al processo figlio. Non puoi però fare assunzioni su questo, in quanto potrebbe benissimo variare da kernel a kernel. - La fork è veloce perché è efficientemente implementata tramite la tecnica COW; la semplice latenza della chiamata fork però non è il solo overhead che devi considerare, ma anche la tecnica COW che viene utilizzata. Ti spiego in due parole di cosa si tratta: COW -- copy-on-write Per rendere meno pesante per il sistema il fork di un processo, le pagine di memoria inizialmente _non_ sono duplicate: ne viene conservata una sola copia, però nello stato di sola lettura. Quando uno dei due processi tenta di scrivere su una pagina di memoria, essendo questa in sola lettura il kernel genera una eccezione di accesso, e solo allora duplica fisicamente la pagina interessata (e solo quella pagina). La tecnica COW consente quindi di effettuare fork molto veloci, e di risparmiare molto sulla memoria utilizzata (le pagine che vengono solo lette, come librerie ecc., non verranno mai duplicate!), al prezzo però di qualche minor page fault in più. Ciò detto, non so se nel tuo caso la fork introduca un overhead accettabile o meno: a meno che non stai facendo una applicazione veramente time-critical, non noterai il suo impatto. Sicuramente se fai dell'I/O su file, il costo della fork è assolutamente trascurabile.
__________________
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 |
![]() |
![]() |
![]() |
#18 | |
Senior Member
Iscritto dal: Jan 2004
Città: Montignoso(MS)
Messaggi: 9427
|
Quote:
ad ogni richiesta "devo" misurare il tempo di esecuzione della fork() ed in base a cio' decidere ?!? In tal caso la mia domanda e': cosa ci guadagno in termini di efficienza visto che oramai una fork() e' stata eseguita e, quindi, l'eventualita' che l'operazione richiesta possa essere svolta in meno tempo di quello necessario per la fork() e' svanita ?!?
__________________
"Il Meglio che si possa ottenere è evitare il peggio." I.C. |
|
![]() |
![]() |
![]() |
#19 | |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
C'è un qualche motivo per cui non puoi usare i thread?
__________________
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 |
|
![]() |
![]() |
![]() |
#20 | |
Senior Member
Iscritto dal: Jan 2004
Città: Montignoso(MS)
Messaggi: 9427
|
Quote:
__________________
"Il Meglio che si possa ottenere è evitare il peggio." I.C. |
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 18:43.