Verwenden dynamischer Zuordnungen in einer unternehmenskritischen / lebenskritischen Software

8

Ist es sicher, dynamische Zuweisungen in einem unternehmenskritischen / lebenskritischen System zu verwenden, oder sollte es vermieden werden?

    
Lior Kogan 02.01.2010, 14:21
quelle

11 Antworten

7

Mit kritischer Software möchten Sie, dass Ihr System ein möglichst deterministisches Verhalten aufweist.

Dynamischer Speicher, Speicherfragmentierung, mögliche Lecks und in einigen Fällen (nicht zu selten) wird es durch Fehlverhalten von malloc viel schwieriger, 100% Determinismus zu erreichen.

Das heißt, wenn ein Teil Ihres Programms (zB ein Algorithmus) eine dynamische Zuweisung erfordert und Sie beweisen können, dass Ihre Speicherzuteilung und -freigabe deterministisch ist (siehe wertvolle Hinweise von RickNZ) ) dann sind Sie näher an einem deterministischen System.

    
MandoMando 02.01.2010, 15:03
quelle
8

Wenn Sie diese Art von Software schreiben, sollten Sie ein großes Buch für die Spezifikation haben, die Sie einhalten (FAA, NATO, FDA, was auch immer), was Sie können und was nicht, und es wird Ihnen sagen.

Im Allgemeinen jedoch; Nein, da die Systeme, die Sie beschreiben, sehr schwer zu beweisen sind. Obwohl in life critical Software normalerweise hardware verantwortlich sein muss, um die Software neu zu starten, wenn ein Fehlerzustand signalisiert wird (dh ein Watchdog-Timer, den die Software evert 100ms zurücksetzen muss, um einen Hardware-Reset zu verhindern) / p>     

James 02.01.2010 14:23
quelle
4

Ein Ansatz, den ich verwendet habe, wenn ich die dynamische Zuweisung in "can not fail" -Anwendungen nicht vollständig vermeiden kann, besteht darin, die Puffer und andere Datenstrukturen, die ich brauche, nur einmal beim Start der App zuzuordnen - also sie muss nie befreit werden. Es sind Schleifen und Freigaben / Löschungen, die nicht mit News / Allocs übereinstimmen, die dazu neigen, Probleme zu verursachen ...

Wenn das nicht genug ist, ist ein anderer Trick, den ich verwendet habe, mit meiner eigenen benutzerdefinierten Version von malloc und free zu laufen, mit Code, der besonders auf häufige Fehlerbedingungen achtet, wie das Freigeben von etwas, das bereits freigegeben wurde, regelmäßig zu überprüfen Freelist Zeiger Integrität, um zu sehen, ob der Gesamtspeicherverbrauch im Laufe der Zeit zunimmt, etc.

    
RickNZ 02.01.2010 14:57
quelle
3

Alle Handelssysteme und andere Banksoftware, an der ich je gearbeitet habe, verwenden die dynamische Zuweisung sehr stark und sie sind für die IBs, die sie verwenden, geschäftskritisch. Ich bevorzuge es, nicht an lebenskritischen Systemen zu arbeiten, kann also nicht für sie sprechen.

    
anon 02.01.2010 14:23
quelle
0

Ich bin neu in C ++; aber da alles in Erinnerung ist; Du wirst es irgendwie benutzen. damit; Warum sollte ein Programmierer es vermeiden?

PS: informative Kommentare sind willkommen. :)

    
rahmivolkan 02.01.2010 14:29
quelle
0

Vermeide es besser. Der kleinste Speicherverlust in Ihrem System wird mit der Zeit Ihr System zum Absturz bringen. Zum Beispiel verwenden lebenskritische Systeme wie Auto und Flugzeug keine dynamische Zuweisung.

    
Phong 02.01.2010 14:23
quelle
0
___ qstnhdr ___ Verwenden dynamischer Zuordnungen in einer unternehmenskritischen / lebenskritischen Software ___ qstntxt ___

Ist es sicher, dynamische Zuweisungen in einem unternehmenskritischen / lebenskritischen System zu verwenden, oder sollte es vermieden werden?

    
___ answer1991825 ___

