MONO interpretación de la gestión de la memoria y el reciclaje

breve introducción

Mono compatible con la recuperación automática de la memoria, porque monoaural integrado algoritmo de recolección de memoria. En 1.xa versión 2.x, MONO Fritillaria gestión de memoria y el algoritmo de recuperación integrado, y en la versión 3.x o temprano, se empieza a activar la gestión de memoria y SGEN algoritmo de recuperación.

Este estudio semana 2.6.X versiones BOEHM (Fritillaria) y GC memoria algoritmos de gestión de parte del código. BOEHM pertenece a un proyecto de código abierto, implementado como soportes C / C gestión de memoria y el GC, la parte de memoria proyecto C / C asignado de la interfaz (la malloc u otro asignar interfaces de memoria) la sustitución de las interfaces de asignación de memoria BOEHM presentó (GC_malloc ), es posible lograr una gestión automática de memoria en C / C ++ proyectos, tales como llamadas gratuitas sin tener que liberar manualmente la interfaz de memoria. El MONO se basa Boehm, para lograr una gestión de memoria automática y GC.

 A, se dio cuenta de la forma en GC 

1. El algoritmo de recuento de referencias: algoritmo técnica citada no es el concepto de GC del conjunto de raíces sólo se utiliza el algoritmo. La idea básica es añadir un contador para cada objeto, todos los contadores registran el número de puntos de referencia para el objeto. Cada vez que un nuevo punto de referencia al objeto, se incrementa un contador, por otra parte, si el punto de referencia al objeto está en blanco o vínculos a otros objetos, el contador se decrementa. Cuando el contador es 0, el objeto se borra automáticamente.

Marcar 2. y algoritmo de barrido: también conocido como algoritmo de marca y barrido, marca por marca de todas las etapas hasta la raíz del objeto, el objeto no está marcado, dicho no hay referencias, reciclables, BOEHM es el uso del algoritmo de recuperación automática de la memoria; nodo copiar algoritmo: copiar el nuevo nodo a la zona de memoria en vivo, el tiempo de liberar el área de memoria de edad, el objeto se transfiere, los metadatos también debería necesitar para configurar la capa intermedia, encarnado sin hacer estudios;

 algoritmo de gestión de memoria dos, BOEHM 

algoritmo BOEHM método de marcaje claro, la fase marca mediante el acceso a los nodos raíz y hoja atravesados ​​finalmente todas las referencias existentes en la memoria están marcados, pero no etiquetada memoria (todo se registran desde el montón de memoria asignados BOEHM , por lo tanto parcialmente aclaró unlabeled aliviado).

2,1 Aquí BOEHM Asigna memoria de proceso, antes de introducir el proceso de asignación, la introducción de estructuras de datos críticos.

2.1.1 GC_size_map [2049]

A MAXOBJBYTES (2048 + 1) elementos de la matriz, cada elemento de la matriz a un valor entero, asigna la memoria para localizar rápidamente un múltiplo de la distribución del tamaño de partícula en la asignación de memoria (de hecho, se puede usar (bytes + 16-1) / 16 eludidas esta matriz debe hacer es reducir la cantidad de cálculos ...), pero esto es el tamaño mínimo de 16 BOEHM asignar memoria, que asigna 1 byte, BOEHM destinará 16 bytes de memoria para usted (I aquí se ve código de macro analizar máquina 64 de acuerdo con las definiciones, diferentes plataformas bytes ligeramente diferente, no afectan el análisis).

Mientras que si el tamaño de la memoria asignada es mayor que 2048, esta vez para realizar otra asignación rama grande de memoria (ya que el proceso es similar, por lo que la gran asignación de memoria está temporalmente no estudio, la siguiente descripción se encuentran dentro de la memoria asignada 2048 bytes y el reciclaje de introducción).

2.1.2 GC_obj_kinds [3]

matriz de tres elementos, la matriz se define BOEHM asignado con el fin de distinguir el tipo de memoria, en BOEHM, hay punteros almacenados en la memoria, los puntos de recuperación de memoria y no de memoria normales, este análisis es un proceso de asignación de memoria general (ya que esto es las llamadas de aplicación más a menudo, pero no reclamar la memoria perteneciente a la memoria de la orden BOEHM para hacer su propia gestión de la memoria y la asignación de estos memoria no requiere etiquetado y reciclado), cada elemento contiene una ok_freelist [MAXOBJGRANULES + 1] array, MAXOBJGRANULES 128 , 128 por la razón de que cada gránulos es una distribución de tamaño de partícula, es decir, 16 bytes, 128 * 16 = 2048, es sólo pequeña de memoria se pueden asignar el límite superior.

2.1.3 ok_freelist la matriz de cada elemento es un puntero a la lista libre, señalando el tamaño del bloque de memoria de índice * 16, es decir, el puntero de bloque de memoria con el primer elemento de la lista de las tiendas de 16 bytes tamaño de bloque, y el primer elemento de almacenamiento 128 la lista enlazada de la memoria tamaño del bloque es de 128 * 16 = 2048 punteros del tamaño de bloque de memoria.

La matriz almacenada en papel tamaño de bloque de la memoria: la memoria la hora de asignar, comprueba la lista de prioridad si hay bloque libre, si está presente, se puede eliminar directamente devueltos a la aplicación de una capa superior en la lista, si no, se usará a continuación, llamar a la función de distribución , una mayor asignación de memoria, la memoria está dividida en la lista de memoria vinculada grande y pequeño almacenado en la ok_freelist (particularmente tamaño de la memoria de almacenamiento asignado por el índice de capa superior requiere varios GRANULE determinado).

2.1.4 GC_hblkfreelist [N_HBLK_FLS + 1]

