S.O.: Asignación de memoria dinámica

Tamaño: px
Comenzar la demostración a partir de la página:

Download "S.O.: Asignación de memoria dinámica"

Transcripción

1 Gorka Guardiola Laboratorio de Sistemas, Grupo de Sistemas y Comunicaciones, URJC 17 de febrero de 2010

2 (cc) 2008 Grupo de Sistemas y Comunicaciones. Algunos derechos reservados. Este trabajo se entrega bajo la licencia Creative Commons Attribution-ShareAlike. Para obtener la licencia completa, véase También puede solicitarse a Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.

3 Asignación de memoria Tenemos un trozo (grande) de memoria Queremos repartirlo Dos operaciones, reservar, liberar malloc(2), free(2) Dentro del kernel/runtime o en espacio de usuario Espacio de usuario, se reparte el heap (montón), parte del segmento de datos El segmento de datos (y por tanto el heap) puede crecer con brk(2)

4 Asignación de memoria Por qué? Es importante para poder reutilizar Que significa reservar y liberar? No tiene que ver con el contenido Me apunto en otro sitio qué está reservado Dónde lo apunto?: en la memoria El hueco que reservo y los metadatos compiten por el mismo espacio

5 Limitaciones No puedo mover las reservas ( Quién reescribe los punteros?) Tengo que servir las reservas/liberaciones en el orden que llegan Las reservas/liberaciones son irrevocables Hay que usar un algoritmo en ĺınea, servir las peticiones según vienen Alineamiento a palabra (en el kernel más)

6 Cómo se hace? Tengo que apuntarme qué trozos hay libres y cuales están ocupados Intento hacerlo utilizando y desperdiciando poca memoria Exponiendo lo mínimo del mecanismo interno al usuario (por ejemplo, free(2) no recibe el tamaño) Tiene que costar poco tiempo (es un operación común)

7 Herramientas El asignador puede elegir dónde pone las cosas Y cuanto reserva de más

8 Fragmentación Externa Posiciones ocupadas en medio no me dejan reservar Ejemplo: en el cine sólo quedan huecos de 2 personas pero tenemos un grupo de 5. Interna Reparto en cuantos mínimos Para evitar la fragmentación externa Desperdicio espacio Ejemplo: Mesas de 5 en el restaurante, si sólo viene 1, desperdicio 4.

9 Estrategia, poĺıtica, mecanismo Estrategia: de qué nos vamos a aprovechar para implementarlo de forma eficiente Los programas reservan las cosas con una cierta regularidad Hay tamaños más comunes Se liberan y reservan muchas cosas similares juntas Cómo aprovecharemos esto, puede haber muchas poĺıticas que lo implementen

10 Estrategia, poĺıtica, mecanismo Poĺıtica: cómo vamos a hacerlo El algoritmo en abstracto Por ejemplo, buscar el primer hueco libre, o el que mejor se ajusta

11 Estrategia, poĺıtica, mecanismo Mecanismo: qué estructura de datos/funciones (detallado) lista enlazada de libres y ocupados..., Cabeceras/Pies (headers/footers) Funciones, implementación del algoritmo

12 Estrategia, poĺıtica, mecanismo No están aislados, la estrategia determina una familia de poĺıticas Las poĺıticas determinan que mecanismos son útiles o no En el sentido contrario, mecanismos inadecuados hacen una poĺıtica ineficaz

13 Estrategias Minimizar la fragmentación externa Reservar huecos en un sitio que luego no se queden en medio/dispersos Agrupar juntas cosas que se crean y destruyen a la vez Agrupar juntas cosas del mismo tamaño Redondear a un tamaño mínimo para que no queden recortes

14 Estrategias Minimizar la fragmentación interna Elegir con cuidado cómo ajusta el hueco a la reserva

15 Estrategias Hacer que vaya rápido Caching de los trozos más usados Segregación por tamaño o momento

16 Poĺıticas Minimizar la fragmentación externa Best fit: buscar el hueco que mejor encaja Worst fit: buscar el hueco que peor encaja Tener un tamaño mínimo

17 Poĺıticas Hacerlo rápido First fit: el primero que encaja Segregación por tamaños Quick fit: cachés por tamaños Asignador compuesto: un algoritmo para bloques pequeños (se usan mucho) y otros grandes Buddy system: Dividir en dos recursivamente los huecos

18 Poĺıticas Juntar huecos libres (coalescing) es costoso Si no lo hago, tengo más fragmentación (potencialmente) A veces no es tan importante, espero a que sea imprescindible, mantengo los huecos separados y luego los junto (deferred coalescing)

19 Mecanismos Tener una lista enlazada de libres Una estructura de datos con los diferentes tipos de tamaños libres (un árbol binario para el buddy system, por ejemplo) Lo que hay libre lo apunto en lo que no estoy usando Poner una cabecera, un trozo de memoria justo antes de cada trozo reservado, por ejemplo apunto tamaño para saber en qué lista buscar o más. Poner un pie, para hacer más fácil juntar los trozos libres (coalescing), puedo aprovechar parte de la cabecera anterior Todo esto ocupa (desperdicia), más espacio

20 Mecanismos Envenenar la memoria para encontrar bugs Incluso aunque no tenga apuntados los ocupados, puedo poner un patrón cuando los libero para detectar doble free

21 Compromisos A un lado de la balanza está la cantidad de memoria que uso En estructuras de datos (cabeceras, pies, parte constante), en fragmentación Al otro lado está lo rápido que reserva y libera memoria