Ein Ansatz, den ich verwendet habe, wenn ich die dynamische Zuweisung in "can not fail" -Anwendungen nicht vollständig vermeiden kann, besteht darin, die Puffer und andere Datenstrukturen, die ich brauche, nur einmal beim Start der App zuzuordnen - also sie muss nie befreit werden. Es sind Schleifen und Freigaben / Löschungen, die nicht mit News / Allocs übereinstimmen, die dazu neigen, Probleme zu verursachen ...

Wenn das nicht genug ist, ist ein anderer Trick, den ich verwendet habe, mit meiner eigenen benutzerdefinierten Version von malloc und free zu laufen, mit Code, der besonders auf häufige Fehlerbedingungen achtet, wie das Freigeben von etwas, das bereits freigegeben wurde, regelmäßig zu überprüfen Freelist Zeiger Integrität, um zu sehen, ob der Gesamtspeicherverbrauch im Laufe der Zeit zunimmt, etc.

    
___ answer1991723 ___

Alle Handelssysteme und andere Banksoftware, an der ich je gearbeitet habe, verwenden die dynamische Zuweisung sehr stark und sie sind für die IBs, die sie verwenden, geschäftskritisch. Ich bevorzuge es, nicht an lebenskritischen Systemen zu arbeiten, kann also nicht für sie sprechen.

    
___ answer1991739 ___

Ich bin neu in C ++; aber da alles in Erinnerung ist; Du wirst es irgendwie benutzen. damit; Warum sollte ein Programmierer es vermeiden?

PS: informative Kommentare sind willkommen. :)

    
___ answer1991722 ___

Vermeide es besser. Der kleinste Speicherverlust in Ihrem System wird mit der Zeit Ihr System zum Absturz bringen. Zum Beispiel verwenden lebenskritische Systeme wie Auto und Flugzeug keine dynamische Zuweisung.

    
___ antwort1991908 ___

Ich denke, dass Sie die dynamische Speicherzuweisung in missionskritischen Anwendungen, MC-Apps, verwenden können, müssen nicht unbedingt RT-Apps sein, sie bedeuten nur, dass sie für das Funktionieren des Unternehmens entscheidend sind. Wenn dynamische Speicherzuweisungskonstrukte verwendet werden, ist es immer wichtig, große Stresstests durchzuführen, die Speicherlecks anzeigen können, wenn eine reale Kundenumgebung simuliert wird, so dass Sie die Auswirkungen der dynamischen Speicherzuweisung verstehen würden >     

___ answer1992423 ___

Ich denke, es wird sehr schwierig sein, ein vernünftiges System ohne dynamische Speicherzuweisung zu schreiben.

Aber die Standardspeicherverwaltung ist ein allgemeiner Speichermanager mit nur sehr begrenzten Garantien.
Wenn Sie bestimmte Anforderungen haben, sollten Sie eine spezielle Speicherverwaltungsbibliothek geschrieben haben, die den Anforderungen entspricht, die Sie benötigen.

    
___ answer1992282 ___

In eingebetteten Systemen und Leben & amp; mission critical applications ist es das Ziel, die Abhängigkeit von der dynamischen Speicherzuweisung zu reduzieren. Im Allgemeinen wird dynamischer Speicher benötigt, wenn die Anzahl der Instanzen während der Laufzeit nicht ermittelt werden kann. Zum Beispiel wird dynamischer Speicher verwendet, wenn eine Eingabe von dem Benutzer erhalten wird.

Beim Lesen von Daten von Sensoren und Erhalten von Echtzeitdaten von anderen Quellen wird kein dynamischer Speicher verwendet. Viele Anwendungen verwenden eine Warteschlange und behalten nur die aktuellen Daten bei.

Die eingebetteten Systeme verfügen bei der Verwendung der dynamischen Speicherzuweisung über eine Art Speichererforderungsalgorithmus, unabhängig davon, ob es sich um Garbage Collection (GC) handelt, oder der Speicher wird bei der Zuweisung konsolidiert. Wenn kein Speicher verfügbar ist, erzwingen viele Multithread- und Multitasking-Systeme entweder die Speicherbereinigung, das Löschen unnötiger Variablen oder warten auf eine Dauer und versuchen die Zuweisung erneut.

