Control de recursos incorporado de RAM utilizada en la aplicación.

Control de recursos incorporado de RAM utilizada en la aplicación.



Describe una herramienta de implementación de software bastante simple para controlar los recursos RAM utilizados durante la ejecución de la aplicación. La base de la implementación es la interceptación y el registro de solicitudes de asignación, liberación y reutilización de recursos de memoria enviados por la aplicación al sistema operativo a través de llamadas malloc (), calloc (), realloc (), free () . Todas las solicitudes de memoria se registran en un registro especial y, al final de la aplicación, la información acumulada se muestra en forma de informe en la consola o se escribe en un archivo de texto. El análisis del informe le permite identificar casos de uso ineficiente de RAM en la aplicación. Estos incluyen "pérdidas de memoria" cuando los recursos de memoria solicitados no se liberan y la aplicación no los reclama, la fragmentación, cuando los tamaños de secciones contiguas de memoria contaminadas y liberadas son insuficientes para satisfacer nuevas solicitudes, lo que conduce a la asignación de recursos adicionales.

La herramienta de control de memoria incorporada puede estar encendida o apagada (para registrar solicitudes de memoria), y la posibilidad de cambio de estado programado le permite controlar y optimizar la cantidad de datos recibidos para los recursos de memoria asignados.

Introduccion


Una proporción significativa de los sistemas de software modernos se desarrolla utilizando los lenguajes de programación C #, Java y similares, donde la gestión de los recursos de RAM se realiza a nivel del sistema, minimizando la responsabilidad de los desarrolladores de software. Un ejemplo de tales sistemas de software es el sistema de diseño automatizado de extremo a extremo de Delta Design implementado en C # en un entorno .net . Por otro lado, las herramientas de software del sistema de automatización tienen una "vida útil" bastante larga (hasta varias decenas de años), lo que lleva a la necesidad de mantener tecnologías de administración de memoria RAM "desactualizadas", en particular, al integrar las dos clases de sistema mencionadas en un esquema de control común.

Por esta razón, hasta ahora, el problema urgente en la creación, desarrollo y mantenimiento de aplicaciones de software funcionalmente complejas sigue siendo la necesidad de optimizar la gestión de los recursos de RAM en ellas. Junto con métodos eficientes (punteros inteligentes, recolectores de basura), se sigue utilizando un software que ejecuta solicitudes de recursos de memoria a través de llamadas malloc, calloc, realloc, gratis.
Este enfoque proporciona a los desarrolladores un control total sobre la administración de RAM en la aplicación, al tiempo que le impone un alto nivel de responsabilidad por la liberación oportuna de estos recursos para evitar "fugas".

Como regla general, en las etapas iniciales del desarrollo de software, la tarea de identificar los hechos del uso ineficiente de los recursos de memoria no es una prioridad, ya que la estructura de la aplicación es bastante transparente. Sin embargo, los problemas comienzan a surgir al integrar varios componentes estructurales y funcionales del sistema con esquemas complejos de control distribuido de los recursos de RAM y el intercambio de información entre ellos. El cambio de generaciones de desarrolladores de sistemas también tiene un impacto en la resolución de problemas de optimización de la gestión de los recursos de RAM. Como resultado, las siguientes propiedades negativas comienzan a aparecer en la aplicación:

  • se encuentra una brecha significativa entre el tamaño real de la RAM consumida y las estimaciones de los desarrolladores;
  • Hay un aumento lineal en la memoria dinámica utilizada durante la ejecución de la aplicación.

Las razones del uso ineficiente de la RAM en la aplicación son varios factores, que son composiciones de los siguientes eventos elementales:

  • desajuste de solicitudes para la colocación y liberación de RAM ("fuga");
  • bajo nivel de reutilización de áreas liberadas de RAM, lo que lleva a solicitudes de nuevas áreas (fragmentación).

La práctica de desarrollar y mantener aplicaciones de software con una arquitectura compleja y una funcionalidad desarrollada muestra que el control sobre el uso de los recursos de RAM en ellos debe iniciarse lo antes posible para mantener el control sobre este proceso. Puede controlar los recursos de memoria de la aplicación adquiriendo y utilizando productos de software apropiados (por ejemplo, valgrind ), o implementando e incorporando medios para interceptar y registrar solicitudes de recursos RAM en el código del programa de la aplicación.

A continuación se muestra un ejemplo de una de las posibles implementaciones de este enfoque.

Software de control integrado


La base de la solución presentada es la intercepción mediante el control integrado de todas las solicitudes a los recursos de RAM enviados por la aplicación al sistema operativo en el proceso de su ejecución. Toda la variedad de tales consultas se implementa a través de llamadas a malloc (), realloc () o free () . Un ejemplo de una secuencia de eventos cuando se procesa una solicitud para asignar RAM malloc () cuando los controles integrados están apagados y encendidos se muestra en el diagrama a continuación (se pueden construir diagramas similares para llamadas realloc () o llamadas gratis () ). La banda " A " incluye una secuencia de eventos durante la asignación de memoria que ocurre en el estado apagado del modo de control incorporado. La aplicación envía una solicitud al sistema operativo para asignar el tamaño de memoria requerido y recibe un puntero a la dirección de inicio del fragmento seleccionado. En el caso de que el tamaño de memoria solicitado no esté disponible, se devuelve un puntero con una dirección cero, que la aplicación solicitante debe manejar en consecuencia.



