Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione HUAWEI Mate X7: un foldable ottimo, ma restano i soliti problemi
Recensione HUAWEI Mate X7: un foldable ottimo, ma restano i soliti problemi
Mate X7 rinnova la sfida nel segmento dei pieghevoli premium puntando su un design ancora più sottile e resistente, unito al ritorno dei processori proprietari della serie Kirin. L'assenza dei servizi Google e del 5G pesa ancora sull'esperienza utente, ma il comparto fotografico e la qualità costruttiva cercano di compensare queste mancanze strutturali con soluzioni ingegneristiche di altissimo livello
Nioh 3: souls-like punitivo e Action RPG
Nioh 3: souls-like punitivo e Action RPG
Nioh 3 aggiorna la formula Team NINJA con aree esplorabili più grandi, due stili di combattimento intercambiabili al volo (Samurai e Ninja) e un sistema di progressione pieno di attività, basi nemiche e sfide legate al Crogiolo. La recensione entra nel dettaglio su combattimento, build, progressione e requisiti PC
Test in super anteprima di Navimow i220 LiDAR: il robot tagliaerba per tutti
Test in super anteprima di Navimow i220 LiDAR: il robot tagliaerba per tutti
La facilità di installazione e la completa automazione di tutte le fasi di utilizzo, rendono questo prodotto l'ideale per molti clienti. Ecco com'è andata la nostra prova in anteprima
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 13-07-2004, 12:53   #1
Ed_Bunker
Senior Member
 
L'Avatar di Ed_Bunker
 
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 mio problema e' questo:
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.
Ed_Bunker è offline   Rispondi citando il messaggio o parte di esso
Old 13-07-2004, 12:56   #2
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
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
ilsensine è offline   Rispondi citando il messaggio o parte di esso
Old 13-07-2004, 13:28   #3
Ed_Bunker
Senior Member
 
L'Avatar di Ed_Bunker
 
Iscritto dal: Jan 2004
Città: Montignoso(MS)
Messaggi: 9481
Quote:
Originariamente inviato da ilsensine
Hai una race grossa quanto una casa. Cosa succede se il server riceve una _seconda_ richiesta se ancora non ha ultimato la _prima_?
Intendi una corsa critica ?!? Solo il processo padre accede alla variabile start ed end e percio' non vedo come ci possano essere corse critiche... Il problema mi pare che sia, come ho detto, che quando il padre riceve il segnale SIGCHLD ed entra nella gestione della routine deadHandler(...) il valore di start potrebbe non essere quello "corrispondente" al processo figlio che ha inviato il SIGCHLD per comunicare la terminazione. Questo peche' successivamente il padre potrebbe aver ricevuto altre richieste sovrascrivendo la variabile start. Ma la malloc non dovrebbe fare qualcosa di "simile" a cio' che accade con la ricorsione ??!
__________________
"Il Meglio che si possa ottenere è evitare il peggio." I.C.
Ed_Bunker è offline   Rispondi citando il messaggio o parte di esso
Old 13-07-2004, 13:37   #4
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
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
ilsensine è offline   Rispondi citando il messaggio o parte di esso
Old 13-07-2004, 15:03   #5
Ed_Bunker
Senior Member
 
L'Avatar di Ed_Bunker
 
Iscritto dal: Jan 2004
Città: Montignoso(MS)
Messaggi: 9481
Quote:
Originariamente inviato da ilsensine
Appunto, questa si chiama "race condition".
Malloc alloca solo memoria, poi come la gestisci sono affari tuoi.
Il fatto che la malloc allochi memoria ok, ci siamo. La race condition data dal fatto che, se il server riceve una ulteriore richiesta, dopo aver gia' lanciato un processo figlio, il puntatore "start" va a puntare ad una nuova area di memoria ? E percio' il valore impostato dalla gettimeofday(...) (La prima) viene "perso" ?!

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.
Ed_Bunker è offline   Rispondi citando il messaggio o parte di esso
Old 13-07-2004, 15:27   #6
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
Quote:
Originariamente inviato da Ed_Bunker
Il fatto che la malloc allochi memoria ok, ci siamo. La race condition data dal fatto che, se il server riceve una ulteriore richiesta, dopo aver gia' lanciato un processo figlio, il puntatore "start" va a puntare ad una nuova area di memoria ? E percio' il valore impostato dalla gettimeofday(...) (La prima) viene "perso" ?!
Certo. In più hai un memory leak.

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
ilsensine è offline   Rispondi citando il messaggio o parte di esso
Old 13-07-2004, 16:40   #7
Ed_Bunker
Senior Member
 
