Particiones, buddy y placement
🎯 Al terminar podrás
- Nombrar los 5 requisitos de la gestión de memoria con un ejemplo de cada uno.
- Clasificar un desperdicio como fragmentación interna o externa y decir qué esquema la produce.
- Aplicar first-fit, best-fit y next-fit a una lista de huecos.
- Simular el buddy system: partir, asignar, liberar y fusionar.
- 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)»| Requisito | Por qué |
|---|---|
| Relocalización | El programador no sabe dónde quedará su programa, y al hacer swap puede volver a otra dirección. |
| Protección | Las 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ón | Permitir que varios procesos usen la misma copia del código sin romper la protección. |
| Organización lógica | Los programas son módulos con distintos permisos (solo lectura, solo ejecución), compilados por separado. |
| Organización física | Jerarquí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á. |
Particionamiento (sin memoria virtual)
Sección titulada «Particionamiento (sin memoria virtual)»Particiones fijas
Sección titulada «Particiones fijas»- 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.
Particiones fijas: detalles
Sección titulada «Particiones fijas: detalles»- 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.
Particiones dinámicas (OS/MVT de IBM)
Sección titulada «Particiones dinámicas (OS/MVT de IBM)»- 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.
Algoritmos de placement
Sección titulada «Algoritmos de placement»| Algoritmo | Elige | Comentario |
|---|---|---|
| Best-fit | el hueco más ajustado | deja astillas diminutas e inútiles; en la práctica suele ser el peor |
| First-fit | el primero desde el inicio que alcance | simple, rápido y generalmente el mejor |
| Next-fit | el primero desde la última asignación | tiende 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.
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
| Pedido | First-fit | Best-fit | Next-fit |
|---|---|---|---|
| 12 | 20 (quedan 8) | 12 (exacto) | 20 (quedan 8) |
| 10 | 10 | 10 | 18: el puntero sigue desde el hueco de 20, donde quedan 8 |
| 9 | 18 | 9 | 9 |
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.
Buddy system
Sección titulada «Buddy system»Es un compromiso entre particiones fijas y dinámicas. Los bloques tienen tamaño con : es el bloque mínimo y es toda la memoria.
- Al inicio hay un único bloque de .
- Para una solicitud con se asigna el bloque completo.
- Si no, se divide en dos buddies de , y así sucesivamente hasta obtener el menor bloque .
- Se mantiene una lista de huecos por cada tamaño .
- Al liberar, si el buddy también está libre, se fusionan en un bloque de , 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.
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»)»- 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.
- 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.
- 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ón | Qué es |
|---|---|
| Lógica | referencia independiente de la ubicación; hay que traducirla |
| Relativa | caso particular de la lógica: el desplazamiento desde un punto conocido (el inicio del programa) |
| Física o absoluta | la 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
.sode 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📈 ¿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