Directorio artículo
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:
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:mspan
Define 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:
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:mcache
Se 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:
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:mcentral
Se 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:
- bloqueo
- La obtención de un lapso utilizable a partir de lista no vacía, y quitarlo de la lista
- Se eliminó el vacío en el Listado de Recorridos
- El lapso se devuelve al hilo
- Desbloquear
- Enhebrar el lapso en el buffer cache
Hilo tendrá una duración de la devolución de los siguientes pasos:
- bloqueo
- El lapso se elimina de la lista vacía
- La esperanza de unirse a la lista noneempty
- 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:mheap
Se 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:
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:
- Obtener el hilo actual caché privada mCache
- Calculado con la clase apropiada de acuerdo con la ID tamaño
- [Clase] consultar la lista de la amplitud disponible del alloc mCache
- Si no está disponible mCache lapso de mcentral solicitar un nuevo tramo se añadió en mCache
- Si mcentral tampoco disponible en lapso de mheap solicitar un nuevo tramo para unirse mcentral
- 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.
- programa de aplicación Golang inicio de una gran capacidad de memoria, y se divide en tramos, de mapa de bits, zona de arena
- área de arena por una página se divide en trozos pequeños
- lapso de gestionar una o más páginas
- mcentral lapso para la gestión de múltiples hilos de aplicaciones para utilizar
- mCache como un hilo recursos privados, recursos de mcentral