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 />
menos uno <strong>de</strong> ellos está signado; en otro caso, se liberaría para que quedara sólo el nodo padre <strong>de</strong> ambos<br />
(unirían en un bloque mayor).<br />
<strong>3.</strong><strong>3.</strong><strong>3.</strong>2. Buddy System retardado<br />
Esta técnica es la que adopta SVR4. Los autores observan que UNIX exhibe, a menudo, un comportamiento<br />
estable en la <strong>de</strong>manda <strong>de</strong> memoria <strong>de</strong>l kernel, es <strong>de</strong>cir, la cantidad <strong>de</strong> <strong>de</strong>mandas para bloques <strong>de</strong> un tamaño<br />
<strong>de</strong>terminado varían lentamente en el tiempo. De esta forma, si se libera un bloque <strong>de</strong> tamaño 2 i e<br />
inmediatamente se une con su colega (buddy) en un bloque <strong>de</strong> tamaño 2 i + 1 , el kernel pue<strong>de</strong>, a continuación,<br />
hacer una solicitud <strong>de</strong> un bloque <strong>de</strong> tamaño 2 i que necesariamente divi<strong>de</strong> <strong>de</strong> nuevo el bloque mayor. Para<br />
evitar estas uniones y divisiones innecesarias, el Buddy System retardado difiere la unión hasta que parezca<br />
que sea necesaria, y entonces se une tantos bloques como sea posible.<br />
El Buddy System retardado utiliza los siguientes parámetros: (1) N i = número actual <strong>de</strong> bloques <strong>de</strong> tamaño 2 i ;<br />
(2) A i = número actual <strong>de</strong> bloques <strong>de</strong> tamaño 2 i que están asignados (ocupados); (3) G i = número <strong>de</strong> bloques<br />
<strong>de</strong> tamaño 2 i que están libres globalmente; estos son bloques elegibles para la unión; si el colega (buddy) <strong>de</strong><br />
un bloque <strong>de</strong> este tipo se convierte en un bloque libre globalmente, entonces los dos bloques se unirán en un<br />
bloque libre globalmente <strong>de</strong> tamaño 2 i + 1 . Todos los bloques libres (huecos) en el Buddy System estándar se<br />
podrían consi<strong>de</strong>rar libre globalmente; (4) L i = número actual <strong>de</strong> bloques <strong>de</strong> tamaño 2 i que están libres<br />
localmente; estos bloques no son elegibles para la unión. Aunque, el colega <strong>de</strong> estos bloques se convierta en<br />
libre, los dos bloques no se unen. Más bien, los bloques libres localmente quedan retenidos como anticipación<br />
<strong>de</strong> futuras <strong>de</strong>mandas <strong>de</strong> un bloque <strong>de</strong> ese tamaño. Se cumple la siguiente relación: N i = A i + G i + L i .<br />
En general, el Buddy System retardado trata <strong>de</strong> mantener una reserva <strong>de</strong> bloques libres localmente y<br />
solamente invoca uniones si el número <strong>de</strong> bloques libres localmente exce<strong>de</strong> un umbral. Si hay <strong>de</strong>masiados<br />
bloques libres en el siguiente nivel para satisfacer las <strong>de</strong>mandas. La mayor parte <strong>de</strong>l tiempo, mientras los<br />
bloques estén libres, no se produce la unión, para que la sobrecarga <strong>de</strong> operaciones y contabilidad se<br />
minimicen. Cuando un bloque va a ser asignado, no se distingue si se hace <strong>de</strong> entre los bloques libres local o<br />
globalmente, también esto minimiza la contabilidad. El criterio utilizado para la unión es que el número <strong>de</strong><br />
bloques libres localmente <strong>de</strong> un tamaño dado no excedan <strong>de</strong>l número <strong>de</strong> bloques asignados <strong>de</strong> este tamaño (es<br />
<strong>de</strong>cir, <strong>de</strong>be ser L i ≤ A i ). Esta es una guía razonable para restringir el crecimiento <strong>de</strong> los bloques libres<br />
localmente, confirmándose que este esquema genera un notable ahorro. Para implementar este esquema, se<br />
<strong>de</strong>fine un retraso variable según la siguiente ecuación: D i = A i – L i = N i – 2 L i – G i . A continuación se<br />
muestra el algoritmo,<br />
D i = 0; // Después <strong>de</strong> una operación el valor <strong>de</strong> D i se actualiza como sigue:<br />
if (siguiente operación es una solicitud <strong>de</strong> asignación <strong>de</strong> bloque)<br />
{<br />
if (existe algún bloque libre)<br />
{<br />
Seleccionar uno para asignarlo;<br />
if (bloque seleccionado está localmente libre)<br />
D i = D i + 2;<br />
else<br />
D i = D i + 1;<br />
}<br />
else<br />
{<br />
Conseguir dos bloques dividiendo en dos uno más gran<strong>de</strong> (operación recursiva);<br />
Asignar uno y marcar el otro libre localmente;<br />
// D i no cambia, aunque pue<strong>de</strong> cambiar a otros tamaños <strong>de</strong> bloque por la llamada<br />
recursiva<br />
}<br />
}<br />
Departamento <strong>de</strong> Lenguajes y Computación. <strong>Universidad</strong> <strong>de</strong> Almería Página <strong>3.</strong>18