La banda " B " incluye una secuencia de eventos al asignar memoria que ocurre cuando el modo de control incorporado está activado. Esta secuencia coincide completamente con la descrita anteriormente, con la excepción de que después de asignar la memoria solicitada, el control se pasa a la función register_request (), que guarda información sobre la dirección y el tamaño de la memoria asignada de acuerdo con la solicitud realizada.

En realidad, el objeto memSupervisor realiza la intercepción y el registro de las solicitudes a los recursos RAM, que se crea en una sola instancia llamando a init_memSupervisor () y que luego se puede activar o desactivar mediante llamadas a enable_memSupervisor () o disable_ memSupervisor (), respectivamente.
La técnica de interceptar solicitudes de recursos RAM se basa en el uso de variables estáticas de la biblioteca GNU, como se muestra en los siguientes fragmentos de código.





Todas las solicitudes procesadas de recursos RAM se registran en una tabla especial de registros, cuyo contenido se almacena en el atributo memSupervisor.memRegister. Cada entrada contiene la siguiente información:



Cada registro en la tabla está asociado con un punto de control del código del programa, después de pasar por el cual se asigna la memoria y se registra la solicitud.

El generador de informes de texto ( memSupervisor.genReport (nombre_archivo) ) genera un informe utilizando los datos de la tabla y escribiendo información en el archivo de texto especificado (o salida a la consola de la aplicación). La descarga de los datos del informe a la tabla de MS Excel y la configuración correspondiente de esta última le permitirá obtener una representación gráfica de los datos del informe sobre el uso de los recursos de RAM.

Interfaz para controles incorporados


La recopilación de información sobre las solicitudes de aplicaciones para los recursos de RAM se puede implementar compilando y colocando macros en el código fuente de la aplicación que se compilan solo cuando se establece la variable de entorno correspondiente.



A continuación se muestra un código de programa que demuestra el uso de controles integrados.







La siguiente es una ilustración de la aplicación de los medios descritos del control integrado de los recursos de RAM solicitados por la aplicación 'foo' , que realiza el rastreo automático de conexiones en placas de circuito impreso. Para el análisis, se seleccionó un modelo de meandro suficientemente claro y conveniente, que muestra las dimensiones de la memoria dinámica de acceso aleatorio solicitada por la aplicación en el proceso de colocar las conexiones en la placa de circuito impreso.



Este modelo ayuda a identificar los siguientes problemas de gestión de recursos RAM:

  • en los puntos "A" y "D" debe ser aproximadamente el mismo tamaño de RAM utilizada
  • el aumento en el tamaño de la memoria solicitada en la etapa de realizar la conexión de la conexión debe ser suave. Si es necesario, los pasos principales de esta etapa deben controlarse estableciendo puntos de interrupción en los fragmentos de código correspondientes. La eliminación forzada de todos los datos en las conexiones establecidas debería conducir al mismo tamaño de memoria consumida en los puntos "B" y "C"

El siguiente diagrama muestra los problemas de administración de memoria en la aplicación 'foo' mencionada.



Breves conclusiones


Los medios descritos de control integrado de los recursos de RAM se pueden utilizar en los casos en que los productos de software correspondientes no están disponibles y no son aplicables por ningún motivo.

  • Las herramientas de control incorporadas registran y acumulan información sobre los recursos de la memoria solicitada con cualquier grado de precisión y detalle;
  • La capacidad de cambiar los controles integrados entre los modos activo e inactivo le permite configurarlos para extraer y analizar datos en fragmentos seleccionados del código del programa de la aplicación;
  • Los controles incorporados permiten su exclusión completa de la aplicación cuando se ensambla este último sin establecer el parámetro de compilación apropiado;
  • La implementación de un análisis de programa del contenido de los informes recibidos sobre la aplicación de los recursos de RAM utilizados durante la ejecución de la aplicación y la verificación de estos últimos con copias de referencia hace posible desarrollar procedimientos de prueba de regresión para aplicaciones para detectar la degradación en su uso de RAM;
  • El código de programa de este tipo de control de RAM incorporado está abierto para ampliar sus capacidades y adaptarse a las condiciones particulares de su uso;
  • La principal desventaja de las herramientas descritas es la necesidad de incluir el código de control de memoria incorporado en el código de la aplicación monitoreada.

En conclusión, debe tenerse en cuenta que el enfoque descrito para la implementación del control incorporado de los recursos de RAM en aplicaciones de software no contiene soluciones radicalmente nuevas. La utilidad del enfoque radica en la simplicidad de la implementación y en la alta eficiencia de la aplicación práctica.

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


All Articles