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.
Insira a descrição da imagem aqui
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:
Insira a descrição da imagem aqui
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
    Insira a descrição da imagem aqui
    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
    Insira a descrição da imagem aqui
    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
    Insira a descrição da imagem aqui
    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.

2 Interpretação do código fonte

Acho que você gosta

Origin blog.csdn.net/fs3296/article/details/103810820
Recomendado
Clasificación