Integrierte Ressourcensteuerung des verwendeten RAM in der Anwendung

Integrierte Ressourcensteuerung des verwendeten RAM in der Anwendung



Beschreibt ein relativ einfaches Software-Implementierungstool zur Steuerung der verwendeten RAM-Ressourcen während der Anwendungsausführung. Die Basis der Implementierung ist das Abfangen und Registrieren von Anforderungen für die Zuweisung, Freigabe und Wiederverwendung von Speicherressourcen, die von der Anwendung über die Aufrufe malloc (), calloc (), realloc (), free () an das Betriebssystem gesendet werden. Alle Speicheranforderungen werden in einem speziellen Protokoll aufgezeichnet und am Ende der Anwendung werden die gesammelten Informationen in Form eines Berichts auf der Konsole angezeigt oder in eine Textdatei geschrieben. Durch die Analyse des Berichts können Sie Fälle von ineffizienter RAM-Nutzung in der Anwendung identifizieren. Dazu gehören "Speicherlecks", wenn die angeforderten Speicherressourcen nicht freigegeben werden und von der Anwendung nicht beansprucht werden, Fragmentierung, wenn die Größe kontaminierter und freigegebener zusammenhängender Speicherabschnitte nicht ausreicht, um neue Anforderungen zu erfüllen, was zur Zuweisung zusätzlicher Ressourcen führt.

Das integrierte Speichersteuerungswerkzeug kann ein- oder ausgeschaltet sein (zum Registrieren von Speicheranforderungen), und die Möglichkeit der programmierten Zustandsumschaltung ermöglicht es Ihnen, die für die zugewiesenen Speicherressourcen empfangene Datenmenge zu steuern und zu optimieren.

Einführung


Ein erheblicher Teil der modernen Softwaresysteme wird unter Verwendung der Programmiersprachen C #, Java und dergleichen entwickelt, wobei die Verwaltung der RAM-Ressourcen auf Systemebene erfolgt, wobei die Verantwortung der Softwareentwickler minimiert wird. Ein Beispiel für solche Softwaresysteme ist das durchgängige automatisierte computergestützte Entwurfssystem Delta Design , das in C # in einer .net- Umgebung implementiert ist. Andererseits haben die Softwaretools des Automatisierungssystems eine ziemlich lange „Lebensdauer“ (bis zu mehreren zehn Jahren), was dazu führt, dass „veraltete“ RAM-Speicherverwaltungstechnologien beibehalten werden müssen, insbesondere wenn die beiden genannten Systemklassen in ein gemeinsames Steuerungsschema integriert werden.

Aus diesem Grund besteht das dringende Problem bei der Erstellung, Entwicklung und Wartung funktional komplexer Softwareanwendungen bislang darin, die Verwaltung der darin enthaltenen RAM-Ressourcen zu optimieren. Neben effizienten Methoden (Smart Pointer, Garbage Collectors) wird weiterhin Software verwendet, die Anforderungen für Speicherressourcen über Aufrufe malloc, calloc, realloc, free ausführt .
Dieser Ansatz bietet Entwicklern die volle Kontrolle über die Verwaltung des Arbeitsspeichers in der Anwendung und überträgt ihr gleichzeitig ein hohes Maß an Verantwortung für die rechtzeitige Freigabe dieser Ressourcen, um "Lecks" zu vermeiden.

In der Anfangsphase der Softwareentwicklung hat die Ermittlung der Fakten zur ineffizienten Nutzung von Speicherressourcen in der Regel keine Priorität, da die Struktur der Anwendung recht transparent ist. Es treten jedoch Probleme auf, wenn verschiedene strukturelle und funktionale Komponenten des Systems in komplexe Schemata der verteilten Steuerung von RAM-Ressourcen und des Informationsaustauschs zwischen ihnen integriert werden. Der Generationswechsel von Systementwicklern wirkt sich auch auf die Lösung von Problemen bei der Optimierung der Verwaltung von RAM-Ressourcen aus. Infolgedessen erscheinen die folgenden negativen Eigenschaften in der Anwendung:

  • Es besteht eine erhebliche Lücke zwischen der tatsächlichen Größe des verbrauchten Arbeitsspeichers und den Schätzungen der Entwickler.
  • Während der Anwendungsausführung steigt der verwendete dynamische Speicher linear an.

