Controle de recursos embutidos da RAM usada no aplicativo

Controle de recursos embutidos da RAM usada no aplicativo



Descreve uma ferramenta de implementação de software bastante simples para controlar os recursos de RAM usados ​​durante a execução do aplicativo. A base da implementação é a interceptação e registro de solicitações de alocação, liberação e reutilização de recursos de memória enviados pelo aplicativo ao sistema operacional através das chamadas malloc (), calloc (), realloc (), free () . Todas as solicitações de memória são registradas em um log especial e, no final do aplicativo, as informações acumuladas são exibidas na forma de um relatório no console ou gravadas em um arquivo de texto. A análise do relatório permite identificar casos de uso ineficiente de RAM no aplicativo. Isso inclui "vazamentos de memória" quando os recursos de memória solicitados não são liberados e não são reivindicados pelo aplicativo, fragmentação, quando os tamanhos de seções de memória contaminadas e liberadas são insuficientes para satisfazer novas solicitações, o que leva à alocação de recursos adicionais.

A ferramenta de controle de memória embutida pode estar ativada ou desativada (para registrar solicitações de memória), e a possibilidade de comutação de estado programada permite controlar e otimizar a quantidade de dados recebidos pelos recursos de memória alocados.

1. Introdução


Uma proporção significativa de sistemas de software modernos é desenvolvida usando as linguagens de programação C #, Java e similares, onde o gerenciamento de recursos de RAM é realizado no nível do sistema, minimizando a responsabilidade dos desenvolvedores de software. Um exemplo desses sistemas de software é o sistema de design completo auxiliado por computador da Delta Design , implementado em C # em um ambiente .net . Por outro lado, o software de sistemas de automação tem uma "vida útil" bastante longa (até várias dezenas de anos), o que leva à necessidade de manter tecnologias de gerenciamento de memória RAM "desatualizadas", em particular, ao integrar as duas classes de sistemas mencionadas em um esquema de controle comum.

Por esse motivo, até agora, o problema urgente na criação, desenvolvimento e manutenção de aplicativos de software funcionalmente complexos continua sendo a necessidade de otimizar o gerenciamento dos recursos de RAM neles. Juntamente com métodos eficientes (ponteiros inteligentes, coletores de lixo), o software continua sendo usado para executar solicitações de recursos de memória por meio de chamadas malloc, calloc, realloc, free.
Essa abordagem fornece aos desenvolvedores controle total sobre o gerenciamento de RAM no aplicativo, enquanto impõe um alto nível de responsabilidade pela liberação oportuna desses recursos, a fim de evitar "vazamentos".

Como regra, nos estágios iniciais do desenvolvimento de software, a tarefa de identificar os fatos do uso ineficiente dos recursos de memória não é uma prioridade, pois a estrutura do aplicativo é bastante transparente. No entanto, problemas começam a surgir ao integrar vários componentes estruturais e funcionais do sistema com esquemas complexos de controle distribuído de recursos de RAM e a troca de informações entre eles. A mudança de gerações de desenvolvedores de sistemas também tem um impacto na solução de problemas de otimização do gerenciamento de recursos de RAM. Como resultado, as seguintes propriedades negativas começam a aparecer no aplicativo:

  • é encontrada uma diferença significativa entre o tamanho real da RAM consumida e as estimativas dos desenvolvedores;
  • Há um aumento linear na memória dinâmica usada durante a execução do aplicativo.

As razões para o uso ineficiente da RAM no aplicativo são vários fatores, que são composições dos seguintes eventos elementares:

  • incompatibilidade de solicitações para posicionamento e liberação de RAM ("vazamento");
  • baixo nível de reutilização de áreas liberadas de RAM, o que leva a solicitações de novas áreas (fragmentação).

A prática de desenvolver e manter aplicativos de software com arquitetura complexa e funcionalidade desenvolvida mostra que o controle sobre o uso dos recursos de RAM neles deve ser iniciado o mais cedo possível, a fim de manter o controle sobre esse processo. Você pode controlar os recursos de memória do aplicativo adquirindo e usando produtos de software apropriados (por exemplo, valgrind ) ou implementando e incorporando meios para interceptar e registrar solicitações de recursos de RAM no código do programa de aplicativo.

Abaixo está um exemplo de uma das possíveis implementações dessa abordagem.

Software de controle incorporado


A base da solução apresentada é a interceptação por meio do controle interno de todas as solicitações aos recursos de RAM enviados pelo aplicativo ao sistema operacional no processo de sua execução. Toda a variedade dessas consultas é implementada por meio de chamadas para malloc (), realloc () ou free () . Um exemplo de uma sequência de eventos ao processar uma solicitação para alocar a RAM malloc () quando os controles internos são desativados e ativados é mostrado no diagrama abaixo (diagramas semelhantes podem ser criados para chamadas realloc () ou gratuitas () ). A banda “ A ” inclui uma sequência de eventos durante a alocação de memória que ocorre no estado desligado do modo de controle interno. O aplicativo envia uma solicitação ao sistema operacional para alocar o tamanho de memória necessário e recebe um ponteiro para o endereço inicial do fragmento selecionado. No caso em que o tamanho da memória solicitada não estiver disponível, um ponteiro com um endereço zero é retornado, que deve ser tratado pelo aplicativo solicitante de acordo.



