gestión de memoria idioma ir

prefacio

Escrito un programa de lenguaje C debe haber conocido método para asignar dinámicamente memoria a través de malloc (), en la que el asignador de memoria usando glibc ptmalloc2 proporcionado.
Además de glibc, la industria tiene una relativamente bien conocida asignador de memoria de tcmalloc jemalloc Google y Facebook. Tanto en evitar la fragmentación de memoria y rendimiento que GLIC que tienen una ventaja comparativa, en un entorno multi-hilo es más eficaz.

Golang también se dio cuenta del asignador de memoria, principios similares y tcmalloc, en pocas palabras, se trata de mantener una gran capacidad de memoria global, cada hilo (Golang como P) mantuvo una pequeña memoria privada, falta de memoria privada y después de la aplicación global.

Además, la asignación de memoria y GC (recolección de basura) están estrechamente relacionados, por lo que es necesario entender los principios antes GC asignación de memoria comprensión.

conceptos básicos

A fin de facilitar la autogestión de la memoria, la práctica consiste en aplicar una memoria del sistema Xianxiang, la memoria se corta en trozos pequeños y luego, a través de un ciertos algoritmos de asignación de memoria para gestionar la memoria.
En el sistema de 64 bits, por ejemplo, la memoria de programa Golang continuación se aplican al sistema mostrado en el inicio:
Aquí Insertar imagen Descripción
la memoria está dividida en pre-aplicación de tramos, de mapa de bits, arena tres partes. Que requieren la asignación de memoria de la arena aquí es los llamados aplicaciones en áreas montón. ¿Qué campo de la gestión vanos y el área de mapa de bits que existen.

tamaño de arena de 512G, con el fin de facilitar la gestión de la arena se divide en una región de una página, cada página es de 8 KB, un total de 512 GB / 8KB páginas;

área lapso de almacenamiento puntero de vanos, cada puntero correspondiente a una página, por lo que el tamaño de la zona de la Escala (512 GB / 8KB) * tamaño de puntero 8byte = 512M

tamaño del área de mapa de bits se calcula por la arena, pero sobre todo para GC.

lapso

palmo es la estructura de datos clave para la gestión de las páginas de arena, cada tramo incluido en uno o una pluralidad de páginas consecutivas, a fin de satisfacer de dispensación pequeños objetos, en un lapso será dividido en tamaño de partícula más pequeño, y para objetos grandes, tales como páginas de más de tamaño, logrado a través de múltiples páginas.

clase

Es con el tamaño del objeto, una serie de división de clases, cada clase representa objetos de un tamaño fijo, y el tamaño de cada tramo. Siguiente tabla:

// class  bytes/obj  bytes/span  objects  waste bytes
//     1          8        8192     1024            0
//     2         16        8192      512            0
//     3         32        8192      256            0
//     4         48        8192      170           32
//     5         64        8192      128            0
//     6         80        8192      102           32
//     7         96        8192       85           32
//     8        112        8192       73           16
//     9        128        8192       64            0
//    10        144        8192       56          128
//    11        160        8192       51           32
//    12        176        8192       46           96
//    13        192        8192       42          128
//    14        208        8192       39           80
//    15        224        8192       36          128
//    16        240        8192       34           32
//    17        256        8192       32            0
//    18        288        8192       28          128
//    19        320        8192       25          192
//    20        352        8192       23           96
//    21        384        8192       21          128
//    22        416        8192       19          288
//    23        448        8192       18          128
//    24        480        8192       17           32
//    25        512        8192       16            0
//    26        576        8192       14          128
//    27        640        8192       12          512
//    28        704        8192       11          448
//    29        768        8192       10          512
//    30        896        8192        9          128
//    31       1024        8192        8            0
//    32       1152        8192        7          128
//    33       1280        8192        6          512
//    34       1408       16384       11          896
//    35       1536        8192        5          512
//    36       1792       16384        9          256
//    37       2048        8192        4            0
//    38       2304       16384        7          256
//    39       2688        8192        3          128
//    40       3072       24576        8            0
//    41       3200       16384        5          384
//    42       3456       24576        7          384
//    43       4096        8192        2            0
//    44       4864       24576        5          256
//    45       5376       16384        3          256
//    46       6144       24576        4            0
//    47       6528       32768        5          128
//    48       6784       40960        6          256
//    49       6912       49152        7          768
//    50       8192        8192        1            0
//    51       9472       57344        6          512
//    52       9728       49152        5          512
//    53      10240       40960        4            0
//    54      10880       32768        3          128
//    55      12288       24576        2            0
//    56      13568       40960        3          256
//    57      14336       57344        4            0
//    58      16384       16384        1            0
//    59      18432       73728        4            0
//    60      19072       57344        3          128
//    61      20480       40960        2            0
//    62      21760       65536        3          256
//    63      24576       24576        1            0
//    64      27264       81920        3          128
//    65      28672       57344        2            0
//    66      32768       32768        1            0