Die Gründe für die ineffiziente Verwendung von RAM in der Anwendung sind verschiedene Faktoren, die sich aus den folgenden elementaren Ereignissen zusammensetzen:

  • Nichtübereinstimmung von Anforderungen für die Platzierung und Freigabe von RAM ("Leck");
  • Geringe Wiederverwendung freigegebener RAM-Bereiche, was zu Anfragen nach neuen Bereichen führt (Fragmentierung).

Die Praxis der Entwicklung und Wartung von Softwareanwendungen mit einer komplexen Architektur und entwickelten Funktionen zeigt, dass die Kontrolle über die Verwendung der darin enthaltenen RAM-Ressourcen so früh wie möglich begonnen werden sollte, um die Kontrolle über diesen Prozess zu behalten. Sie können die Speicherressourcen der Anwendung steuern, indem Sie geeignete Softwareprodukte (z. B. valgrind ) erwerben und verwenden oder Mittel zum Abfangen und Registrieren von Anforderungen für RAM-Ressourcen im Anwendungsprogrammcode implementieren und einbetten.

Nachfolgend finden Sie ein Beispiel für eine der möglichen Implementierungen dieses Ansatzes.

Embedded Control Software


Die Basis der vorgestellten Lösung ist das Abfangen mittels der eingebauten Steuerung aller Anforderungen an die RAM-Ressourcen, die die Anwendung während ihrer Ausführung an das Betriebssystem sendet. Die gesamte Vielfalt solcher Abfragen wird durch Aufrufe von malloc (), realloc () oder free () implementiert. Ein Beispiel für eine Folge von Ereignissen bei der Verarbeitung einer Anforderung zum Zuweisen von malloc () RAM, wenn die integrierten Steuerelemente aus- und eingeschaltet werden, ist in der folgenden Abbildung dargestellt (ähnliche Diagramme können für realloc () - oder free () -Aufrufe erstellt werden). Das Band " A " enthält eine Folge von Ereignissen während der Zuweisung von Speicher, die im ausgeschalteten Zustand des eingebauten Steuermodus auftreten. Die Anwendung sendet eine Anforderung an das Betriebssystem, um die erforderliche Speichergröße zuzuweisen, und empfängt einen Zeiger auf die Startadresse des ausgewählten Fragments. Wenn die angeforderte Speichergröße nicht verfügbar ist, wird ein Zeiger mit einer Nulladresse zurückgegeben, der von der anfordernden Anwendung entsprechend behandelt werden sollte.



Das Band „ B “ enthält eine Folge von Ereignissen beim Zuweisen von Speicher, die auftreten, wenn der integrierte Steuermodus aktiviert ist. Diese Sequenz stimmt vollständig mit der zuvor beschriebenen überein, mit der Ausnahme, dass nach dem Zuweisen des angeforderten Speichers die Steuerung an die Funktion register_request () übergeben wird, die Informationen über die Adresse und Größe des zugewiesenen Speichers gemäß der gestellten Anforderung speichert.

Das Abfangen und Registrieren von Anforderungen an RAM-Ressourcen erfolgt durch das memSupervisor-Objekt, das in einer einzelnen Instanz durch Aufrufen von init_memSupervisor () erstellt wird und dann über Aufrufe von enable_memSupervisor () bzw. disable_ memSupervisor () ein- oder ausgeschaltet werden kann.
Die Technik zum Abfangen von Anforderungen für RAM-Ressourcen basiert auf der Verwendung statischer Variablen der GNU-Bibliothek, wie in den folgenden Codefragmenten gezeigt.





Alle verarbeiteten Anforderungen für RAM-Ressourcen werden in einer speziellen Datensatztabelle registriert, deren Inhalt im Attribut memSupervisor.memRegister gespeichert ist. Jeder Eintrag enthält folgende Informationen:



Jeder Datensatz in der Tabelle ist einem Kontrollpunkt des Programmcodes zugeordnet, nach dessen Durchlauf der Speicher zugewiesen und die Anforderung registriert wird.