Falls es absolut keinen verfügbaren Speicher gibt (und alle Bemühungen zur Wiederherstellung des Speichers erschöpft sind), ist es an der Zeit, auf die Anforderungsspezifikation zu verweisen und zu sehen, was sie sagt.

    
___ tag123c ___ C ++ ist eine universelle Programmiersprache. Es wurde ursprünglich als Erweiterung von C entworfen und behält eine ähnliche Syntax, ist aber jetzt eine komplett andere Sprache. Verwenden Sie dieses Tag für Fragen zu Code, der mit einem C ++ - Compiler kompiliert werden soll. ___ answer1991721 ___

Wenn Sie diese Art von Software schreiben, sollten Sie ein großes Buch für die Spezifikation haben, die Sie einhalten (FAA, NATO, FDA, was auch immer), was Sie können und was nicht, und es wird Ihnen sagen.

Im Allgemeinen jedoch; Nein, da die Systeme, die Sie beschreiben, sehr schwer zu beweisen sind. Obwohl in life critical Software normalerweise hardware verantwortlich sein muss, um die Software neu zu starten, wenn ein Fehlerzustand signalisiert wird (dh ein Watchdog-Timer, den die Software evert 100ms zurücksetzen muss, um einen Hardware-Reset zu verhindern) / p>     

___ answer1993777 ___

Nun, Sie können die dynamische Zuweisung nicht vermeiden. Irgendwie muss irgendwo Ihr Stack zugewiesen werden. Normalerweise, wenn Leute anfangen, sich übermäßig darüber Sorgen zu machen, ob etwas auf dem Stapel oder dem Haufen ist, ist das ein Zeichen, dass sie ein bisschen komisch geworden sind. Sie können genauso viele oder mehr Stack-bezogene Fehler haben wie mit Heap, aber Sie können die Heap-verwandten Fehler recht einfach beim Testen abfangen, solange Sie keine Bibliotheken verwenden, die ihre eigene Speicherverwaltung verwenden. Aber dann ist C ++ für diese Art von App überhaupt nicht die beste Sprache.

    
___ answer1991834 ___

Mit kritischer Software möchten Sie, dass Ihr System ein möglichst deterministisches Verhalten aufweist.

Dynamischer Speicher, Speicherfragmentierung, mögliche Lecks und in einigen Fällen (nicht zu selten) wird es durch Fehlverhalten von malloc viel schwieriger, 100% Determinismus zu erreichen.

Das heißt, wenn ein Teil Ihres Programms (zB ein Algorithmus) eine dynamische Zuweisung erfordert und Sie beweisen können, dass Ihre Speicherzuteilung und -freigabe deterministisch ist (siehe wertvolle Hinweise von RickNZ) ) dann sind Sie näher an einem deterministischen System.

    
___ answer2000098 ___

Sicher, es gibt kein Problem damit. JEDOCH: Der Ausfall einer Zuweisung sollte nicht dazu führen, dass Ihr Programm fehlschlägt.

Dieses Prinzip gilt auch für Echtzeitprogramme. Ein Echtzeit %code% sollte eine obere Zeitgrenze haben; Es kann Fälle geben, in denen Speicher einfach nicht rechtzeitig verfügbar ist und NULL zurückgegeben werden muss.

Nun könnte man sich fragen, warum ein unternehmenskritisches System funktionieren kann, wenn eine Speicherzuweisung fehlschlägt. Das ist einfach: "Arbeiten" ist typischerweise kein Schwarz-Weiß-Zustand. Jedes interessante unternehmenskritische System hat eine Mischung aus "SHALL" - und "SOLL" -Anforderungen. Die dynamische Speicherzuweisung kann verwendet werden, wenn ein Speicherzuordnungsfehler die Anforderung "SOLL" verletzt. Z.B. "Das System unterstützt 200 Widgets und soll 400 unterstützen" - ordnen Sie die ersten 200 Widgets statisch zu und ordnen Sie die nächsten 200 dynamisch zu.

    
___
Abhijit K Rao 02.01.2010 15:31
quelle
0