Cada columna de la tabla tienen los siguientes significados:

  • clase: ID de clase, cada estructura lapso tiene un ID de clase, que indica el tipo de objeto que se puede procesar lapso
  • bytes / obj: el número de bytes que representa una clase de objeto
  • bytes / span: el número de bytes ocupados por cada pila palmo, es decir, el tamaño de página de las páginas *
  • Objetos: el número de objetos que se puede asignar a cada tramo, es decir, (bytes / vanos) / (bytes / obj)
  • perder bytes: Cada fragmentación de la memoria lapso producido, es decir, (bytes / vanos)% (bytes / obj)

Visto en la tabla es el tamaño máximo objeto 32K, 32K que el tamaño de la clase está representada por una especial, el ID de clase es 0, contiene sólo un objeto por clase.

estructura de datos lapso

palmo es la unidad básica de gestión de memoria, cada tramo gestionar un objeto de clase en particular, con el objeto de acuerdo con el tamaño, el período de una o más páginas dividido en una pluralidad de bloques administrados.
src/runtime/mheap.go:mspanDefine la estructura de datos:

type mspan struct {
	next *mspan			//链表前向指针,用于将span链接起来
	prev *mspan			//链表前向指针,用于将span链接起来
	startAddr uintptr // 起始地址,也即所管理页的地址
	npages    uintptr // 管理的页数
	
	nelems uintptr // 块个数,也即有多少个块可供分配

	allocBits  *gcBits //分配位图,每一位代表一个块是否已分配

	allocCount  uint16     // 已分配块的个数
	spanclass   spanClass  // class表中的class ID

	elemsize    uintptr    // class表中的对象大小,也即块大小
}

En la clase 10, por ejemplo, como se muestra en el siguiente período de gestión de memoria y la figura:
Aquí Insertar imagen Descripción
spanclass 10, la referencia puede derivar NPAGES tabla de clase = 1, nelems = 56, elemsize 144. lapso de tiempo DirInicial que es inicializado para especificar la dirección de una página. allocBits apunta a un mapa de bits, cada representante de si un bloque se asigna, la presente realización hay dos bloques se ha asignado, también es allocCount 2.

next y prev de tramos múltiples enlace de arriba, lo que facilita la gestión de abarcar múltiples, el siguiente se describirán.

cache

Con el palmo de la unidad básica de gestión de memoria, sino que también tiene una estructura de datos para gestionar la duración, esta estructura de datos llamada mcentral, cada hilo tiene que asignar memoria del Intervalo de tiempo mcentral memoria administrada, aplicaciones multi-hilo con el fin de evitar el bloqueo de memoria constante , el período de golang asignado para la caché de cada hilo, la memoria caché que es caché.

src/runtime/mcache.go:mcacheSe define una estructura de datos de la caché:

type mcache struct {
	alloc [67*2]*mspan // 按class分组的mspan列表
}

array alloc mspan de punteros a la tamaño de la matriz de 2 veces la clase total. Cada elemento de la matriz representa un tipo de listas SPAN CLASS, cada clase tiene dos tipos de Listado de Recorridos, el primer conjunto de objetos representados por la lista contiene un puntero al objeto de que el segundo grupo no está representado en la lista contiene un puntero, GC se hace para mejorar el rendimiento del análisis de la lista lapso no contiene punteros, no hay necesidad de escanear.

Dependiendo de si el objeto contiene un puntero, los sujetos fueron divididos en dos noscan y de exploración, en la que el representante noscan no hay punteros, mientras que los representantes del puntero de exploración necesitan ser escaneados GC.

mCache lapso y una relación de correspondencia, como se muestra a continuación:
Aquí Insertar imagen Descripción
mchache cuando no lapso de inicialización, y dinámicamente la adquisición de la caché central en uso, con el uso de datos, el número de cada clase no es palmo misma. Como se muestra en el número de la figura, clase de la duración de 0 a más de class1, la descripción de la asignación de hilos a ser objetos más pequeños.

central

caché como un hilo de recursos privados es un solo hilo de los servicios, y es el recurso global central para servir a múltiples hilos, un hilo de la memoria cuando el centro se aplicaría cuando un hilo libera la memoria se recuperará hasta el centro.

src/runtime/mcentral.go:mcentralSe define una estructura de datos central:

