|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Jan 2004
Città: Montignoso(MS)
Messaggi: 9481
|
[C] Grosso dubbio con la malloc...
[C] Allocazione dinamica...
Ciao, ho un problemuccio urgente da capire... Si tratta di realizzare un semplice server che ad ogni richiesta ricevuta mediante pipe crei u proceso ad hoc per svolgere una certa funzione calcolando il tempo di esecuzione impiegato dal processo figlio. In partciolare dovrei fare qualcosa di questo genere: Codice:
...
struct timeval * start;
struct timeval * end;
long int med;
...
int main(int argc, char * argv[])
{
...
/*Per gestire il sigchld...*/
struct sigaction new, old;
new.sa_handler = deadHandler;
if(sigaction(SIGCHLD, &new, &old) == -1)
{
perror("Errore nella sigaction");
exit(-1);
}
while (TRUE)
{
/*RICEZIONE DELLE RICHIESTE*/
int pid;
start = (struct timeval*) malloc (sizeof(struct timeval));end = (struct timeval*) malloc (sizeof(struct timeval));
gettimeofday(start,NULL);
pid = fork();
if (pid ==0)/*Figlio*/
{
funzione1(...qui passo i parametri giusti...);
exit(0);
}
/*Il padre torna a ricevere richieste...*/
}
/*Routine per la gestione del segnale sigchld...*/
void deadHandler(int sig)
{
getimeofday(end,NULL);
long int execTime = (end->tv_sec - start->tv_sec) * 1000000 +
(end->tv_usec - start->tv_usec);
med = ALPHA * med + (1-ALPHA) * execTime;
}
il padre non sa a priori quando entrera' nella routine per gestire il sigchld. Pertanto vorrei sapere questo: quando entro nella deadHandler(...) la PRIMA volta, accedendo alla varibile START, faccio riferimento alla sua PRIMA allocazione (E quindi al suo primo valore)?! E quindi quando accedo alla routine la SECONDA volta faccio riferimento alla SECONDA allocazione della variabile oppure no ?!? E cosi' via... In altre parole quando entro nella routine di gestione del sigchld la PRIMA volta ed accedo a start, quest'ultima potrebbe essere stata sovrascritta perche' nel frattempo il server ha ricevuto una (o piu') ulteriore richiesta e quindi ha dato un nuovo valore a start ?! Oppure il fatto che utilizzi la allocazione dinamica mi cautela da questo "problema". (In pratica dovrebbe succedere qualcosa di simile a quello che accade nella ricorsione per fare in modo che gli effetti siano quelli "desiderati"...) Scusate se ho scritto una marea di roba e se, oltretutto... sono stato pure poco chiaro... thks
__________________
"Il Meglio che si possa ottenere è evitare il peggio." I.C. Ultima modifica di Ed_Bunker : 13-07-2004 alle 12:58. |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Hai una race grossa quanto una casa. Cosa succede se il server riceve una _seconda_ richiesta se ancora non ha ultimato la _prima_?
__________________
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: 9481
|
Quote:
__________________
"Il Meglio che si possa ottenere è evitare il peggio." I.C. |
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Appunto, questa si chiama "race condition".
Malloc alloca solo memoria, poi come la gestisci sono affari tuoi.
__________________
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: Jan 2004
Città: Montignoso(MS)
Messaggi: 9481
|
Quote:
Quello che vorrei avere e' un comportamento simile a quello che si ha utilizzando la ricorsione.... P.S.: dichiarando il puntatore "struct timeval start = (struct timeval*) malloc (sizeof(struct timeval))" all'interno del ciclo while quando entro nella deadHandler(...) il riferimento a 'start' sarebbe quello "atteso" ?!? Se si, pero', come faccio a fare in modo che da deadHandler(...) 'start' sia visibile visto che e' dichiarata all'interno del ciclo ?! thks
__________________
"Il Meglio che si possa ottenere è evitare il peggio." I.C. |
|
|
|
|
|
|
#6 | |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
La soluzione non è banale, neanche usando delle liste dinamiche (non puoi usare strategie di lock con il signal handler!!). Meglio se usi un array statico, limitando il numero massimo di richieste che puoi soddisfare contemporaneamente.
__________________
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: 9481
|
Quote:
clock_t si_utime; /*User time consumed*/ clock_t si_stime; /*System time consumed*/ Da questi due valori potrei risalire al tempo di esecuzione del processo figlio che ha lanciato il SIGCHLD ? Quale e' la differenza tra user time consumed e system time consumed ? Si riferiscono al tempo trascorso a livello utente e quello impiegato a livello kernel ?
__________________
"Il Meglio che si possa ottenere è evitare il peggio." I.C. |
|
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Esattamente, ma non necessariamente la loro somma è il tempo totale trascorso: questo perché il tempo totale viene ripartito tra i vari task.
Per me devi usare un array statico di strutture; ogni struttura deve avere il pid del processo (oppure 0 se è libera), e il tempo di inizio. Nel sighandler cerchi nell'array la struttura con il pid uguale a quello del processo che ha generato il segnale; quando ha finito, mette questo valore a 0 per liberarla per altri task. Mi sembra semplice, no?
__________________
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 |
|
|
|
|
|
#9 | |
|
Senior Member
Iscritto dal: Jan 2004
Città: Montignoso(MS)
Messaggi: 9481
|
Quote:
Tornando al discorso della sa_sigaction fare la somma tra lo user time consumed e il system time consumed non "restituisce" un risultato analogo a quello ottenuto facendo uso della gettimeofday() ?!?
__________________
"Il Meglio che si possa ottenere è evitare il peggio." I.C. |
|
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Non credo affatto che le prestazioni vengano penalizzate, la ricerca dentro un array è molto veloce. Tieni conto inoltre che stai usando funzioni (tipo fork) che non sono veloci quanto una addizione
__________________
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 |
|
|
|
|
|
#11 | |
|
Senior Member
Iscritto dal: Jan 2004
Città: Montignoso(MS)
Messaggi: 9481
|
Quote:
__________________
"Il Meglio che si possa ottenere è evitare il peggio." I.C. |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 15:36.



