In eingebetteten Systemen und Leben & amp; mission critical applications ist es das Ziel, die Abhängigkeit von der dynamischen Speicherzuweisung zu reduzieren. Im Allgemeinen wird dynamischer Speicher benötigt, wenn die Anzahl der Instanzen während der Laufzeit nicht ermittelt werden kann. Zum Beispiel wird dynamischer Speicher verwendet, wenn eine Eingabe von dem Benutzer erhalten wird.

Beim Lesen von Daten von Sensoren und Erhalten von Echtzeitdaten von anderen Quellen wird kein dynamischer Speicher verwendet. Viele Anwendungen verwenden eine Warteschlange und behalten nur die aktuellen Daten bei.

Die eingebetteten Systeme verfügen bei der Verwendung der dynamischen Speicherzuweisung über eine Art Speichererforderungsalgorithmus, unabhängig davon, ob es sich um Garbage Collection (GC) handelt, oder der Speicher wird bei der Zuweisung konsolidiert. Wenn kein Speicher verfügbar ist, erzwingen viele Multithread- und Multitasking-Systeme entweder die Speicherbereinigung, das Löschen unnötiger Variablen oder warten auf eine Dauer und versuchen die Zuweisung erneut.

Falls es absolut keinen verfügbaren Speicher gibt (und alle Bemühungen zur Wiederherstellung des Speichers erschöpft sind), ist es an der Zeit, auf die Anforderungsspezifikation zu verweisen und zu sehen, was sie sagt.

    
Thomas Matthews 02.01.2010 18:08
quelle
0

Ich denke, es wird sehr schwierig sein, ein vernünftiges System ohne dynamische Speicherzuweisung zu schreiben.

Aber die Standardspeicherverwaltung ist ein allgemeiner Speichermanager mit nur sehr begrenzten Garantien.
Wenn Sie bestimmte Anforderungen haben, sollten Sie eine spezielle Speicherverwaltungsbibliothek geschrieben haben, die den Anforderungen entspricht, die Sie benötigen.

    
Martin York 02.01.2010 18:49
quelle
0

Sicher, es gibt kein Problem damit. JEDOCH: Der Ausfall einer Zuweisung sollte nicht dazu führen, dass Ihr Programm fehlschlägt.

Dieses Prinzip gilt auch für Echtzeitprogramme. Ein Echtzeit malloc sollte eine obere Zeitgrenze haben; Es kann Fälle geben, in denen Speicher einfach nicht rechtzeitig verfügbar ist und NULL zurückgegeben werden muss.

Nun könnte man sich fragen, warum ein unternehmenskritisches System funktionieren kann, wenn eine Speicherzuweisung fehlschlägt. Das ist einfach: "Arbeiten" ist typischerweise kein Schwarz-Weiß-Zustand. Jedes interessante unternehmenskritische System hat eine Mischung aus "SHALL" - und "SOLL" -Anforderungen. Die dynamische Speicherzuweisung kann verwendet werden, wenn ein Speicherzuordnungsfehler die Anforderung "SOLL" verletzt. Z.B. "Das System unterstützt 200 Widgets und soll 400 unterstützen" - ordnen Sie die ersten 200 Widgets statisch zu und ordnen Sie die nächsten 200 dynamisch zu.

    
MSalters 04.01.2010 15:08
quelle
-4

Nun, Sie können die dynamische Zuweisung nicht vermeiden. Irgendwie muss irgendwo Ihr Stack zugewiesen werden. Normalerweise, wenn Leute anfangen, sich übermäßig darüber Sorgen zu machen, ob etwas auf dem Stapel oder dem Haufen ist, ist das ein Zeichen, dass sie ein bisschen komisch geworden sind. Sie können genauso viele oder mehr Stack-bezogene Fehler haben wie mit Heap, aber Sie können die Heap-verwandten Fehler recht einfach beim Testen abfangen, solange Sie keine Bibliotheken verwenden, die ihre eigene Speicherverwaltung verwenden. Aber dann ist C ++ für diese Art von App überhaupt nicht die beste Sprache.

    
Charles Eli Cheese 03.01.2010 02:47
quelle

Tags und Links