A banda " B " inclui uma sequência de eventos ao alocar memória que ocorre quando o modo de controle interno está ativado. Essa sequência coincide completamente com a descrita anteriormente, com a exceção de que, após alocar a memória solicitada, o controle é passado para a função register_request (), que salva informações sobre o endereço e o tamanho da memória alocada, de acordo com a solicitação feita.

Na verdade, a interceptação e o registro de solicitações para recursos de RAM são executados pelo objeto memSupervisor, criado em uma única instância chamando init_memSupervisor () e que pode ser ativado ou desativado por meio de chamadas para enable_memSupervisor () ou disable_ memSupervisor (), respectivamente.
A técnica de interceptar solicitações de recursos de RAM é baseada no uso de variáveis ​​estáticas da biblioteca GNU, conforme mostrado nos seguintes fragmentos de código.





Todas as solicitações processadas para recursos de RAM são registradas em uma tabela especial de registros, cujo conteúdo é armazenado no atributo memSupervisor.memRegister. Cada entrada contém as seguintes informações:



Cada registro na tabela é associado a um ponto de controle do código do programa, após passar pelo qual a memória é alocada e a solicitação é registrada.

O gerador de relatório de texto ( memSupervisor.genReport (file_name) ) gera um relatório usando os dados da tabela e gravando informações no arquivo de texto especificado (ou saída para o console do aplicativo). Baixar os dados do relatório para a tabela do MS Excel e configurá-los adequadamente permitirá obter uma representação gráfica dos dados do relatório sobre o uso dos recursos de RAM.

Interface para controles internos


A coleta de informações sobre solicitações de aplicativos para recursos de RAM pode ser implementada compilando e colocando macros no código-fonte do aplicativo que são compiladas apenas quando a variável de ambiente correspondente é configurada.



Abaixo está um código de programa que demonstra o uso de controles internos.







A seguir, é apresentada uma ilustração do uso dos meios descritos para o controle interno dos recursos de RAM solicitados pelo aplicativo 'foo' , que executa o rastreamento automático de conexões em placas de circuito impresso. Para a análise, foi selecionado um modelo suficientemente claro e conveniente do meandro, que exibe as dimensões da memória dinâmica de acesso aleatório solicitada pelo aplicativo no processo de colocação das conexões na placa de circuito impresso.



Este modelo ajuda a identificar os seguintes problemas de gerenciamento de recursos de RAM:

  • nos pontos “A” e “D” deve ter aproximadamente o mesmo tamanho da RAM usada
  • o aumento no tamanho da memória solicitada no estágio de execução da conexão deve ser suave. Se necessário, as principais etapas desse estágio devem ser controladas definindo pontos de interrupção nos fragmentos de código correspondentes. A exclusão forçada de todos os dados nas conexões estabelecidas deve levar ao mesmo tamanho de memória consumida nos pontos "B" e "C"

O diagrama abaixo mostra os problemas de gerenciamento de memória no aplicativo 'foo' mencionado.



Breves conclusões


Os meios descritos de controle integrado dos recursos de RAM podem ser usados ​​nos casos em que os produtos de software correspondentes não estão disponíveis e não são aplicáveis ​​por qualquer motivo.

  • As ferramentas de controle integradas registram e acumulam informações sobre os recursos da memória solicitada com qualquer grau de precisão e detalhes;
  • A capacidade de alternar controles internos entre os modos ativo e inativo permite configurá-los para extrair e analisar dados em fragmentos selecionados do código do programa de aplicativo;
  • Os controles internos permitem sua exclusão completa do aplicativo ao montar o último sem definir o parâmetro de compilação apropriado;
  • A implementação de uma análise de programa do conteúdo dos relatórios recebidos na aplicação dos recursos de RAM usados ​​durante a execução e verificação dos aplicativos com cópias de referência possibilita o desenvolvimento de procedimentos de teste de regressão para os aplicativos detectarem degradação no uso da RAM;
  • O código do programa desse tipo de controle de RAM embutido está aberto para expandir seus recursos e adaptar-se às condições específicas de seu uso;
  • A principal desvantagem das ferramentas descritas é a necessidade de incluir o código de controle de memória embutido no código do aplicativo monitorado.

Em conclusão, deve-se notar que a abordagem descrita para a implementação do controle interno dos recursos de RAM em aplicativos de software não contém nenhuma solução radicalmente nova. A utilidade da abordagem reside na simplicidade da implementação e na alta eficiência da aplicação prática.

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


All Articles