¿Cómo libera la memoria del sistema el configurador de espacio STL?
Puntos clave:
1). Considerando el problema de fragmentación de la memoria que pueden causar los bloques pequeños, se diseña un configurador de dos niveles.
Cuando el bloque de configuración supera los 128 bytes, se llama al configurador de primer nivel, que utiliza directamente malloc () y free ().
Cuando el bloque de configuración tiene menos de 128 bytes, se llamará al configurador de segundo nivel. El configurador de segundo nivel utiliza una organización compleja del grupo de memoria para reducir la sobrecarga adicional.
2) El grupo de memoria se gestiona asignando un gran bloque de memoria cada vez y manteniendo la lista enlazada libre correspondiente.
Si hay una asignación de memoria del mismo tamaño, el bloque de memoria se asigna directamente desde la lista libre.
Cuando se libera memoria, el asignador la reclamará a la lista libre.
El configurador de segunda etapa ajustará proactivamente los requisitos de memoria de cualquier bloque pequeño a un múltiplo de 8.
3). La estructura del nodo de lista libre es la siguiente:
Usando el atributo de unión, desde el primer campo, obj puede considerarse como un puntero a otro obj del. misma forma.
Desde el segundo campo, obj puede considerarse como un puntero al bloque real.
Para mantener los punteros necesarios para la lista vinculada, reutilizar un objeto no provoca desperdicio de memoria.
Para la implementación del código, consulte el código fuente STL. A continuación se muestran algunos diagramas.
La relación entre el configurador de primer nivel y el configurador de segundo nivel:
Diagrama esquemático de los cambios en la lista enlazada libre cuando el configurador de segundo nivel asigna memoria: p>
Diagrama esquemático de nivel 2 de cambios en la lista enlazada libre cuando el configurador libera memoria:
Cuando el configurador secundario asigna memoria, los pasos específicos son los siguientes:
1) Determine si el tamaño del bloque de memoria es mayor que 128 bytes; si es mayor, se llama al configurador de primer nivel. Si es menos, continúe con el paso 2).
2) De las 16 listas enlazadas gratuitas, seleccione la lista enlazada gratuita adecuada según el tamaño del bloque de memoria.
3) Determine si la lista enlazada gratuita está vacía. Si está vacía, rellene la lista enlazada gratuita. De lo contrario, continúe con el paso 4).
4). Ajuste la tabla de enlaces libres actual para que apunte a un bloque de memoria y devuelva el bloque de memoria actual. (Similar a la operación de eliminación de una lista vinculada)
Cuando el configurador de segunda etapa libera la memoria, los pasos específicos son los siguientes:
Determine si el tamaño de el bloque de memoria tiene más de 128 bytes. Si es mayor, se llama al configurador de primer nivel. Si es menos, continúe con el paso 2).
2) De las 16 listas enlazadas gratuitas, seleccione la lista enlazada gratuita adecuada según el tamaño del bloque de memoria.
3). Ajuste la tabla de enlaces libres actual para recuperar el bloque de memoria actual. (Similar a la operación de inserción de una lista vinculada)
Diagrama esquemático de los resultados reales del grupo de memoria:
Gestión del grupo de memoria:
1). Determine el grupo de memoria a través de tres variables Uso y tamaño: start_free, end_free, heap_size. ) Hay tres situaciones principales al extraer espacio del grupo de memoria para listas enlazadas gratuitas.
a). Si el espacio restante en el grupo de memoria cumple completamente con los requisitos, modifique directamente el valor de start_free y devuelva el bloque correspondiente.
b). Si el espacio restante en el grupo de memoria no satisface completamente la demanda, pero es suficiente para proporcionar más de un bloque, reduzca la cantidad de bloques asignados y asígnelos.
c). El espacio restante en el grupo de memoria ni siquiera puede proporcionar el tamaño de un bloque, así que use malloc para aumentar el espacio de memoria.
Si malloc tiene éxito, modifique start_free, end_free, heap_size y luego llámese a sí mismo de forma recursiva para reasignar el bloque.
Si malloc no tiene éxito, se busca en la lista libre para ver si hay un bloque lo suficientemente grande.
Si es así, utilice el bloque correspondiente como grupo de memoria, ajuste start_free, end_free y llámese a sí mismo de forma recursiva para reasignar el bloque.
Si no existe, se llama al asignador de primer nivel.