type mcentral struct {
	lock      mutex     //互斥锁
	spanclass spanClass // span class ID
	nonempty  mSpanList // non-empty 指还有空闲块的span列表
	empty     mSpanList // 指没有空闲块的span列表

	nmalloc uint64      // 已累计分配的对象个数
}
  • Bloqueo: exclusión mutua entre hilos para evitar que varios subprocesos para leer y escribir conflicto
  • spanclass: Cada mcentral administra una cantidad establecida de la lista tiene la misma clase
  • no vacía: se refiere a la memoria, así como una lista de lapso disponibles
  • vacío: no hay memoria se refiere a una lista de lapso disponibles
  • NMALLOC: se refiere al número acumulado de objetos asignados

Hilo obtiene medidas abarcan desde el centro de:

  1. bloqueo
  2. La obtención de un lapso utilizable a partir de lista no vacía, y quitarlo de la lista
  3. Se eliminó el vacío en el Listado de Recorridos
  4. El lapso se devuelve al hilo
  5. Desbloquear
  6. Enhebrar el lapso en el buffer cache

Hilo tendrá una duración de la devolución de los siguientes pasos:

  1. bloqueo
  2. El lapso se elimina de la lista vacía
  3. La esperanza de unirse a la lista noneempty
  4. Desbloquear

Por encima de hilo se pone tramo y tramo devuelva fluya desde la central, por simplicidad, no en los detalles se desarrollan.

montón

estructuras de datos mcentral visibles desde cada objetivo mcentral sólo especificaciones span class de gestión específica. Cada una corresponde a la clase un hecho que mcentral, este conjunto mcentral mheap almacenan en la estructura de datos.

src/runtime/mheap.go:mheapSe define una estructura de datos de la pila:

type mheap struct {
	lock      mutex

	spans []*mspan

	bitmap        uintptr 	//指向bitmap首地址,bitmap是从高地址向低地址增长的

	arena_start uintptr		//指示arena区首地址
	arena_used  uintptr		//指示arena区已使用地址位置

	central [67*2]struct {
		mcentral mcentral
		pad      [sys.CacheLineSize - unsafe.Sizeof(mcentral{})%sys.CacheLineSize]byte
	}
}
  • Bloqueo: mutex
  • palmos: vanos región del punto de la cartografía de la relación entre la duración y la página
  • mapa de bits: mapa de bits de la dirección de inicio
  • arena_start: área arena primera dirección
  • arena_used: La arena actual tiene un área máxima de direccionamiento
  • central: cada clase correspondiente a dos mcentral

Visto desde la estructura de datos, mheap gestiona toda la memoria, la gestión de memoria es, de hecho, a través de un Golang tipos mheap de variables globales.

Memoria del esquema de gestión mheap es el siguiente:
Aquí Insertar imagen Descripción
El sistema se divide en un pre-asignado palmos de memoria, mapa de bits, AREAN tres regiones, a través de la gestión mheap. Luego, busquen en proceso de asignación de memoria.

proceso de asignación de memoria

Hay lógica diferente distribución del tamaño para los diferentes objetos a ser dispensados:

  • (0, 16B) y no contiene los punteros de objeto: distribución Tiny
  • (0, 16B) comprendiendo el puntero del objeto: una distribución normal
  • [16B, 32 KB]: distribución normal
  • (32KB, -): gran asignación de objetos minúsculos y distribución de los cuales pertenecen a la gran categoría de asignación de objetos optimización de la gestión de memoria, donde la única preocupación es el método de asignación general.

Para solicitud de tamaño n de la memoria, por ejemplo, asignar los siguientes pasos:

  1. Obtener el hilo actual caché privada mCache
  2. Calculado con la clase apropiada de acuerdo con la ID tamaño
  3. [Clase] consultar la lista de la amplitud disponible del alloc mCache
  4. Si no está disponible mCache lapso de mcentral solicitar un nuevo tramo se añadió en mCache
  5. Si mcentral tampoco disponible en lapso de mheap solicitar un nuevo tramo para unirse mcentral
  6. Obtenido a partir de la dirección de la extensión y el retorno a un objeto de inactividad

resumen

asignación de memoria Golang es un proceso muy complejo, que también dopado con el proceso de GC, que se describe aquí sólo por sus estructuras de datos críticos, comprender sus principios sin empantanarse en detalles de implementación.

  1. programa de aplicación Golang inicio de una gran capacidad de memoria, y se divide en tramos, de mapa de bits, zona de arena
  2. área de arena por una página se divide en trozos pequeños
  3. lapso de gestionar una o más páginas
  4. mcentral lapso para la gestión de múltiples hilos de aplicaciones para utilizar
  5. mCache como un hilo recursos privados, recursos de mcentral
Publicados 158 artículos originales · ganado elogios 119 · vistas 810 000 +

Supongo que te gusta

Origin blog.csdn.net/u013474436/article/details/103746444
Recomendado
Clasificación