Contrôle intégré des ressources de la RAM utilisée dans l'application

Contrôle intégré des ressources de la RAM utilisée dans l'application



Décrit un outil d'implémentation logicielle assez simple pour contrôler les ressources RAM utilisées pendant l'exécution de l'application. La base de la mise en œuvre est l'interception et l'enregistrement des demandes d'allocation, de libération et de réutilisation des ressources mémoire envoyées par l'application au système d'exploitation via les appels malloc (), calloc (), realloc (), free () . Toutes les demandes de mémoire sont enregistrées dans un journal spécial et à la fin de l'application, les informations accumulées sont affichées sous forme de rapport sur la console ou écrites dans un fichier texte. L'analyse du rapport vous permet d'identifier les cas d'utilisation inefficace de la RAM dans l'application. Ceux-ci incluent des «fuites de mémoire» lorsque les ressources de mémoire demandées ne sont pas libérées et ne sont pas revendiquées par l'application, la fragmentation, lorsque les tailles des sections contiguës contaminées et libérées de la mémoire sont insuffisantes pour satisfaire de nouvelles demandes, ce qui conduit à l'allocation de ressources supplémentaires.

L'outil de contrôle de mémoire intégré peut être activé ou désactivé (pour enregistrer les demandes de mémoire), et la possibilité de changement d'état programmé vous permet de contrôler et d'optimiser la quantité de données reçues pour les ressources de mémoire allouées.

Présentation


Une proportion importante des systèmes logiciels modernes est développée en utilisant les langages de programmation C #, Java et similaires, où la gestion des ressources RAM est effectuée au niveau du système avec une minimisation de la responsabilité des développeurs de logiciels. Un exemple de tels systèmes logiciels est le système de conception assistée par ordinateur automatisé de bout en bout de Delta Design implémenté en C # dans un environnement .net . En revanche, les logiciels de systèmes d'automatisation ont une «durée de vie» assez longue (jusqu'à plusieurs dizaines d'années), ce qui conduit à la nécessité de maintenir des technologies de gestion de mémoire RAM «obsolètes», en particulier, lors de l'intégration des deux classes de systèmes mentionnées dans un schéma de contrôle commun.

Pour cette raison, jusqu'à présent, le problème urgent de la création, du développement et de la maintenance d'applications logicielles fonctionnellement complexes reste la nécessité d'optimiser la gestion des ressources RAM qui s'y trouvent. Parallèlement à des méthodes efficaces (pointeurs intelligents, ramasse-miettes), un logiciel continue d'être utilisé pour exécuter les demandes de ressources mémoire via les appels malloc, calloc, realloc, free.
Cette approche offre aux développeurs un contrôle total sur la gestion de la RAM dans l'application, tout en lui imposant un haut niveau de responsabilité pour la libération rapide de ces ressources afin d'éviter les "fuites".

En règle générale, aux étapes initiales du développement logiciel, la tâche d'identifier les faits d'une utilisation inefficace des ressources mémoire n'est pas une priorité, car la structure de l'application est assez transparente. Cependant, des problèmes commencent à émerger lors de l'intégration de divers composants structurels et fonctionnels du système avec des schémas complexes de contrôle distribué des ressources RAM et de l'échange d'informations entre eux. Le changement de générations de développeurs de systèmes a également un impact sur la résolution des problèmes d'optimisation de la gestion des ressources RAM. Par conséquent, les propriétés négatives suivantes commencent à apparaître dans l'application:

  • un écart significatif est trouvé entre la taille réelle de la RAM consommée et les estimations des développeurs;
  • Il y a une augmentation linéaire de la mémoire dynamique utilisée pendant l'exécution de l'application.

Les raisons de l'utilisation inefficace de la RAM dans l'application sont divers facteurs, qui sont des compositions des événements élémentaires suivants:

  • inadéquation des demandes de placement et de libération de RAM («fuite»);
  • faible niveau de réutilisation des zones libérées de RAM, ce qui conduit à des demandes de nouvelles zones (fragmentation).

La pratique consistant à développer et à maintenir des applications logicielles avec une architecture complexe et des fonctionnalités développées montre que le contrôle de l'utilisation des ressources RAM en elles doit être démarré le plus tôt possible afin de maintenir le contrôle de ce processus. Vous pouvez contrôler les ressources mémoire de l'application en acquérant et en utilisant des produits logiciels appropriés (par exemple, valgrind ), ou en implémentant et en incorporant des moyens pour intercepter et enregistrer des demandes de ressources RAM dans le code du programme d'application.

Vous trouverez ci-dessous un exemple de l'une des implémentations possibles de cette approche.

Logiciel de contrôle intégré


La base de la solution présentée est l'interception au moyen du contrôle intégré de toutes les requêtes aux ressources de RAM envoyées par l'application au système d'exploitation en cours d'exécution. Toute la variété de ces requêtes est implémentée via des appels à malloc (), realloc () ou free () . Un exemple de séquence d'événements lors du traitement d'une demande d'allocation de RAM malloc () lorsque les commandes intégrées sont désactivées et activées est illustré dans le diagramme ci-dessous (des diagrammes similaires peuvent être créés pour les appels realloc () ou free () ). La bande « A » comprend une séquence d'événements lors de l'allocation de mémoire se produisant à l'état désactivé du mode de contrôle intégré. L'application envoie une demande au système d'exploitation pour allouer la taille de mémoire requise et reçoit un pointeur vers l'adresse de début du fragment sélectionné. Dans le cas où la taille de mémoire demandée n'est pas disponible, un pointeur avec une adresse nulle est renvoyé, qui doit être géré par l'application demandeuse en conséquence.



