En las fuentes de memcached, en el fichero doc/memory_management.txt viene explicado todo el mecanismo de gestión de memoria. Si miramos el fichero slab.c puede verse toda la implementación del slab allocator.
La idea tras este tipo de gestión de memoria es simple: pedir al sistema operativo memoria en unos determinados tamaños,64 bytes, 128 bytes, 256 bytes, hasta un máximo - en el caso de memcached 1 MB -,creando listas con objetos de cada uno de los tamaños (ver slabs.c/slabs_init() ). Cuando el sistema necesita almacenar un objeto, se utiliza aquel trozo de memoria que más se ajuste al tamaño del mismo (en vez de llamar al sistema operativo usando malloc()). En caso de necesitar más memoria memcached lo que hace es reservar un trozo de 1 MB, dividirlo en los trozos necesarios (siempre con los tamaños predefinidos) y asignarlos a la listas libres.
La función slabs.c/slabs_alloc() es la encargada de reservar memoria en uno de los tamaños predeterminados (el slab determinado para un tamaño de objeto se obtiene con slabs.c/slabs_clsid(). Para liberar memoria se usa slabs.c/do_slabs_free().
Con este sistema se evita la fragmentación si se estuviese usando una gestión de memoria basada en malloc() y free(). En contra partida, se desperdicia memoria, porque hay que usar un bloque de memoria con el tamaño adecuado. Así si estamos usando una arquitectura de slabs con una secuencia de 64 bytes, 128 bytes, 256 bytes, 512 bytes, ..., un objeto de 70 bytes tendría que usar un slab de 128 bytes.
1 comentario:
Muy bueno gracias.
Publicar un comentario