Che cosa fai quando malloc
restituisce 0 o viene generata una nuova eccezione? Basta interrompere o provare a sopravvivere alla condizione OOM / salvare il lavoro dell'utente?
Che cosa fai quando malloc
restituisce 0 o viene generata una nuova eccezione? Basta interrompere o provare a sopravvivere alla condizione OOM / salvare il lavoro dell'utente?
Risposte:
Eviterei l'OOM come evitare un incidente.
Evita di fare un grosso pezzo di lavoro (e alloca un grosso pezzo di memoria) contemporaneamente. Conservare i dati sul disco, fidarsi della cache del disco del sistema operativo e utilizzare il più possibile l'IO mappato in memoria e operare solo su una piccola parte di dati alla volta. Se è necessario disporre di grandi quantità di dati online (forniti con bassa latenza), tenerli nella memoria su più macchine, come fanno tutte le grandi società di motori di ricerca. O acquista un SSD.
La maggior parte delle persone che rispondono a questa domanda probabilmente non hanno mai lavorato su sistemi embedded, dove malloc restituendo 0 è una possibilità molto reale. Su un sistema su cui sto attualmente lavorando, ci sono un totale di 4,25 KB di RAM (ovvero 4352 byte). Sto allocando 64 byte per lo stack e attualmente ho un heap di 1600 byte. Proprio ieri stavo eseguendo il debug di una routine di heap walk in modo da poter seguire l'allocazione e la liberazione della memoria. L'heap walk utilizza un piccolo buffer (30 byte) allocato staticamente per l'output su una porta seriale. Verrà disattivato per la versione di rilascio.
Poiché si tratta di un prodotto di consumo, è meglio che non rimanga a corto di memoria una volta che il prodotto è stato rilasciato. Sono sicuro che lo farà durante lo sviluppo. In ogni caso, tutto ciò che posso fare è emettere un segnale acustico l'altoparlante un paio di volte e forzare un riavvio.
Ad essere onesti, in tutti i progetti che ho fatto (tieni presente che non sto ancora lavorando da nessuna parte), non ho mai pensato che potesse accadere, e quindi suppongo che i miei programmi morirebbero molto rapidamente.
Inoltre, la gestione di una OOM richiede di aver preallocato le risorse per visualizzare il messaggio di errore o per salvare tutto, il che può essere un po 'scomodo.
Sento che in questi giorni, la memoria costa meno delle arachidi, non è qualcosa che dovrebbe accadere frequentemente. All'alba della memoria protetta e prima, forse era una preoccupazione, ma ora? Gli unici errori OOM che io abbia mai visto provengono dal codice errato.
Il controllo dei codici di ritorno malloc è comunque inutile.
I moderni sistemi operativi sovraccaricano la memoria: forniscono ai processi più memoria di quella attualmente disponibile. La memoria concessa al processo è virtuale, tutta mappata su una singola pagina azzerata.
È solo quando si scrive in memoria che una pagina fisica, unica, viene allocata per i processi. Se questa allocazione fallisce, il kernel termina un processo (forse il tuo!) Nel tentativo di trovare memoria. A quel punto non c'è più nulla da fare.
A meno che non si stia sviluppando per sistemi embedded, sistemi in tempo reale o sistemi che sono così critici che i guasti possono costare vite o miliardi di dollari ... Quindi probabilmente non vale la pena finanziariamente preoccuparsi delle condizioni di memoria insufficiente.
Nella maggior parte dei casi, c'è ancora poco da fare quando si è esauriti la memoria, poiché non c'è memoria per creare nuovi oggetti o eseguire attività che potrebbero fare qualcosa. Devi valutare il costo dell'app per la gestione di OOM rispetto al vantaggio che ottieni dal farlo.
Vorrei sempre verificare la presenza di errori. Se qualcosa restituisce una condizione di errore, deve essere gestita dal programma. Anche se è un messaggio che dice "Memoria insufficiente, devo andare!", È meglio di "Violazione dell'accesso", "core dumped" o qualsiasi altra cosa. Una è una condizione di errore che gestisci, l'altra è un bug. E l'utente lo percepirà anche come tale.
Per il tuo caso specifico, potresti provare a ripristinare l'operazione, liberando le risorse che hai allocato fino a raggiungere il punto di errore, riportando l'errore e proseguendo l'esecuzione (forse quando stai provando a chiudere l'applicazione, puoi dare il opzione per uscire immediatamente). In questo modo, l'utente può decidere cosa fare o provare a liberare un po 'di memoria armeggiando, chiudendo file, ecc. Naturalmente, il modo in cui è possibile gestire la situazione dipende fortemente dal programma, un programma che non dovrebbe essere interattivo probabilmente deve solo registrare l'errore e uscire o continuare.