L'Avatar di Ed_Bunker
 
Iscritto dal: Jan 2004
Città: Montignoso(MS)
Messaggi: 9481
Quote:
Originariamente inviato da ilsensine
Certo. In più hai un memory leak.

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.
Mmmm... inizialmente avevo provato proprio usando un array dinamico ma le operazioni su tale array facevano un po' perdere di efficienza al tutto... E stavo cercando qualcosa per rendere il tutto piu' "snello". Avevo pensato (Su suggerimento di un utente del forum... )di utilizzare il campo "sa_sigaction" anziche' "sa_handler" visto che il primo da maggiori informazioni riguardanti il figlio che ha lanciato il SIGCLHD. Ha come parametro anche un puntatore ad una struct (siginfo_t *) che contiene, tra l'altro, questi due campi:

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.
Ed_Bunker è offline   Rispondi citando il messaggio o parte di esso
Old 13-07-2004, 16:43   #8
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
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
ilsensine è offline   Rispondi citando il messaggio o parte di esso
Old 13-07-2004, 17:38   #9
Ed_Bunker
Senior Member
 
L'Avatar di Ed_Bunker
 
Iscritto dal: Jan 2004
Città: Montignoso(MS)
Messaggi: 9481
Quote:
Originariamente inviato da ilsensine
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?
Si ma questo implica comunque delle ricerche all'interno dell'array ogni volta che un processo figlio mi manda un SIGCHLD. Inoltre quando devo creare un nuovo processo (Quando faccio la fork() ) devo anche registrarlo all'interno dell'array andando a cercare la prima posizione libera. L'array, infatti, potrebbe avere dei "buchi" al proprio interno dovuti a processi che lanciati successivamente ad altri hanno terminato prima la loro esecuzione. Le prestazioni credo che ne risentano sensibilmente...

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.
Ed_Bunker è offline   Rispondi citando il messaggio o parte di esso
Old 13-07-2004, 17:50   #10
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
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
ilsensine è offline   Rispondi citando il messaggio o parte di esso
Old 14-07-2004, 00:38   #11
Ed_Bunker
Senior Member
 
L'Avatar di Ed_Bunker
 
Iscritto dal: Jan 2004
Città: Montignoso(MS)
Messaggi: 9481
Quote:
Originariamente inviato da ilsensine
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
Dipende dalla lunghezza dell'array... E ad ogni modo complica un po' le cose. Speravo proprio ci fosse il modo per risalire al tempo di esecuzione avendo a disposizione i campi: si_utime, si_stime...
__________________
"Il Meglio che si possa ottenere è evitare il peggio." I.C.
Ed_Bunker è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Recensione HUAWEI Mate X7: un foldable ottimo, ma restano i soliti problemi Recensione HUAWEI Mate X7: un foldable ottimo, m...
Nioh 3: souls-like punitivo e Action RPG Nioh 3: souls-like punitivo e Action RPG
Test in super anteprima di Navimow i220 LiDAR: il robot tagliaerba per tutti Test in super anteprima di Navimow i220 LiDAR: i...
Dark Perk Ergo e Sym provati tra wireless, software via browser e peso ridotto Dark Perk Ergo e Sym provati tra wireless, softw...
DJI RS 5: stabilizzazione e tracking intelligente per ogni videomaker DJI RS 5: stabilizzazione e tracking intelligent...
Proseguono le riparazioni in vista del l...
Cinema domestico low cost: proiettore Fu...
Sharp porta a ISE 2026 i nuovi display i...
Casa più sicura senza lavori: Arl...
Batterie esauste, l'Italia raccoglie sol...
Gmail cambia le regole: stop a Gmailify ...
Lutto nel mondo scientifico: si è spento...
Toyota sviluppa Fluorite, un motore open...
Google lancia l'allarme: un miliardo di ...
Secondo NVIDIA, i 660 miliardi di dollar...
Qualcomm punta sulla flessibilità...
Amazon sconta schede video, CPU e access...
Halo: Campaign Evolved, l'uscita del rem...
La rete elettrica europea sta limitando ...
Apple Magic Keyboard per iPad Pro 11'' i...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 15:36.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v