2011-01-03 28 views
10

Imaging tiene algunos bytes que contienen memoria: [++++++ ----- ++++ - ++ - ++++++++ -------- +++ ++]¿Cómo calcular la fragmentación?

Digamos que "+" significa asignado y "-" significa libre.

Estoy buscando la fórmula de cómo calcular el porcentaje de fragmentación.

Antecedentes: estoy implementando una pequeña gestión de memoria dinámica para un dispositivo integrado con memoria estática. Mi objetivo es tener algo que pueda usar para almacenar pequeñas cantidades de datos. La mayoría de los paquetes entrantes a través de la conexión inalámbrica ~ 128 bytes cada uno.

Gracias por su ayuda.

+0

Ahh ... I ver. Depende de qué tan grande sean mis bloques de asignación. – Bigbohne

+0

Si todos sus bloques son aproximadamente del mismo tamaño, y su memoria es estática y su sistema demasiado pequeño para usar el almacenamiento en memoria caché para el acceso a la memoria, la fragmentación puede no importar; debe hacer un seguimiento de las ranuras libres y cuáles no, pero saltar en el acceso no debería costar mucho. Eso contrasta con una unidad de disco electromecánica en la que hay que mover las cabezas cuando se salta, o tal vez un sistema de DRAM y chache lentos donde saltarse podría causar una gran cantidad de errores de caché. –

Respuesta

6

Como dice R., depende exactamente lo que quiere decir con "porcentaje de fragmentación" - pero una fórmula simple que podría utilizar sería:

(free - freemax) 
---------------- x 100% (or 100% for free=0) 
    free 

donde

free  = total number of bytes free 
freemax = size of largest free block 

De esta manera, si toda la memoria está en un bloque grande, la fragmentación es del 0%, y si la memoria está dividida en cientos de pequeños bloques, estará cerca del 100%.

+0

Me gusta esto. tiene que evaluar :) – Bigbohne

6

Calcule cuántos paquetes de 128 bytes puede caber en el diseño de la memoria actual. Dejado ser ese número n.

Calcule cuántos paquetes de 128 bytes puede caber en un diseño de memoria con el mismo número de bytes asignados que el actual, pero sin agujeros (es decir, mueva todo + hacia la izquierda, por ejemplo). Dejar ser ese número N.

Su "relación de fragmentación" sería alfa = n/N

3

Si sus asignaciones son todos más o menos del mismo tamaño, simplemente dividir su memoria hasta en TOTAL/MAXSIZE piezas cada una compuesta de MAXSIZE bytes . Entonces la fragmentación es irrelevante.

Para responder a su pregunta en general, no existe un número mágico para "fragmentación". Debe evaluar los méritos de las diferentes funciones para reflejar cuán fragmentada es la memoria. Aquí está uno que recomendaría, como una función de un tamaño n:

fragmentation(n) = -log(n * number_of_free_slots_of_size_n/total_bytes_free) 

Tenga en cuenta que la log está ahí para mapear las cosas a una escala "0 hasta el infinito"; no deberías evaluar eso en la práctica. En su lugar simplemente puede evaluar:

freespace_quality(n) = n * number_of_free_slots_of_size_n/total_bytes_free 

con 1.0 siendo ideal (capaz de asignar el máximo número posible de objetos de tamaño n) y 0.0 siendo muy malo (no puede asignar ninguna).

0

Si tenía [++++++ ----- ++++ - ++ - ++++++++ -------- +++++] y quería medir la fragmentación del espacio libre (o cualquier otra asignación) Puede medir el tamaño de bloque contiguo promedio Total de bloques/conteo de bloques contiguos.

En este caso sería 4/(5 + 2 + 1 + 8)/4 = 4

Cuestiones relacionadas