12.10.2014 Views

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

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!