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

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

Diseño <strong>de</strong> Sistemas Operativos<br />

Tema <strong>3.</strong> Gestión <strong>de</strong> Memoria<br />

Funcionamiento básico (algoritmo <strong>de</strong>l sistema <strong>de</strong> colegas, Buddy system algorithm): (1) Los marcos <strong>de</strong> página<br />

se agrupan en 10 listas <strong>de</strong> bloques que contienen grupos <strong>de</strong> 1, 2, 4, 8, 16, 32, 64, 128, 256 y 512 marcos <strong>de</strong><br />

página contiguos. (2) La dirección física <strong>de</strong>l primer marco <strong>de</strong> página <strong>de</strong> un grupo es un múltiplo <strong>de</strong>l tamaño<br />

<strong>de</strong>l grupo (por ejemplo, La dirección inicial <strong>de</strong> un grupo <strong>de</strong> 16 páginas es múltiplo <strong>de</strong> 16*2 12 , 2 12 = 4096, que<br />

es tamaño <strong>de</strong> pagina regular). (3) Si se solicita n marcos <strong>de</strong> página <strong>de</strong> memoria contigua, el algoritmo primero<br />

busca en la lista <strong>de</strong> bloques <strong>de</strong> tamaño <strong>de</strong> marcos <strong>de</strong> página n. Si hay algún bloque <strong>de</strong> tamaño n libre, se<br />

asigna. (4) Si la lista está vacía, se busca el siguiente bloque más gran<strong>de</strong> (2*n) en la siguiente lista, y así<br />

sucesivamente hasta un bloque libre. (5) Si el bloque es más gran<strong>de</strong> que el solicitado, se divi<strong>de</strong> en partes y los<br />

bloques sobrantes se insertan en las listas <strong>de</strong> bloques a<strong>de</strong>cuadas. Observar que SIEMPRE se pue<strong>de</strong> hacer<br />

que los bloques resultantes cumplan el requisito <strong>de</strong> alineación. Por ejemplo, si existe una <strong>de</strong>manda en el<br />

sistema <strong>de</strong> un grupo <strong>de</strong> 128 marcos <strong>de</strong> página contiguos y no hay bloques <strong>de</strong> marcos <strong>de</strong> página libres <strong>de</strong> 128<br />

ni <strong>de</strong> 256; sólo 512. Entonces ocupa los 128 <strong>de</strong> los 512 para satisfacer la petición y los restantes 384 los<br />

fragmenta el kernel y los aña<strong>de</strong> en las listas <strong>de</strong> 256 y 128 respectivamente (384 = 256 + 128). (6) Si no se<br />

pue<strong>de</strong> obtener el bloque <strong>de</strong>l tamaño solicitado se <strong>de</strong>vuelve error. (7) En la liberación (que da nombre al<br />

algoritmo), el kernel intenta fusionar pares <strong>de</strong> bloques ‘colegas’ (buddies) <strong>de</strong> tamaño b en un único bloque <strong>de</strong><br />

tamaño 2*b <strong>de</strong> forma iterativa. Dos bloques se consi<strong>de</strong>ran ‘colegas’ si: (7.1) ambos bloques son <strong>de</strong>l mismo<br />

tamaño (b); (7.2) están contiguos en memoria física; (7.3) La dirección física <strong>de</strong>l primer marco <strong>de</strong> página <strong>de</strong>l<br />

primer bloque es múltiplo <strong>de</strong> 2**2 12 .<br />

Ahora vamos a ver las estructuras <strong>de</strong> datos necesarias para soportar el Buddy system. Linux emplea dos<br />

Buddy systems diferentes; para marcos <strong>de</strong> página válidos para DMA y para los que no (gestionar marcos <strong>de</strong><br />

página normales). Trataremos el tema sin distinción. Estructuras <strong>de</strong> datos: (1) El array mem_map <strong>de</strong>scrito<br />

anteriormente; (2) Un array free_area <strong>de</strong> 10 elementos (uno por cada tamaño <strong>de</strong> bloque)<strong>de</strong> tipo<br />

free_area_struct (o equivalentemente free_area_t); el k-ésimo elemento se relaciona con bloques <strong>de</strong> 2 k<br />

marcos <strong>de</strong> página. (3) 10 arrays binarios llamados bitmaps, uno por cada tamaño <strong>de</strong> bloque. Sirve para<br />

controlar los bloques que el Buddy system asigna al grupo; formados con arrays <strong>de</strong> enteros.<br />

La estructura free_area_struct se emplea para gestionar cada grupo <strong>de</strong> bloques <strong>de</strong> un tamaño concreto<br />

struct free_area_struct {<br />

struct page *next;<br />

struct page *prev;<br />

unsigned long map;<br />

unsigned long count;<br />

};<br />

prev y next se emplean para crear una lista circular doble <strong>de</strong> bloques <strong>de</strong>l tamaño requerido, empleando los<br />

campos prev y next <strong>de</strong>l <strong>de</strong>scriptor <strong>de</strong> marco <strong>de</strong> página. count indica el número <strong>de</strong> elementos <strong>de</strong> la lista. map<br />

es un puntero al bitmap <strong>de</strong>l grupo.<br />

El bitmap tiene las siguientes características: (1) El tamaño <strong>de</strong> cada bitmap <strong>de</strong>pen<strong>de</strong> <strong>de</strong>l número total <strong>de</strong><br />

marcos <strong>de</strong> página y <strong>de</strong>l tamaño <strong>de</strong>l bloque. (2) Cada bit <strong>de</strong>l bitmap <strong>de</strong> la k-ésima entrada <strong>de</strong>scribe el estado<br />

<strong>de</strong> dos bloques ‘colegas’ (buddies) <strong>de</strong> tamaño 2 k marcos <strong>de</strong> página: Si es 0 indica que ambos están ocupados<br />

o ambos libres, Si es 1 indica que solo uno <strong>de</strong> los bloques está libre. Cuando ambos ‘colegas’ están libres, el<br />

kernel les trata como un único bloque libre <strong>de</strong> 2k+1. Por ejemplo, si el sistema tiene 128 MBytes <strong>de</strong> RAM, se<br />

pue<strong>de</strong> dividir en 32768 páginas, o 16384 bloques <strong>de</strong> 2 marcos <strong>de</strong> página, u 8192 <strong>de</strong> 4, y así sucesivamente<br />

hasta 64 grupos <strong>de</strong> 512 marcos <strong>de</strong> página. El bitmap <strong>de</strong> páginas simples (free_area[0]) tendrá 16384 bits, el<br />

<strong>de</strong> bloques <strong>de</strong> 2 páginas (free_area[1]) tendrá 8192 bits, y así sucesivamente hasta el último bitmap<br />

(free_area[9]) que consta <strong>de</strong> 32 bits uno por cada par <strong>de</strong> bloques <strong>de</strong> 512 marcos <strong>de</strong> página contiguos.<br />

Cuando se extrae un bloque <strong>de</strong>l Buddy system: (1) Si el tamaño era el solicitado, se saca <strong>de</strong> la lista y se<br />

cambia el bit correspondiente <strong>de</strong>l bitmap (se pondrá a 0). (2) Si el tamaño no era el solicitado, se extrae el<br />

bloque obtenido cambiando el bit correspondiente <strong>de</strong>l bitmap y a continuación los bloques sobrantes se<br />

insertan en las listas correspondientes marcando sus bits en el bitmap (se pondrán a 1).<br />

Departamento <strong>de</strong> Lenguajes y Computación. <strong>Universidad</strong> <strong>de</strong> Almería Página <strong>3.</strong>32

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

Saved successfully!

Ooh no, something went wrong!