Ir al contenido

Particiones, buddy y placement

🎯 Al terminar podrás

  1. Nombrar los 5 requisitos de la gestión de memoria con un ejemplo de cada uno.
  2. Clasificar un desperdicio como fragmentación interna o externa y decir qué esquema la produce.
  3. Aplicar first-fit, best-fit y next-fit a una lista de huecos.
  4. Simular el buddy system: partir, asignar, liberar y fusionar.
  5. Explicar cómo base y límite resuelven a la vez la relocalización y la protección.
  • Visual mira el diagrama o la tabla y explica qué cambia en cada paso
  • Simulador predice el estado antes de pulsar el paso siguiente
  • Laboratorio sube la escalera: resuelto → completa → solo → variante

Requisitos de la gestión de memoria (Stallings cap. 7)

Sección titulada «Requisitos de la gestión de memoria (Stallings cap. 7)»
RequisitoPor qué
RelocalizaciónEl programador no sabe dónde quedará su programa, y al hacer swap puede volver a otra dirección.
ProtecciónLas referencias a memoria deben revisarse en tiempo de ejecución, porque la ubicación es impredecible. Los mecanismos de relocalización también dan protección.
ComparticiónPermitir que varios procesos usen la misma copia del código sin romper la protección.
Organización lógicaLos programas son módulos con distintos permisos (solo lectura, solo ejecución), compilados por separado.
Organización físicaJerarquía de dos niveles (principal y secundaria). El SO debe mover los datos porque el overlaying es costoso de programar y el programador no sabe cuánta memoria habrá.
  • De igual tamaño: da igual cuál usar. Si todas están ocupadas por procesos no listos, se hace swap out.
  • De distinto tamaño: se asigna la partición más pequeña que alcance, con una cola por partición o una cola única.
  • ✘ El número de particiones limita el grado de multiprogramación. ✘ Los trabajos pequeños desperdician espacio: fragmentación interna. ✘ Un programa demasiado grande necesita overlays.
  • Por ejemplo, 64 MB con 8 MB para el SO y 7 particiones de 8 MB (iguales), o particiones de 2, 4, 6, 8, 8, 12 y 16 MB (desiguales).
  • Una cola por partición: cada proceso va a la partición más chica en que cabe. Es óptimo para esa partición, pero la de 16 MB puede quedar vacía mientras procesos chicos esperan en otra cola.
  • Una cola única: se usa la partición libre más chica que alcance. Aprovecha mejor el sistema.
  • IBM OS/MFT (Multiprogramming with a Fixed number of Tasks). Hoy está prácticamente en desuso.
  • Cada proceso recibe exactamente lo que pide.
  • Con el tiempo aparecen huecos pequeños entre procesos: fragmentación externa.
  • Paso a paso (fig. 7.4), con 56 MB libres: entra P1 (20 MB) y quedan 36; entra P2 (14) y quedan 22; entra P3 (18) y queda un hueco de 4. Todos quedan bloqueados, así que se hace swap out de P2 (se liberan 14). Entra P4 (8) y queda un hueco de 6. La memoria termina salpicada de huecos inútiles (4 MB, 6 MB): fragmentación externa.
  • Algoritmo de reemplazo: si todos los procesos en memoria están bloqueados y no hay espacio ni compactando, ¿a quién se saca? El tema continúa en memoria virtual.
  • Compactación: mover los procesos para juntar el espacio libre. Solo es posible con relocalización dinámica (en tiempo de ejecución) y cuesta CPU. Durante la E/S hay que fijar el proceso en memoria o hacer E/S solo a buffers del SO.
AlgoritmoEligeComentario
Best-fitel hueco más ajustadodeja astillas diminutas e inútiles; en la práctica suele ser el peor
First-fitel primero desde el inicio que alcancesimple, rápido y generalmente el mejor
Next-fitel primero desde la última asignacióntiende a romper el bloque grande del final

Regla del 50 % (análisis de first-fit): con N bloques asignados se pierden ≈ 0.5 N por fragmentación, es decir, un tercio de la memoria puede quedar inutilizable.

Algoritmos de placement (particiones dinámicas)

Cada marcador muestra el hueco que elegiría cada algoritmo. Asigna varias veces y mira cómo crece la fragmentación externa. Haz clic en un proceso para liberarlo; los huecos adyacentes se combinan.

