2010-01-02 5 views
8

È sicuro utilizzare allocazioni dinamiche in un sistema mission-critical/vitale, o dovrebbe essere evitato?Utilizzo di allocazioni dinamiche in un software mission-critical/life-critical

+6

mission critical! = life critical. –

+3

È una questione di tempo, non allocare mentre la macchina a raggi X eroga la dose. http://en.wikipedia.org/wiki/Therac-25 –

+2

Per espandere GregS: Mission-critical significa che qualcosa di importante non funziona se il software non funziona. Non implica necessariamente in tempo reale. Life-critical significa che è probabile che qualcuno muoia di guasti software o delle sue conseguenze immediate e dirette, e in genere è in tempo reale. –

risposta

7

Con software critico si vuoi che il tuo sistema abbia un comportamento deterministico il più possibile

Memoria dinamica, frammentazione della memoria, possibili perdite e in alcuni casi d'angolo (non troppo rari) il comportamento scorretto di malloc renderà molto più difficile ottenere il determinismo del 100%.

Detto questo, se parte del programma (ad esempio un algoritmo) richiede l'allocazione dinamica e si può dimostrare che l'allocazione della memoria e de-allocazione (gratuito) saranno deterministico (vedere le note preziose da RickNZ) allora si' più vicino ad avere un sistema deterministico.

8

Se stai scrivendo questo tipo di software, dovresti avere un grosso libro per le specifiche a cui ti stai conformando (FAA, NATO, FDA, qualunque cosa) di ciò che puoi e non puoi fare, e te lo dirà.

In generale, tuttavia; no, dal momento che i sistemi che descrivi sono molto difficili da dimostrare. Anche se nella vita del software critico normalmente ci deve essere hardware responsabile per il riavvio del software se una condizione di errore viene segnalato (cioè, un timer watchdog che il software deve ripristinare Evert 100ms per evitare un reset hardware)

+0

E se sto scrivendo questo libro? –

+28

Se devi fare questa domanda qui, non dovresti esserlo. –

+0

Oh! Quindi probabilmente dovresti sapere meglio della maggior parte delle persone che risponderanno a questa domanda :) Direi di no: non consentire l'allocazione dinamica. La memoria è così a buon mercato che i grandi buffer statici dovrebbero bastare. – James

0

Meglio evitare di esso. La più piccola perdita di memoria nel tuo sistema col tempo farà crashare il tuo sistema. Ad esempio, il sistema vitale come la macchina e il piano aereo non utilizzano l'allocazione dinamica.

+0

Non tutte le perdite sono perdite di memoria. –

+0

quindi niente GC! pensa a quei riferimenti permanentemente ritenuti che sono stati liberati. Non si tratta tanto delle perdite di memoria quanto del tempo necessario per assegnarle, a volte la memoria dinamica può richiedere del tempo in casi fortemente frammentati, proprio come un GC può richiedere un po 'di tempo per essere raccolto. – gbjbaanb

+0

Esistono sistemi GC in tempo reale che offrono runtime limitati. Il GC soft in tempo reale è abbastanza comune: Erlang utilizza tale GC di default e Java ha una specifica standard per questo, sebbene non abbia mai usato un'implementazione. –

3

Tutti i sistemi di trading e altri software bancari a cui ho mai lavorato utilizzano l'allocazione dinamica molto pesantemente e sono mission critical per gli IB che li utilizzano. Preferisco evitare di lavorare su sistemi vitali, quindi non posso parlare per loro.

0

Sono nuovo di C++; ma poiché tutto è in memoria; lo userai in qualche modo. così; perché un programmatore dovrebbe evitarlo?

PS: sono graditi commenti informativi. :)

+3

È possibile in C++ che tutte le allocazioni siano nello stack, sebbene non l'abbia mai visto in un sistema di grandi dimensioni. –

+0

Oppure tutti i dati devono essere statici o in pila. – James

+3

E per tutta la memoria da allocare durante l'avvio dell'applicazione. – erikkallen

4

Un approccio che ho utilizzato quando non riesco a evitare completamente l'allocazione dinamica in applicazioni "non può fallire" è quello di allocare i buffer e altre strutture dati di cui ho bisogno solo una volta, quando l'app inizia per la prima volta - - quindi non hanno mai bisogno di essere liberati. È loop e libera/elimina che non corrispondono alle notizie/allocazioni che tendono a causare problemi ...

