|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 | |
|
Senior Member
Iscritto dal: Sep 2005
Città: Torino
Messaggi: 606
|
[C] free()
In un recente thread ho scritto:
Quote:
Poi, siccome l'argomento mi sembra interessante e io sono tutt'altro che bravo nello spiegarmi nonchè autorevole, volevo linkare questi due articoli che trattano l'argomento. articolo #1 articolo #2 Senza far partire flame, mi piacerebbe conoscere l'opinione dei più "navigati" e non, l'importante sono le motivazioni della scelta. Ciao
__________________
"Se proprio dovete piratare un prodotto, preferiamo che sia il nostro piuttosto che quello di qualcun altro." [Jeff Raikes] "Pirating software? Choose Microsoft!" |
|
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Jan 2014
Messaggi: 852
|
Io la vedo in questo modo: bisogna sempre essere precisi.
Che il sistema operativo in uso liberi la memoria o meno, bisogna sempre liberare ciò che si è allocato. E' una pratica che aiuta ad assumere quest'atteggiamento sempre, così si evita di "dimenticarsi" quando ce n'è veramente bisogno. Poi, che il SO debba liberare la memoria è un dovere: il SO è uno, i programmi sono tanti, ne nasce uno nuovo ogni giorno, è matematico che i programmi abbiano qualche bug. I sistemi operativi hanno una vita molto lunga e tanto tempo per migliorarsi: se il SO può risolvere un problema comune deve farlo. Se non lo fa e devo implementare tutto io, tanto vale fare a meno del sistema operativo (ovviamente questa è un'esagerazione, ma è giusto per rendere l'idea). |
|
|
|
|
|
#3 | ||
|
Senior Member
Iscritto dal: Sep 2005
Città: Torino
Messaggi: 606
|
Quote:
così si evitano chiamate a funzioni inutili (quando a breve il programma termina) e il rischio di chiamare la free() su, ad esempio, un puntatore a memoria già liberata, causando gravi problemi. Quote:
ps: grazie per aver detto la tua.
__________________
"Se proprio dovete piratare un prodotto, preferiamo che sia il nostro piuttosto che quello di qualcun altro." [Jeff Raikes] "Pirating software? Choose Microsoft!" |
||
|
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Quote:
Nei sistemi embedded non e' poi cosi' strano, e questo non significa che il sistema operativo non sia utile, anzi. Ciao
__________________
In God we trust; all others bring data |
|
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: Sep 2005
Città: Torino
Messaggi: 606
|
Quote:
Ma a pensarci su ora, bisognerebbe vedere se si hanno a disposizione tali funzioni di allocazione dinamica, no? (non so nulla a riguardo) Non ho capito "il tipo di allocazione che vai a fare", (sto supponendo che l'heap sia comunque disponibile)
__________________
"Se proprio dovete piratare un prodotto, preferiamo che sia il nostro piuttosto che quello di qualcun altro." [Jeff Raikes] "Pirating software? Choose Microsoft!" |
|
|
|
|
|
|
#6 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Quote:
pSOS+, VMEExec possono allocare delle regioni di memoria, con un'API del tipo allocate_region(nome, quantita',....). Essendo sistemi operativi HARD real-time, le regioni di memoria hanno dimensioni fissate al momento del build del kernel e vengono allocate in first fit. Ne risulta che anche l'allocazione ha tempi deterministici. In altri casi, anche durante l'allocazione della memoria c'e' un time out, allo scadere del quale l'allocazione fallisce. (Questo e' un ulteriore motivo per arrabbiarsi tanto per il "blind faith" (http://en.wikipedia.org/wiki/Blind_f...rogramming%29). Il 90% degli esempi fatti nelle scuole di tutti i livelli danno sempre per scontato che l'allocazione vada bene, provocando la mia ira Una volta create, le regioni sono visibili a tutti e le si possono identificare tramite il nome assegnato. Un altro "trucco" che che viene (veniva?) spesso usato con questi sistemi, specialmente in ambito VME era quello di inserire una scheda di memoria sul bus (VME appunto) e di "smapparla" dal sistema operativo. In questo modo l'area di memoria in questione risulta non gestito da nessun sistema operativo/CPU che si affaccia sul bus. Essendo l'indirizzo noto, l'area di memoria viene spesso usata come "database di processo"
__________________
In God we trust; all others bring data Ultima modifica di sottovento : 23-01-2014 alle 13:58. |
|
|
|
|
|
|
#7 | |||
|
Senior Member
Iscritto dal: Sep 2005
Città: Torino
Messaggi: 606
|
Quote:
potente, ma immagino i bordelli Quote:
Quote:
tutto il resto è molto interessante, ma non riesco ad apprezzare a pieno per colpa di mancanza di conoscenze.
__________________
"Se proprio dovete piratare un prodotto, preferiamo che sia il nostro piuttosto che quello di qualcun altro." [Jeff Raikes] "Pirating software? Choose Microsoft!" |
|||
|
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Il tuo post mi ha fatto sollevare un sopracciglio. Mi riferivo semplicemente al controllo del ritorno a NULL nel caso della malloc() o alla gestione dell'eccezione std::bad_alloc per la new.
Sono andato a controllare, ed in effetti hai ragione. Pero' in una versione delle man pages presenti in rete c'era scritto: Quote:
Non mi riferivo certamente a questo, ma al piu' classico dei blind faith: per esempio, se apri uno qualsiasi dei thread di questa pagina che parla di liste linkate, vedrai malloc() dappertutto senza che ci sia mai un controllo che la funzione abbia avuto successo. Quello che hai trovato h una portata ben diversa e non ne so assolutamente nulla! Ne sai qualcosa di piu? Qualcun altro ne sa di piu'? Come faccio ad esser veramente sicuro che l'allocazione sia andata a buon fine?
__________________
In God we trust; all others bring data |
|
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Jan 2014
Messaggi: 852
|
Diciamo che i programmi che vedi in giro sul forum servono più che altro per dimostrare il funzionamento delle strutture dati astratte, che la gestione delle eccezioni. Comunque questo bug è disarmante, non ci sono parole...
|
|
|
|
|
|
#10 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Quote:
Anzi, cosi' disarmante che non posso credere che sia caratteristico di Linux e nessuno abbia mai detto o fatto nulla! Immagino che, nonostante quanto le man dicano, se un simile bug esiste non puo' che essere presente solo in alcune distribuzioni, o versioni delle stesse. Altrimenti non avrebbe senso usarlo, no? Penso che sia necessario approfondire il problema... Per quanto riguarda i programmi sul forum: hai ragione un'altra volta. Tuttavia, penso che sia necessario che i docenti non si limitino a spiegare la parte algoritmica, quella "importante", ma che si debba chiarire che un'applicazione e' considerata non funzionante anche se mancano questi dettagli, che di teorico non hanno nulla, ma che sono vitali per il corretto e robusto funzionamento.
__________________
In God we trust; all others bring data |
|
|
|
|
|
|
#11 | ||
|
Senior Member
Iscritto dal: Sep 2005
Città: Torino
Messaggi: 606
|
Quote:
Non so perchè ho pensato subito alla allocazione fallita piuttosto che al fallimento della chiamata a funzione. Ad ogni modo, leggo che optimistic sta a causa della strategia di overcommit dei processi ossia i processi chiedono al s/o più memoria di quanta gliene potrebbe effettivamente servire. Dalla documentazione del kernel Documentation/vm/overcommit-accounting: Quote:
Capisco che crollino le certezze di un utente che rischia di vedere il suo processo ammazzato di punto in bianco secondo chissà quali strane euristiche (da qualche parte ho letto infatti che non viene necessariamente killato un processo pieno zeppo di memory leak) ma stiamo parlando di un qualcosa che non deve accadere tutti i giorni. Voglio far notare che la swap è considerata (in quest'ambito) memoria. Quindi ce ne passa (almeno in ambito desktop) prima di occupare tutta la ram e tutta la swap per finire OOM. Nell'89, quando il mio nuovissimo pc aveva 1MB di ram, forse il problema era maggiormente pressante per i programmatori
__________________
"Se proprio dovete piratare un prodotto, preferiamo che sia il nostro piuttosto che quello di qualcun altro." [Jeff Raikes] "Pirating software? Choose Microsoft!" |
||
|
|
|
|
|
#12 | |
|
Senior Member
Iscritto dal: Sep 2005
Città: Torino
Messaggi: 606
|
Nel frattempo ho trovato questo articolo. Quoto la parte relativa ai sistemi embedded.
Quote:
__________________
"Se proprio dovete piratare un prodotto, preferiamo che sia il nostro piuttosto che quello di qualcun altro." [Jeff Raikes] "Pirating software? Choose Microsoft!" |
|
|
|
|
|
|
#13 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Quote:
__________________
In God we trust; all others bring data |
|
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: Sep 2005
Città: Torino
Messaggi: 606
|
Stavo facendo qualche prova per vedere il comportamento e le soglie sul mio sistema:
Codice:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#define SIZE (10*1024*1024)
int main() {
int i = 0;
printf("page size=%d\n", getpagesize());
while(1) {
char *mem = malloc(SIZE);
printf("\rAllocation #%d", ++i);
if(mem == NULL) {
printf("Out of memory.\n");
fflush(stdout);
exit(1);
}
}
return 0;
}
swap: disabled Memory: 7872048K/8082980K available (5116K kernel code, 807K rwdata, 1628K rodata, 1144K init, 1288K bss, 210932K reserved) /proc/sys/vm/overcommit_ratio = 50 /proc/sys/vm/overcommit_memory = 0 Mi aspettavo di vedere crashare il sistema (overcommit_memory a 0) mentre invece il programma termina correttamente (intendo dire che mem == NULL) allora aggiungo il contatore per vedere quanta memoria alloca prima di terminare: si ferma a 65515! sempre a 65515. Infine aggiungo la chiamata a getpagesize(), non sicuro di quanto siano grandi le pagine per un 64bit: 4k è il risultato. Assolutamente strano! Facendo un paio di conti a braccio, ho circa 7.5GB di memoria disponibile in userspace, allocando 10 MB alla volta mi aspettavo di terminare la memoria in 750 chiamate a malloc, senza considerare l'overcommit. Con quest'ultimo, essendo la ratio a 50, dovrebbe terminare a total_memory+total_memory*0.5+swap_space = 7.5+3.7+0 = 11GB circa, quindi circa 1100 chiamate. Stranamente, cambiando SIZE il risultato è sempre 65515. E tanto per togliermi i dubbi sulla page size, 65515 * 4k fa tipo 256MB, non diversi GB. Qualcuno mi dice dove sbaglio a fare i conti? O del perchè il programma non sembra mostare il comportamento dichiarato nelle pagine di manuale di malloc?
__________________
"Se proprio dovete piratare un prodotto, preferiamo che sia il nostro piuttosto che quello di qualcun altro." [Jeff Raikes] "Pirating software? Choose Microsoft!" |
|
|
|
|
|
#15 |
|
Senior Member
Iscritto dal: Nov 2013
Città: Nel cuore dell'8 Mile di Detroit
Messaggi: 3815
|
in effetti malloc() come open() e fopen() andrebbe sempre controllata a scanso di cantonate oltre che castata (castata, non castrata
|
|
|
|
|
|
#16 | |
|
Senior Member
Iscritto dal: Sep 2005
Città: Torino
Messaggi: 606
|
Quote:
link
__________________
"Se proprio dovete piratare un prodotto, preferiamo che sia il nostro piuttosto che quello di qualcun altro." [Jeff Raikes] "Pirating software? Choose Microsoft!" |
|
|
|
|
|
|
#17 |
|
Senior Member
Iscritto dal: Nov 2013
Città: Nel cuore dell'8 Mile di Detroit
Messaggi: 3815
|
castare malloc intendo non open
|
|
|
|
|
|
#18 |
|
Senior Member
Iscritto dal: Sep 2005
Città: Torino
Messaggi: 606
|
anch'io intendo malloc. Hai visto il link che ho postato?
__________________
"Se proprio dovete piratare un prodotto, preferiamo che sia il nostro piuttosto che quello di qualcun altro." [Jeff Raikes] "Pirating software? Choose Microsoft!" |
|
|
|
|
|
#19 | |
|
Senior Member
Iscritto dal: Sep 2005
Città: Torino
Messaggi: 606
|
Quote:
__________________
"Se proprio dovete piratare un prodotto, preferiamo che sia il nostro piuttosto che quello di qualcun altro." [Jeff Raikes] "Pirating software? Choose Microsoft!" |
|
|
|
|
|
|
#20 |
|
Senior Member
Iscritto dal: Sep 2005
Città: Torino
Messaggi: 606
|
non ricordarsi di importare stdlib.h non mi sembra meno grave del credere che si stia programmando in C quando la realtà è diversa.
_Personalmente_ non vedo perchè aggiungere codice inutile (il cast) e che oltretutto rende lo stesso meno leggibile. Poi questi sono gusti. Sulla free e sul fallimento della malloc che mi dite?
__________________
"Se proprio dovete piratare un prodotto, preferiamo che sia il nostro piuttosto che quello di qualcun altro." [Jeff Raikes] "Pirating software? Choose Microsoft!" |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 02:55.




