N_HBLK_FLS Array = 28 (esta es la razón por el diseño es tal porque el valor es), GC_hblkfreelist cada elemento se almacena en una lista enlazada de memoria libre, y la diferencia es ok_freelist, su tamaño de memoria es PAGE_SIZE bloque básico, es decir, 4096, y similares ok_freelist, tamaño de bloque para cada elemento de la lista asociada con el índice se almacena, se puede entender, el tamaño del elemento de lista de bloqueo primera memoria es PAGE_SIZE, el segundo es PAGE_SIZE * 2, y así sucesivamente. A medida que el artículo describe sólo una pequeña asignación de memoria, no hay necesidad de considerar el manejo de una especialmente grande la asignación de memoria.

La asignación de la memoria cuando sea necesario, por ejemplo cuando se solicita la asignación de 16 bytes de memoria (la capa superior tiene un tamaño de partícula abajo GRANULE llamada alineado), entonces será (bytes + PAGE_SIZE-1) índice / PAGE_SIZE obtenido, y luego detectada GC_hblkfreelist [índice] si existe una velocidad de ralentí, sin recorrido continuará hacia atrás, después de la constatación, dividida en trozos grandes piezas, dos piezas de nuevo después de que el empuje GC_hblkfreelist un lugar adecuado, un frente para dispensar, porque el superior asignado sólo 16 bytes de memoria, cuando la capa superior para el tamaño de la PAGE_SIZE memoria, esta vez será la memoria de 16 bytes se divide, y genera una lista (lista de punteros sin memoria adicional, sólo 16 bytes en los primeros 8 bytes como punteros a) las listas almacenadas ok_freelist [1], en cuyo caso la asignación de memoria superior se puede hacer.

GC_hblkfreelist la memoria se asigna llamadas por los siguientes :

Como puede verse de lo anterior, un proceso de asignación de memoria, detecta por primera vez lista ok_freelist, si existe el bloque libre, vuelve directamente sacados (de proporcionan curso utilizando un etiquetado, se utilizará el GC), si no correspondiente tamaño de la memoria ok_freelist, desde GC_hblkfreelist llamar para obtener la memoria y el almacenamiento PAGE_SIZE, la próxima redistribución puede ser tomado directamente de la ok_freelist, el equivalente de hacer un tipo simple de bloque de memoria.

2.1.5 estructura de datos Hblkhdr

Esta estructura de datos es una estructura de datos críticos, GC puede bloquear el funcionamiento normales gracias a la descripción. Cuando la dispensación PAGE_SIZE de una memoria de GC_hblkfreelist, genera un objeto hblkhdr, este objeto se describe el bloque de memoria PAGE_SIZE, la transferencia de tamaño de bloque de memoria las tiendas hblkhdr (hb_sz, hb_mark5, información descr), hb_sz almacenados superior asignado, en la asignación de 16 bytes, hb_sz se establecerá en 16.

El papel de este elemento se establece en el tamaño de su elemento almacenado en la página (si asignado 16 bytes, la capa superior indica que una asignación de objetos de almacenamiento de memoria hasta 16 bytes), y para almacenar la PÁGINA hb_mark que se usan bloques ( cada bit puede describir un azulejo, cada baldosa un mínimo de 16 bytes, 8 bytes y, por tanto, de 5 bits es suficiente para describir una página, puede ser descrito como 16 * 588 bytes, más de 4096 palabras sección).

Después de una buena estructura HBLKHDR distribución , se almacena en dos matrices, el almacenamiento de (en el presente documento asumido como la posición de inicio PÁGINA puntero P)  top_index [>> 22 es P] -> bottom_index [P 12 es y >> 1024] de posición, porque cada página de 12 a 4096 bytes, es decir, 12 de potencia de 2. Es decir, cada uno de la alta dirección de la página voluntad de 10 como un índice, como el índice 10, que se almacena en la matriz secundaria HBLKHDR (por supuesto, las dos matrices son no tanto un promotor genera matriz secundaria, pero generados durante la operación (de lo contrario demasiado desperdicio de memoria, si se genera un comienzo, se necesitan al menos 102 410 248, es decir, no se utilizarán memoria 8M, y muchos de sitios de anidación durante la operación)),

Después de generar estos datos, un puntero puede encontrar ninguna pertenece HBLKHDR descriptor, y basado en el descriptor, el máximo puede ser consciente del puntero al tamaño del bloque de memoria del objeto y su caja de la bandera (hb_sz y hb_mark).

Después de la introducción de lo anterior, es probable que haya una idea, proceso de asignación de memoria en general: cheque ok_freelist -> GC_hblkfreelist-> Asignar un PAGE-> y se repartió describe HBLKHDR.

Función de llamada de pila, que fue la siguiente:

Setup_header también llamada para inicializar el HBLKHDR correspondiente, para asignar llamadas GC_install_header segunda matriz y distribución HBLKHDR (Esta estructura se recupera de la memoria no asignada) etapa.

Como puede verse en la descripción anterior, el puntero de asignación de memoria BOEHM 32BIT descrito por el mismo si hay un bits de dirección bajo de memoria y de la memoria 64BIT 32 bits simultáneamente, entrará en conflicto, BOEHM eludir este problema (dado que la asignación de la memoria especificando por otros medios posición inicial (en este caso no se veía en detalle, Linux es asignar memoria por sbrk, el BGF también encontró que, debido a que no afectan el proceso de análisis, por lo que sin hacer demasiado de la investigación para más detalles).

Publicado tres artículos originales · ganado elogios 3 · Vistas a 60000 +

Supongo que te gusta

Origin blog.csdn.net/jinangl/article/details/104747577
Recomendado
Clasificación