Der Textberichtsgenerator ( memSupervisor.genReport (Dateiname) ) generiert einen Bericht unter Verwendung der Tabellendaten und schreibt Informationen in die angegebene Textdatei (oder gibt sie an die Anwendungskonsole aus). Durch Herunterladen der Berichtsdaten in die MS Excel-Tabelle und die entsprechende Einstellung der letzteren erhalten Sie eine grafische Darstellung der Berichtsdaten zur Verwendung von RAM-Ressourcen.

Schnittstelle zu eingebauten Steuerelementen


Die Erfassung von Informationen zu Anwendungsanforderungen für RAM-Ressourcen kann implementiert werden, indem Makros kompiliert und in den Quellcode der Anwendung eingefügt werden, die nur kompiliert werden, wenn die entsprechende Umgebungsvariable festgelegt ist.



Im Folgenden finden Sie einen Programmcode, der die Verwendung integrierter Steuerelemente demonstriert.







Das Folgende ist eine Darstellung der Anwendung der beschriebenen Mittel zur integrierten Steuerung der RAM-Ressourcen, die von der "foo" -Anwendung angefordert werden, die eine automatische Verfolgung von Verbindungen auf Leiterplatten durchführt. Für die Analyse wurde ein ausreichend klares und bequemes Modell des Mäanders ausgewählt, das die Abmessungen des dynamischen Direktzugriffsspeichers anzeigt, der von der Anwendung beim Verlegen der Verbindungen auf der Leiterplatte angefordert wird.



Dieses Modell hilft bei der Identifizierung der folgenden Probleme bei der Verwaltung von RAM-Ressourcen:

  • an den Punkten "A" und "D" sollte ungefähr die gleiche Größe des verwendeten RAM sein
  • Die Vergrößerung des angeforderten Speichers in der Phase der Verbindungsverlegung sollte reibungslos sein. Falls erforderlich, sollten die Hauptschritte dieser Stufe durch Setzen von Haltepunkten in den entsprechenden Codefragmenten gesteuert werden. Das erzwungene Löschen aller Daten auf verlegten Verbindungen sollte an den Punkten "B" und "C" zu der gleichen Größe des verbrauchten Speichers führen.

Das folgende Diagramm zeigt die Speicherverwaltungsprobleme in der genannten 'foo'- Anwendung.



Kurze Schlussfolgerungen


Das beschriebene Mittel zur integrierten Steuerung von RAM-Ressourcen kann in Fällen verwendet werden, in denen die entsprechenden Softwareprodukte nicht verfügbar sind und aus irgendeinem Grund nicht anwendbar sind.

  • Eingebaute Steuerungswerkzeuge registrieren und sammeln Informationen über die Ressourcen des angeforderten Speichers mit jedem Grad an Genauigkeit und Detailgenauigkeit.
  • Durch die Möglichkeit, integrierte Steuerelemente zwischen aktivem und inaktivem Modus umzuschalten, können Sie sie so konfigurieren, dass Daten in ausgewählten Fragmenten des Anwendungsprogrammcodes extrahiert und analysiert werden.
  • Integrierte Steuerelemente ermöglichen den vollständigen Ausschluss aus der Anwendung, wenn diese zusammengesetzt werden, ohne dass der entsprechende Kompilierungsparameter festgelegt wird.
  • Die Implementierung einer Programmanalyse des Inhalts von Berichten über die Anwendung von RAM-Ressourcen, die während der Anwendungsausführung verwendet werden, und die Überprüfung dieser Berichte anhand von Referenzkopien ermöglicht die Entwicklung von Regressionstestverfahren für Anwendungen, um eine Verschlechterung der RAM-Nutzung festzustellen.
  • Der Programmcode dieser Art von integrierter RAM-Steuerung ist offen, um seine Fähigkeiten zu erweitern und sich an die besonderen Verwendungsbedingungen anzupassen.
  • Der Hauptnachteil der beschriebenen Tools ist die Notwendigkeit, den eingebauten Speichersteuercode in den Code der überwachten Anwendung aufzunehmen.

Zusammenfassend ist anzumerken, dass der beschriebene Ansatz zur Implementierung der integrierten Steuerung von RAM-Ressourcen in Softwareanwendungen keine radikal neuen Lösungen enthält. Der Nutzen des Ansatzes liegt in der Einfachheit der Implementierung und der relativ hohen Effizienz der praktischen Anwendung.

Source: https://habr.com/ru/post/de464919/


All Articles