es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Qué tipo de estructura de memoria/datos debo utilizar para dividir la memoria en bloques/trozos y cómo se implementa?

Se me da un tamaño de hoja de 1024 bytes y un máximo de 5 hojas. Necesito crear una estructura (o estructuras) de asignación dinámica que mantengan todos los datos en un solo lugar y los dividan en bloques. Básicamente, necesito asignar 1024 bytes (o tal vez todo el espacio que tengo, 1024×5 bytes) en una estructura y utilizar la memoria dada en bloques de manera diferente. Y si la hoja se queda sin memoria, necesito asignar una nueva.

Entonces mi pregunta es: ¿Cuál sería la mejor estructura en c++ para este trabajo? Estaba pensando en un vector de char* o void* o tal vez en un clásico arreglo c de char* o void*, pero no estoy del todo seguro. Si es un arreglo, me preguntaba si podría hacer un array[5] y asignar solo el primer elemento, y el primer elemento sería un puntero a 1024 bytes de memoria.

Aquí están las funciones que se realizarán con la estructura (es una implementación simple de un recolector de basura):

  1. Asignar un bloque de memoria de un tamaño dado y devolver un puntero a esa memoria.

  2. Liberar un bloque de memoria dado un atributo “void *region”.

  3. Aumentar el tamaño de un bloque con el atributo “void *region” y el tamaño al que se desea aumentar.

  4. Disminuir el tamaño de un bloque con el atributo “void *region” y el tamaño al que se desea disminuir.

  5. Escribir información de los bloques de memoria asignados en un archivo.

Nota: Todas las funciones están en una clase recolector de basura y todas son estáticas de tipo void (excepto la primera, que es de tipo void*, porque devuelve un puntero al bloque recién asignado).

Nota 2: Las páginas no se asignan una tras otra en la memoria de la máquina, por lo que tienen direcciones diferentes, solo se asignan cuando se necesitan (cuando se está quedando espacio).

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para asignar y administrar eficientemente la memoria en el escenario dado, se puede crear una estructura de datos personalizada utilizando una lista enlazada de bloques de memoria.
    Cada bloque puede tener un tamaño de 1024 bytes y puede asignarse dinámicamente según sea necesario.

    La estructura de datos puede tener una clase llamada “MemoryManager” con los siguientes atributos:

    • Un puntero al primer bloque de memoria asignado.
    • Un contador para realizar un seguimiento del número total de bloques asignados.
    • Una función para asignar un bloque de memoria de un tamaño dado.
    • Una función para liberar un bloque de memoria dado un atributo “void *region”.
    • Una función para aumentar el tamaño de un bloque dado el atributo “void *region” y el tamaño al que se debe aumentar.
    • Una función para disminuir el tamaño de un bloque dado el atributo “void *region” y el tamaño al que se debe reducir.
    • Una función para escribir información de los bloques de memoria asignados en un archivo.

    La lista enlazada de bloques de memoria se puede implementar utilizando una estructura “Chunk” con los siguientes atributos:

    • Un puntero al inicio del bloque de memoria.
    • Un puntero al siguiente bloque en la lista enlazada.
    • Una bandera booleana para indicar si el bloque está libre o en uso.

    La función “allocate” puede recorrer la lista enlazada en busca de un bloque libre del tamaño adecuado. Si no se encuentra dicho bloque, se puede asignar dinámicamente un nuevo bloque y agregarlo a la lista enlazada. Luego se puede devolver la dirección del bloque de memoria.

    La función “free” puede recorrer la lista enlazada en busca del bloque con el atributo “void *region” dado y marcarlo como libre.

    La función “increase” puede recorrer la lista enlazada en busca del bloque con el atributo “void *region” dado y, si hay suficiente espacio en el bloque, aumentar su tamaño y devolver la nueva dirección del bloque de memoria.

    La función “decrease” puede recorrer la lista enlazada en busca del bloque con el atributo “void *region” dado y, si hay suficiente espacio, disminuir su tamaño.

    La función “write” puede recorrer la lista enlazada y escribir información de los bloques de memoria asignados en un archivo.

    Esta estructura de datos personalizada asignará y administrará eficientemente la memoria de manera dinámica, minimizando la fragmentación y evitando las fugas de memoria.

Comments are closed.