Escribir un asignador de memoria
Fragmento para un asignador de memoria en c
Asignadores de memoria 101 - Escriba un asignador de memoria simple
void * malloc ( size_t size );
void free ( void * ptr );
Block * merge_blocks ( Block * block );
// the above three will be implemented first later calloc and realloc Defina la estructura de datos : necesitará una estructura de datos para realizar un seguimiento del tamaño y el estado de asignación de cada bloque. Esto podría ser una estructura simple con tamaño y una bandera que indica si el bloque es libre o no.
Inicialice el montón : cuando comience su programa, deberá dejar de lado una parte de la memoria para actuar como su montón. Esto se puede hacer utilizando la llamada del sistema mmap() .
Implementar malloc() : esta función debe encontrar un bloque libre que sea lo suficientemente grande como para satisfacer la solicitud. Si no existe dicho bloque, debería aumentar el tamaño del montón. Una vez que se encuentra un bloque adecuado, debe marcarse como se asigna y se devuelve su dirección.
Implementar free() : Esta función debe llevar un puntero a un bloque de memoria, marcarlo como libre y potencialmente reducir el tamaño del montón si el bloque liberado está al final.
Implementar realloc() : Esta función debe cambiar el tamaño de un bloque asignado. Esto podría implicar encontrar un nuevo bloque y copiar los datos antiguos.
Manejar la fragmentación : con el tiempo, el montón puede fragmentarse con bloques libres dispersos por todas partes. Es posible que desee implementar una estrategia para desfragmentar el montón, como fusionar bloques libres adyacentes.
En el contexto de un asignador de montón, los "bloques" se refieren a fragmentos de memoria dentro del montón. He aquí por qué los necesitas y cómo funcionan:
¿Por qué bloques? : Cuando administra la memoria, es útil dividirla en trozos manejables o "bloques". Cada bloque se puede asignar y reparar de forma independiente. Esto permite un uso eficiente de la memoria, ya que puede asignar exactamente la mayor cantidad de memoria que necesite, no más y nada menos.
Estructura del bloque : cada bloque típicamente contiene metadatos sobre el bloque (como su tamaño y si está libre o asignado) y los datos reales almacenados en el bloque. El asignador utiliza los metadatos para administrar la memoria.
Asignación : cuando llama malloc() , el asignador busca un bloque libre que sea lo suficientemente grande como para contener la cantidad de datos solicitados. Si encuentra uno, marca ese bloque como asignado y devuelve un puntero a la parte de datos del bloque.
DealLocation : cuando llama free() , el asignador marca el bloque como gratuito, lo que lo pone a disposición para futuras asignaciones. Si el bloque liberado está al final del montón, el asignador también podría reducir el tamaño del montón para liberar la memoria.
Fragmentación : con el tiempo, a medida que los bloques se asignan y desaniman, el montón puede fragmentarse. Esto significa que la memoria libre se divide en bloques pequeños y no contiguos. Esto puede dificultar encontrar un bloque lo suficientemente grande para una llamada malloc() , incluso si hay suficiente memoria libre total. Para manejar esto, los asignadores a menudo incluyen la lógica para desfragmentar el montón, como el reflexión de bloques libres adyacentes.