Como o Windows rastreia os Locais de Memória em uso?

1

Meu entendimento da definição (básica) de um Memory Leak é um local na memória que foi reservado, mas o ponteiro para essa memória dentro do aplicativo que reservou a memória foi excluído / perdido.

Minha pergunta é a seguinte: para que o Windows (ou qualquer sistema operacional) esteja ciente de que a memória ainda está reservada após a destruição do ponteiro usado para gerenciar essa memória dentro de um aplicativo, deve rastrear independentemente qual memória está em uso. Onde isso acontece e como?

    
por Ieuan Stanley 15.08.2016 / 10:25

2 respostas

2

Você está correto - todos os sistemas operacionais controlam o uso e a alocação de memória separadamente. Esta é uma das funções vitais. Por muitas razões, simplesmente não faria sentido passar o controle total sobre a memória para um processo de usuário - a segurança pode ser apontada como um exemplo: seu processo pode armazenar informações confidenciais na memória, assim o sistema operacional deve gerenciar quais processos serão permitidos acessá-lo.

Geralmente, todos os sistemas operacionais têm um subsistema chamado Gerenciamento de Memória (ou Gerenciador de Memória no Windows), que controla a memória virtual. Outra parte do SO, Hardware Abstraction, mapeia essa memória virtual para dispositivos físicos. Isso, é claro, proíbe a interação direta entre qualquer processo de usuário e memória física.

A interação direta com esta parte do sistema operacional está parcialmente disponível por meio da API pública - consulte Funções de Gerenciamento de Memória para Windows. No Linux existem várias maneiras de acessar a memória, esta página seria melhor maneira de começar com isso.

    
por 15.08.2016 / 11:13
1

Bem, sim, é uma função de uma parte do sistema operacional chamada de gerenciador de memória, mas na verdade isso apenas coloca a questão na estrada um pouco. OP perguntou não só "onde" mas "como" .... então, aqui está como.

O gerenciador de memória do Windows (abrev. Mm) monitora as extensões em uso de endereços virtuais através de um conjunto de estruturas de dados chamado Descritores de Endereços Virtuais . Para o espaço de endereço do modo de usuário, isso é feito por processo. Quando um processo é criado pela primeira vez, não possui VADs. Quando um pedaço do espaço de endereço virtual vai de livre para não-livre - não-livre pode ser reservado, comprometido, mapeado ou uma ou duas opções menos comuns - um VAD é criado. O VAD contém o endereço inicial (sempre alinhado à página) e o tamanho (também sempre alinhados à página) da região, o tipo de alocação (reservado, confirmado, etc.) e algumas outras coisas.

A região descrita por um VAD pode ser redefinida e / ou subdividida. Por exemplo, é muito comum que um grande intervalo reservado tenha uma parte de si mesmo alterada para "confirmada". Isso resulta no VAD original sendo modificado para refletir o novo comprimento da região reservada e um novo VAD criado para descrever a região confirmada. Se a região comprometida sair do "meio" do intervalo definido pelo VAD original, dois novos VADs devem ser criados.

Os VADs de cada processo são organizados em uma estrutura em árvore de um tipo chamado árvore binária balanceada , ou mais especificamente, em splay tree , ordenada pelo virtual inicial endereço de cada região. Ao tentar determinar se um determinado endereço está em uso e, em caso afirmativo, como ele está em uso, o gerenciador de memória "orienta" a árvore para localizar o VAD que inclui o endereço - ou não, se não houver um.

Devido à natureza desse tipo de árvore, essa operação é muito eficiente, tanto para localizar VADs existentes quanto para adicionar e remover VADs. para encontrar VADs existentes, é eficiente da mesma forma que uma "pesquisa binária" é eficiente em uma lista ordenada simples. Se houver, por exemplo, de 31 a 64 VADs na árvore, um máximo de seis VADs devem ser examinados para procurar um determinado endereço. Para 65 a 128 VADs, a pesquisa leva apenas sete etapas, etc. Mas, ao contrário de uma simples lista ordenada, adicionar ou remover entradas não exige a reorganização de todas as existentes.

Quando uma nova região deve ser alocada, a árvore deve ser "caminhada" para encontrar uma região livre de tamanho suficiente. Esta é uma operação moderadamente cara, mas tudo bem, já que isso não acontece com frequência.

Em relação à "destruição do ponteiro" - um ponteiro é apenas um local na memória. Quando eu alocar memória virtual (na API do Windows, a chamada de baixo nível para isso é VirtualAlloc) recebo um ponteiro para a região alocada. Sobrescrever o ponteiro com zero, ou até mesmo desalocar a memória virtual na qual ele está armazenado, não informa ao SO que terminei com a região. Afinal, eu poderia ter copiado esse valor de ponteiro em outro lugar. O que diz ao sistema operacional "Acabei com essa região" é uma chamada para o VirtualFree. Isso remove o VAD que descreveu a região. Obviamente, todo espaço de endereço virtual por processo é um atributo do processo, e qualquer coisa ainda alocada desaparece quando o processo é excluído (porque todos os VADs também desaparecem).

A associação entre números de páginas virtuais e números de páginas físicas é mantida em estruturas chamadas tabelas de páginas . Isso também ajuda a gerenciar o espaço de endereço virtual. Há uma tabela de páginas, consistindo de 512 entradas da tabela de páginas e ocupando uma página, para cada 2 MB de espaço de endereço virtual; Cada PTE descreve uma página. Os PTs são organizados em uma estrutura hierárquica simples, com três níveis em x86 de 32 bits, quatro níveis em x64. Tabelas de páginas correspondentes a extensões de 2 MB de v.a.s. que são todos gratuitos (ou seja, nenhum VADs descreve nada nos 2 MB) na verdade não existe; assim, as entradas correspondentes nos PTs de nível superior são zero. As tabelas de páginas também são mantidas e atualizadas pelo gerenciador de memória do sistema operacional (não pela "camada de abstração de hardware", como afirmado em outra resposta).

(O parágrafo anterior assume o PAE no x86. Sem o PAE, são 1024 PTEs por PT, e existem apenas dois níveis de PTs na árvore.)

No entanto, outro conjunto de dados, o '' PFN array '', rastreia o estado de cada página física. É uma matriz simples de estruturas, indexada pelo número da página física ("número do quadro de página"). Cada elemento da matriz contém informações sobre o estado da página física correspondente: Em quais das listas de páginas do sistema está (livre, em espera, zerada, modificada) ou se está em um ou mais conjuntos de processos, quantos processos são em, etc.

    
por 02.02.2017 / 09:55