OS8
8
P16
12
P24
22
P32
18
P44
8
P56
6
P64
14
P710
36
First-fitBest-fitNext-fitWorst-fit
Memoria libre total124 MB
Hueco más grande36 MB
Huecos8

Peldaño 1 · Resueltolee cada paso y su porqué

Resuelto: huecos de 5, 12 y 8 MB; llega un proceso de 7 MB

Es el ejemplo del recuadro «En simple» de arriba. First-fit usa el de 12 y deja 5. Best-fit usa el de 8 y deja una astilla de 1. Next-fit depende de dónde quedó el puntero.

Peldaño 3 · Solosin ayuda; luego compara

Solo: huecos (en orden) de 10, 4, 20, 18, 7, 9, 12 y 15 KB; llegan, en orden, pedidos de 12, 10 y 9 KB

¿Dónde va cada pedido con first-fit, best-fit y next-fit? (Next-fit empieza al inicio de la memoria.)

Comparar
PedidoFirst-fitBest-fitNext-fit
1220 (quedan 8)12 (exacto)20 (quedan 8)
10101018: el puntero sigue desde el hueco de 20, donde quedan 8
91899

Best-fit da tres ajustes exactos y next-fit «se come» los huecos grandes del medio. Es la tabla clásica de Silberschatz: con otra secuencia de pedidos, el ranking puede cambiar.

Es un compromiso entre particiones fijas y dinámicas. Los bloques tienen tamaño 2K2^K con L≤K≤UL \le K \le U: 2L2^L es el bloque mínimo y 2U2^U es toda la memoria.

  1. Al inicio hay un único bloque de 2U2^U.
  2. Para una solicitud ss con 2U−1<s≤2U2^{U-1} < s \le 2^U se asigna el bloque completo.
  3. Si no, se divide en dos buddies de 2U−12^{U-1}, y así sucesivamente hasta obtener el menor bloque ≥s\ge s.
  4. Se mantiene una lista de huecos por cada tamaño 2i2^i.
  5. Al liberar, si el buddy también está libre, se fusionan en un bloque de 2i+12^{i+1}, y eso se repite hacia arriba.

En el árbol binario, si dos buddies son hojas, al menos uno está asignado; si no, ya se habrían fusionado. Linux usa buddy para asignar páginas físicas (__get_free_pages).

Buddy system (1 MiB)

Bloques de tamaño 2k. Pedir: redondear a potencia de 2 y dividir a la mitad hasta ajustar. Liberar: fusionar con el buddy mientras esté libre. Empieza con la secuencia de la diapositiva 19.

1024K
Asignado0K
Frag. interna0K
Bloques libres1024K

Peldaño 2 · Complétalofaltan pasos clave: llénalos tú

Complétalo: el ejemplo de Stallings (fig. 7.6) con 1 MB

Ya se asignaron A = 100K (recibe un bloque de 128K en 0) y B = 240K (recibe 256K en 256K). Quedan libres 128K en 128K y 512K en 512K. Completa: ¿dónde van C = 64K y D = 256K?

Comparar
  • C = 64K: el menor bloque libre que alcanza es el de 128K en 128K. Se parte en dos de 64K: C va en 128K y queda libre el de 64K en 192K.
  • D = 256K: el único bloque que alcanza es el de 512K. Se parte en dos: D va en 512K y queda libre el de 256K en 768K.
  • Mapa: A 128 | C 64 | libre 64 | B 256 | D 256 | libre 256.

Peldaño 3 · Solosin ayuda; luego compara

Solo: sigue el mismo ejemplo. Libera B, libera A y pide E = 75K

Comparar
  • Libera B (256K en 256K): su buddy es el bloque de 256K en 0, que no está libre (tiene A y C), así que no se fusiona.
  • Libera A (128K en 0): su buddy es el de 128K en 128K, que está partido (C está ahí), así que no se fusiona.
  • E = 75K necesita 128K: usa el de 0.
  • Mapa: E 128 | C 64 | libre 64 | libre 256 | D 256 | libre 256. Es el mismo que en la fig. 7.6.

Peldaño 4 · Variantecambia una condición: ¿sigue valiendo lo anterior?

Variante: ahora libera C, después E y después D. ¿Cuántas fusiones hay en cada paso?