La bande « B » comprend une séquence d'événements lors de l'allocation de mémoire qui se produit lorsque le mode de contrôle intégré est activé. Cette séquence coïncide complètement avec celle décrite précédemment, à l'exception qu'après avoir alloué la mémoire demandée, le contrôle est passé à la fonction register_request (), qui enregistre des informations sur l'adresse et la taille de la mémoire allouée en fonction de la demande effectuée.

En fait, l'interception et l'enregistrement des requêtes dans les ressources RAM sont effectués par l'objet memSupervisor, qui est créé dans une seule instance en appelant init_memSupervisor () et qui peut ensuite être activé ou désactivé via des appels à enable_memSupervisor () ou disable_ memSupervisor (), respectivement.
La technique d'interception des demandes de ressources RAM est basée sur l'utilisation de variables statiques de la bibliothèque GNU, comme indiqué dans les fragments de code suivants.





Toutes les demandes traitées de ressources RAM sont enregistrées dans une table spéciale d'enregistrements, dont le contenu est stocké dans l'attribut memSupervisor.memRegister. Chaque entrée contient les informations suivantes:



Chaque enregistrement de la table est associé à un point de contrôle du code programme, après passage par lequel la mémoire est allouée et la requête est enregistrée.

Le générateur de rapport texte ( memSupervisor.genReport (nom_fichier) ) génère un rapport en utilisant les données de la table et en écrivant des informations dans le fichier texte spécifié (ou en sortie sur la console d'application). Le téléchargement des données de rapport dans le tableau MS Excel et le réglage correspondant de ce dernier vous permettront d'obtenir une représentation graphique des données de rapport sur l'utilisation des ressources RAM.

Interface avec les commandes intégrées


La collecte d'informations sur les demandes d'application de ressources RAM peut être implémentée en compilant et en plaçant dans le code source de l'application des macros qui sont compilées uniquement lorsque la variable d'environnement correspondante est définie.



Vous trouverez ci-dessous un morceau de code de programme qui illustre l'utilisation des contrôles intégrés.







Ce qui suit est une illustration de l'utilisation des moyens décrits du contrôle intégré des ressources RAM demandées par l'application 'foo' , qui effectue le traçage automatique des connexions sur les cartes de circuits imprimés. Pour l'analyse, un modèle suffisamment clair et pratique du méandre a été sélectionné, qui affiche les dimensions de la mémoire vive dynamique demandée par l'application en train de poser les connexions sur la carte de circuit imprimé.



Ce modèle permet d'identifier les problèmes suivants de gestion des ressources RAM:

  • aux points «A» et «D» doivent avoir approximativement la même taille que la mémoire RAM utilisée
  • l'augmentation de la taille de la mémoire demandée au stade de la pose de la connexion doit être régulière. Si nécessaire, les principales étapes de cette étape doivent être contrôlées en définissant des points d'arrêt dans les fragments de code correspondants. La suppression forcée de toutes les données sur les connexions établies devrait conduire à la même taille de mémoire consommée aux points «B» et «C»

Le diagramme ci-dessous montre les problèmes de gestion de la mémoire dans l'application 'foo' mentionnée.



Brèves conclusions


Les moyens de contrôle intégré des ressources RAM décrits peuvent être utilisés dans les cas où les produits logiciels correspondants ne sont pas disponibles et ne sont applicables pour aucune raison.

  • Les outils de contrôle intégrés enregistrent et accumulent des informations sur les ressources de la mémoire demandée avec n'importe quel degré de précision et de détail;
  • La possibilité de basculer les contrôles intégrés entre les modes actif et inactif vous permet de les configurer pour extraire et analyser les données dans des fragments sélectionnés du code du programme d'application;
  • Les contrôles intégrés permettent leur exclusion complète de l'application lors de l'assemblage de cette dernière sans définir le paramètre de compilation approprié;
  • La mise en œuvre d'un programme d'analyse du contenu des rapports reçus sur l'application des ressources RAM utilisées lors de l'exécution des applications et de vérification de ces dernières avec des copies de référence permet de développer des procédures de tests de régression pour les applications afin de détecter la dégradation de leur utilisation de la RAM;
  • Le code de programme de ce type de contrôle RAM intégré est ouvert pour étendre ses capacités et s'adapter aux conditions particulières de son utilisation;
  • Le principal inconvénient des outils décrits est la nécessité d'inclure le code de contrôle de la mémoire intégrée dans le code de l'application contrôlée.

En conclusion, il convient de noter que l'approche décrite pour la mise en œuvre du contrôle intégré des ressources RAM dans les applications logicielles ne contient pas de solutions radicalement nouvelles. L'utilité de l'approche réside dans la simplicité de mise en œuvre et dans une efficacité d'application plutôt élevée.

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


All Articles