Quando non è abbastanza, un altro trucco che ho usato è quello di eseguire con la mia versione personalizzata di malloc e gratuito , con il codice che richiede particolare attenzione per verificare condizioni di errore comuni, come liberare qualcosa che è già stato liberato, verificando regolarmente l'integrità del puntatore freelist, cercando di vedere se l'utilizzo totale della memoria sta aumentando nel tempo, ecc.

0

Ritengo che si possa sicuramente utilizzare l'allocazione dinamica della memoria nelle app mission critical, le app MC, non necessariamente le app RT, ma solo che sono fondamentali per il funzionamento aziendale. Quando vengono utilizzati costrutti di allocazione di memoria dinamica, è sempre essenziale avere test di stress di grandi dimensioni, in grado di visualizzare perdite di memoria, quando viene simulato l'ambiente reale del cliente, in modo da capire l'impatto dell'allocazione dinamica della memoria.

0

Nei sistemi embedded e nella vita & applicazioni mission critical, l'obiettivo è ridurre la dipendenza dall'allocazione dinamica della memoria.Generalmente, la memoria dinamica è necessaria quando il numero di istanze non può essere determinato durante l'esecuzione. Ad esempio, la memoria dinamica viene utilizzata quando si ottiene l'input dall'utente.

Durante la lettura dei dati dai sensori e l'acquisizione di dati in tempo reale da altre fonti, la memoria dinamica non viene utilizzata. Molte applicazioni utilizzano una coda e conservano solo i dati correnti.

I sistemi incorporati, quando si utilizza l'allocazione dinamica della memoria, avranno una sorta di algoritmo di recupero della memoria, che si tratti di Garbage Collection (GC) o che la memoria venga consolidata in fase di allocazione. Se non è disponibile memoria, molti sistemi multi-thread e multi-tasking forzeranno la garbage collection, elimineranno le variabili non necessarie o attenderanno una durata e tenteranno nuovamente l'allocazione.

Nel caso in cui non ci sia memoria disponibile (e tutti gli sforzi per recuperare la memoria sono stati esauriti) è tempo di fare riferimento alle specifiche dei requisiti e vedere cosa dice.

0

Penso che sarà molto difficile scrivere qualsiasi sistema abbastanza grande senza allocazione dinamica della memoria.

Ma la gestione di memoria predefinita è un gestore di memoria generale con garanzie solo molto limitate.
Se si dispone di requisiti specifici, è necessario aver scritto una libreria di gestione della memoria specializzata conforme ai requisiti necessari.

-4

Bene, non è possibile evitare l'allocazione dinamica. In qualche modo, da qualche parte, il tuo stack deve essere allocato almeno. Di solito quando le persone iniziano a preoccuparsi eccessivamente di sapere se qualcosa è in pila o l'heap è un segno, sono diventati un po 'divertenti. Puoi avere tanti o più errori relativi allo stack come relativi all'heap, ma puoi facilmente catturare quelli relativi all'heap abbastanza facilmente, a patto di evitare librerie che usano la loro gestione della memoria. Ma in primo luogo C++ non è la lingua migliore per questo tipo di app.

+0

È possibile evitare l'allocazione dinamica nel percorso veloce di un programma persistente. Questo è un passo cruciale verso un comportamento deterministico in tempo reale. – Tom

+0

Grazie per il giovane downmodding. l'allocazione dinamica è certamente deterministica. Puoi anche specificare l'allocazione desiderata, inclusa un'implementazione dello stack. –

+0

La risposta non fornisce necessariamente aiuto, parla più dell'implementazione corrente che di informazioni su come superare i problemi di DMA. –

0

Certo, non ci sono problemi con questo. TUTTAVIA: il fallimento di un'assegnazione non dovrebbe causare il fallimento del programma.

Questo principio si estende ai programmi in tempo reale. Un malloc in tempo reale dovrebbe avere un limite superiore di tempo; potrebbero esserci casi in cui la memoria non è semplicemente disponibile in tempo e deve restituire NULL.

Ora, ci si potrebbe chiedere perché un sistema mission-critical può funzionare quando un'allocazione di memoria fallisce. Questo è semplice: "lavorare" in genere non è una condizione in bianco e nero. Qualsiasi interessante sistema mission-critical ha un mix di requisiti "SHALL" e "DOVREBBE". L'allocazione dinamica della memoria può essere utilizzata quando un errore nell'allocazione della memoria viola un requisito "DOVUTO". Per esempio. "il sistema DEVE supportare 200 widget e DOVREBBE supportare 400" - allocare staticamente i primi 200 widget e allocare dinamicamente i 200 successivi.

Problemi correlati