Análise do mecanismo de laje
introdução
Slab é um mecanismo de gerenciamento de memória do Linux no sistema parceiro. O tamanho mínimo de processamento de memória do sistema buddy é 4k (ou seja, o tamanho da memória de uma página). No entanto, no uso real de memória, muitos deles são de memória pequena. Para melhorar a eficiência de liberação de aplicativos de memória , evitar a geração de fragmentos de memória e impedir a alocação contínua de memória. A taxa de acertos do cache da CPU é baixa . O Linux projetou um mecanismo de placa no sistema parceiro para resolver esses problemas. Slab pode ser entendido como o pool de objetos do kernel do Linux .
1. Visão Geral
A estrutura de dados de todo o mecanismo de laje é mostrada na figura abaixo.
Nota 1: Muitos campos no descritor de página estão na forma de união, portanto, é melhor visualizá-los em combinação com o código-fonte.
1,1 kmem_cache
Objetos de cache kmem_cache, cada kmem_cache corresponde a um tipo de objeto. O significado de cada campo é o seguinte:
- nome: nome do cache;
- lista: Lista vinculada de cache, todos os kmem_cache serão conectados em uma lista vinculada global;
- refcount: contagem de aplicativos;
- object_size: tamanho do objeto;
- align: o objeto é alinhado com os bytes de alinhamento;
- ctor: Ponteiro de função de inicialização de objeto, pode ser entendido como o construtor de C ++;
- nó: Salve a matriz kmem_cache_node Na arquitetura NUMA, cada nó de memória corresponde a um nó de cache para gerenciamento separado;
- cpu_cache: pool de cache de objetos para cada variável cpu, usado para acelerar a alocação de objetos.
1,2 kmem_cache_node
kmem_cache_node é uma estrutura de cache para diferentes nós de memória. Consiste principalmente em três list_heads, a saber, três listas vinculadas para armazenar descritores de laje. Uma laje é um conjunto de quadros de página consecutivos, que são usados para alocar a memória exigida pelo objeto.
O descritor de laje é combinado com o descritor de página, ou seja, quando o descritor de página descreve a laje, é o descritor de laje. Pelo menos é visto no código-fonte 4.0. De acordo com o livro, os descritores de laje são armazenados em dois lugares:
- Descritor de placa externa: armazenado fora da placa, localizado em um cache comum que não é adequado para ISA DMA apontado por cache_sizes.
- Descritor de laje interna: armazenado dentro da laje, localizado no início do quadro da primeira página atribuído à laje.
Quando o objeto é menor que 512 MB, ou quando os fragmentos internos deixam espaço suficiente na laje para o descritor de laje e o descritor de objeto, o alocador de laje escolhe o segundo esquema. Se o descritor de placa for armazenado fora da placa, o sinalizador CFLGS_OFF_SLAB no campo sinalizadores do descritor de cache é definido como 1; caso contrário, é definido como 0.
Os significados dos campos de lista vinculada dos três descritores de placa de armazenamento são os seguintes:
- slabs_free: laje livre, ou seja, a laje não alocou um objeto;
- slabs_partial: Parte da laje, ou seja, a laje possui objetos alocados, mas ainda existem partes que podem ser alocadas;
- slabs_full: Slabs completos, ou seja, todos os objetos alocáveis foram alocados e não podem ser feitas mais alocações.
As três listas vinculadas irão migrar com o estado.
1,3 página
page é um campo descritor de página. Ao mesmo tempo, quando as bandeiras no campo de descrição de laje aninhada é PG_slab, indica que é um descritor de laje. Existem dois campos-chave s_mem e freelist na estrutura do descritor de página.
- s_mem: aponta para o primeiro objeto neste quadro de página contínua;
- freelist: aponta para uma lista vinculada de objetos livres.
A estrutura de memória apontada por toda a página é a seguinte:
toda a memória é apontada por freelist na frente; a matriz do objeto está na parte de trás e s_mem aponta para o endereço inicial do objeto 1; o meio é o descritor do objeto variedade.
O processo de liberação do aplicativo de objeto é o seguinte:
- Estado inicial
Assumindo que há cinco objetos que podem ser alocados em tamanho, eles são todos livres no início, a lista livre aponta para 0 e a atividade da página é 0. - Alocar três objetos
consecutivamente Depois de alocar três objetos consecutivamente, o freelist aponta para 3 e a atividade da página é 3. - Liberar o objeto 1 Ao
liberar o objeto 1, primeiro reduza a atividade da página de 1 a 2 e, em seguida, troque as posições de 1 e 2 onde o ativo está localizado. Então, ao solicitar objetos posteriormente, solicite o Objeto 1 diretamente.
Nota : Na verdade, a aplicação do objeto e a liberação da placa são muito mais complicadas do que isso. Este método fará com que a taxa de acerto da linha do cache da CPU diminua. Slab usa um mecanismo de coloração para interromper a ordem de alocação de objetos.