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
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