TEMA 3. GESTIÃN DE MEMORIA - Universidad de AlmerÃa
TEMA 3. GESTIÃN DE MEMORIA - Universidad de AlmerÃa
TEMA 3. GESTIÃN DE MEMORIA - Universidad de AlmerÃa
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
Diseño <strong>de</strong> Sistemas Operativos<br />
Tema <strong>3.</strong> Gestión <strong>de</strong> Memoria<br />
size-65536 0 0 65536 0 0 16<br />
[...]<br />
size-64 (DMA) 0 0 64 0 0 1<br />
size-64 183 236 64 4 4 1<br />
size-32 (DMA) 0 0 32 0 0 1<br />
size-32 3104 3164 32 28 28 1<br />
El área <strong>de</strong> memoria principal que contiene un caché se divi<strong>de</strong> en slabs; cada slab consiste en uno o más<br />
marcos <strong>de</strong> página contiguos que contienen objetos libres y asignados como se muestra en la siguiente figura.<br />
Slab<br />
Objetos<br />
Caché<br />
Objetos<br />
Slab<br />
Figura <strong>3.</strong>1<strong>3.</strong> Componentes <strong>de</strong>l Slab allocator<br />
Objetos<br />
El Slab allocator no libera slabs vacíos por si mismo por motivos <strong>de</strong> eficiencia. El Slab allocator se sitúa<br />
también por encima <strong>de</strong>l Buddy system, existiendo una interfaz entre ambos elementos <strong>de</strong>l kernel (Buddy<br />
system y Slab allocator) para facilitar su interacción.<br />
Estructura <strong>de</strong>l <strong>de</strong>scriptor <strong>de</strong> caché ⇒ cada caché se <strong>de</strong>scribe por una tabla <strong>de</strong> tipo struct kmem_cache_s en<br />
. A<strong>de</strong>más, en dicho archivo po<strong>de</strong>mos encontrar las funciones que gestionan al relación entre el<br />
caché y los slabs, como por ejemplo, asignar un slab a un caché (kmem_cache_grow()), liberar un slab <strong>de</strong> un<br />
caché (kmem_cache_<strong>de</strong>stroy(), kmem_free_pages()), etc. Algunos <strong>de</strong> los campos representativos <strong>de</strong>l<br />
<strong>de</strong>scriptor <strong>de</strong> caché son: name (array <strong>de</strong> caracteres que almacena el nombre <strong>de</strong>l caché), slabs_full (lista<br />
circular doblemente enlazada <strong>de</strong> <strong>de</strong>scriptores <strong>de</strong> slabs con objetos ocupados (no libres)), slabs_partial (lista<br />
circular doblemente enlazada <strong>de</strong> <strong>de</strong>scriptores <strong>de</strong> slabs con objetos ocupados y libres), slabs_free (lista circular<br />
doblemente enlazada <strong>de</strong> <strong>de</strong>scriptores <strong>de</strong> slabs con sólo objetos libres), num (número <strong>de</strong> objetos empaquetados<br />
en un slab), next (puntero a la lista doblemente enlazada <strong>de</strong> <strong>de</strong>scriptores <strong>de</strong> caché), flags (conjunto <strong>de</strong> flags<br />
que <strong>de</strong>scriben las propieda<strong>de</strong>s permanentes <strong>de</strong>l caché), dflags (conjunto <strong>de</strong> flags que <strong>de</strong>scriben las<br />
propieda<strong>de</strong>s dinámicas <strong>de</strong>l caché), gfpflags (conjunto <strong>de</strong> flags pasados a la función <strong>de</strong>l Buddy system cuando<br />
se asignan marcos <strong>de</strong> página), etc.<br />
Por lo que respecta a la estructura <strong>de</strong> un <strong>de</strong>scriptor <strong>de</strong> slab ⇒ cada slab <strong>de</strong> un caché tiene su propio<br />
<strong>de</strong>scriptor <strong>de</strong> tipo struct slab_s en . Los <strong>de</strong>scriptores <strong>de</strong> slab se pue<strong>de</strong>n clasificar en una <strong>de</strong> las<br />
siguientes categorías <strong>de</strong>pendiendo en don<strong>de</strong> se almacenen: (1) <strong>de</strong>scriptor <strong>de</strong> slab externo, almacenado fuera<br />
<strong>de</strong>l slab, en uno <strong>de</strong> los cachés generados y no apropiado para DMA (apuntado por cache_sizes; (2) <strong>de</strong>scriptor<br />
<strong>de</strong> slab interno, almacenado <strong>de</strong>ntro <strong>de</strong>l slab al principio <strong>de</strong>l primer marco <strong>de</strong> página asignado al slab. El Slab<br />
allocator escoge la segunda alternativa cuando el tamaño <strong>de</strong> los objetos es menor <strong>de</strong> 512 o cuando la<br />
fragmentación interna <strong>de</strong>ja suficiente espacio para el slab. Los campos mas representativos <strong>de</strong>l <strong>de</strong>scriptor <strong>de</strong><br />
slab son: inuse (número <strong>de</strong> objetos en el slab que están actualmente asignados), s_mem (apunta al primer<br />
objeto <strong>de</strong>ntro <strong>de</strong>l slab), free (apunta al primer objeto libre <strong>de</strong>l slab, list (apunta a una <strong>de</strong> las tres listas<br />
doblemente enlazadas <strong>de</strong> <strong>de</strong>scriptores <strong>de</strong> slab (slabs_full, slabs_partial o slabs_free)).<br />
Departamento <strong>de</strong> Lenguajes y Computación. <strong>Universidad</strong> <strong>de</strong> Almería Página <strong>3.</strong>34