Comparar
  • C: se fusiona con su buddy de 64K en 192K y forma 128K en 128K. Su buddy (E, en 0) está ocupado: 1 fusión.
  • E: con 128K en 128K forma 256K en 0, y con el 256K libre en 256K forma 512K en 0: 2 fusiones.
  • D: con 256K en 768K forma 512K en 512K, y con 512K en 0 vuelve a ser 1 MB: 2 fusiones.

Para encontrar el buddy de un bloque se calcula inicio XOR tamaño. Por ejemplo, 512K XOR 512K = 0.

Relocalización (diapositiva «Important about relocation»)

Sección titulada «Relocalización (diapositiva «Important about relocation»)»
  1. Particiones fijas con una cola por partición: el proceso vuelve siempre a la misma partición, así que basta un cargador relocalizador simple que reemplaza las referencias relativas por absolutas al cargar.
  2. Particiones iguales, o desiguales con cola única, y particiones dinámicas: un proceso puede volver a otra partición tras un swap, así que las direcciones no pueden fijarse al cargar.
  3. Con compactación, los procesos se mueven mientras están en memoria, así que las referencias cambian cada vez.

En los casos 2 y 3 hace falta traducir en tiempo de ejecución:

Tipo de direcciónQué es
Lógicareferencia independiente de la ubicación; hay que traducirla
Relativacaso particular de la lógica: el desplazamiento desde un punto conocido (el inicio del programa)
Física o absolutala ubicación real en la RAM

Hardware (fig. 7.8): al pasar a Running se cargan los registros base y límite (bounds). Cada dirección relativa se suma a la base y la dirección absoluta se compara con el límite; si se pasa, hay una interrupción al SO. Esto resuelve relocalización (mover un proceso es solo cambiar la base) y protección a la vez, con el costo mínimo de hacerlo en hardware.

De programa a proceso: carga y enlace (apéndice 7A)

Sección titulada «De programa a proceso: carga y enlace (apéndice 7A)»

Carga (loading):

  • Absoluta: siempre en la misma dirección, y las direcciones se resuelven al compilar. No se puede mover.
  • Relocalizable: las direcciones son relativas al inicio del módulo; el cargador suma la base x usando un diccionario de relocalización que dice qué referencias ajustar. Ejemplo: «saltar a 1424» cargado en 1024 se convierte en 2448.
  • Dinámica en ejecución: la dirección absoluta se calcula al ejecutar cada instrucción (con base y límite). Permite mover y hacer swap del proceso libremente.

Enlace (linking): el linker une módulos objeto en un módulo de carga, resolviendo las referencias externas. Si A mide L y hace CALL B, eso se convierte en JSR "L"; si B hace CALL C, en JSR "L+M".

  • Linkage editor: produce un módulo de carga relocalizable completo.
  • Enlace dinámico en la carga (load-time): las referencias a bibliotecas se resuelven al cargar.
  • Enlace dinámico en ejecución (run-time): se resuelve cuando se ejecuta la llamada, y los módulos se comparten entre procesos (las DLL de Windows y las .so de Linux).
    • ✔ Se puede actualizar una biblioteca sin reenlazar las aplicaciones, se comparte código automáticamente y terceros pueden extender el sistema.
    • ✘ DLL hell: dos aplicaciones necesitan versiones distintas de la misma DLL.
    • Junto con la segmentación, permite no reservar memoria para módulos que nunca se usan en una ejecución (por ejemplo, en un sistema de reservas).

Autoevaluación

0/5 correctas · 0 respondidas
1. Buddy system con 1 MiB. Se pide 100 KiB. ¿Qué bloque se asigna y cuánta fragmentación interna genera?
2. Hay 30 MB libres en huecos de 10 MB y llega un proceso de 25 MB que no cabe. Eso es…
3. ¿Qué algoritmo de placement tiende a dejar huecos diminutos inutilizables?
4. La compactación requiere…
5. En buddy, el buddy del bloque de 64K que empieza en 128K es…

📈 ¿Qué tan bien lo dominas?

Elige pensando en lo que hiciste, no en lo que leíste. Para marcar 3 tienes que haber resuelto un ejercicio nuevo sin pistas y haberlo justificado. Si solo lo leíste y sientes que «ya entendí», todavía es un 1.

Fuente ·for_partial/pending_themes/Sem06_06-OST-Memory.pdf (diap. 4–23) · sem_6/resumen-capitulo-7-memory-management.md · Stallings cap. 7