← Gestión de Memoria Bloque 3 · Asignación contigua · Tema 12 de 52

Tema 12

Particiones y fragmentación

Cuando la RAM se reparte entre procesos, el espacio se divide en particiones. Si las particiones son fijas, sobra espacio dentro de cada una (fragmentación interna). Si son variables, quedan huecos entre procesos que no se pueden usar (fragmentación externa). En este tema verás los dos modelos, sus ventajas e inconvenientes, y por qué motivaron la paginación.

1. El problema: repartir la RAM

Con los registros base y límite (tema 11) cada proceso ocupa un bloque contiguo de RAM. El sistema debe decidir cómo dividir la RAM entre los procesos. Hay dos enfoques clásicos:

Ambos tienen un costo: el desperdicio de memoria que no se puede usar. Ese desperdicio se llama fragmentación.

2. Particiones fijas

La RAM se divide en n particiones de tamaño fijo (por ejemplo, 4 de 2 MiB en un equipo de 8 MiB). Cada proceso se asigna a una partición libre del tamaño adecuado. Si no hay ninguna libre del tamaño suficiente, el proceso espera.

VentajaInconveniente
Sencillo de implementar.Si el proceso es más pequeño que la partición, sobra espacio (fragmentación interna).
Sin fragmentación externa.Si el proceso es mayor que la partición más grande, no cabe.
Fácil de predecir.El número de procesos simultáneos está limitado por el número de particiones.

3. Fragmentación interna

Es el espacio desperdiciado dentro de una partición asignada. Ocurre cuando el proceso es más pequeño que la partición que ocupa. Ese espacio no lo puede usar ningún otro proceso, porque la partición ya está asignada.

Fragmentación interna es el espacio libre dentro de una partición asignada que no puede ser usado por ningún otro proceso.

Ejemplo: particiones de 2 MiB y un proceso de 1,2 MiB. Sobran 0,8 MiB dentro de la partición. Con 4 procesos pequeños, se desperdician hasta 3,2 MiB.

4. Particiones variables

Las particiones se crean dinámicamente, del tamaño exacto del proceso. Al cargar un proceso se busca un hueco libre suficientemente grande; al terminar, se libera el hueco. Esto elimina la fragmentación interna.

VentajaInconveniente
Sin fragmentación interna: la partición es exactamente del tamaño del proceso.Fragmentación externa: quedan huecos entre procesos.
Más flexible: procesos de cualquier tamaño.Más complejo: hay que elegir qué hueco usar (primer ajuste, mejor ajuste, peor ajuste — tema 13).
Mejor aprovechamiento de la RAM.La compactación puede ser necesaria para unir huecos.

5. Fragmentación externa

Es el espacio libre que queda entre particiones asignadas, en forma de huecos demasiado pequeños para un proceso nuevo. La memoria libre total puede ser suficiente, pero ningún hueco individual lo es.

Fragmentación externa es el espacio libre disperso en huecos que no pueden usarse para satisfacer una petición, aunque la suma sea suficiente.

Ejemplo: RAM de 10 MiB con procesos de 3, 2 y 3 MiB, dejando huecos de 1 y 1 MiB. Un proceso de 2 MiB no cabe, aunque haya 2 MiB libres en total.

6. Comparación: fijas vs variables

AspectoParticiones fijasParticiones variables
Fragmentación internaSí (sobra dentro de la partición)No
Fragmentación externaNoSí (huecos entre procesos)
Flexibilidad de tamañoBaja (limitado por el tamaño de partición)Alta (cualquier tamaño)
ComplejidadBajaMedia (elegir hueco, compactar)
Número de procesosFijoVariable

7. Compactación

La compactación es la solución a la fragmentación externa: se mueven los procesos en memoria para unir los huecos en un solo bloque libre. Requiere:

La compactación es costosa y se evita en los sistemas modernos mediante la paginación, que elimina la necesidad de bloques contiguos.

8. Ejemplo numérico

RAM de 16 MiB. Procesos: A (5 MiB), B (3 MiB), C (4 MiB). Hueco inicial: 4 MiB.

EsquemaUsoDesperdicio
Particiones fijas de 4 MiB (4 particiones)A usa 4 de 5 (no cabe en una de 4 → necesita 2 particiones), B usa 4, C usa 4Fragmentación interna: A desperdicia 3 MiB, B 1 MiB, C 0
Particiones variablesA 5, B 3, C 4 = 12 MiB usados, 4 MiB libreSin fragmentación interna; el hueco de 4 MiB es usable

9. Experimento en C

El programa siguiente simula particiones fijas y variables sobre un mapa de memoria, calculando la fragmentación:

particiones.c
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    const int RAM = 16;          /* MiB */
    int fijas[] = {4, 4, 4, 4};  /* 4 particiones de 4 MiB */
    int proc[] = {5, 3, 4};     /* procesos en MiB */
    int nproc = 3;

    printf("=== Particiones fijas ===\\n");
    int interna = 0;
    for (int i = 0; i < nproc; i++) {
        int p = proc[i];
        int part = (p + 3) / 4 * 4;  /* redondear a múltiplo de 4 */
        if (part > 4) part = 8;       /* A necesita 2 particiones */
        interna += part - p;
        printf("proceso %d MiB -> partición %d MiB (desperdicio %d MiB)\\n", p, part, part - p);
    }
    printf("Fragmentación interna total: %d MiB\\n\\n", interna);

    printf("=== Particiones variables ===\\n");
    int usado = 0;
    for (int i = 0; i < nproc; i++) usado += proc[i];
    printf("Memoria usada: %d MiB, libre: %d MiB\\n", usado, RAM - usado);
    printf("Sin fragmentación interna.\\n");
    return 0;
}
terminal · particiones fijas vs variables
$ gcc -std=c17 -Wall -Wextra -o particiones particiones.c
$ ./particiones
=== Particiones fijas ===
proceso 5 MiB -> partición 8 MiB (desperdicio 3 MiB)
proceso 3 MiB -> partición 4 MiB (desperdicio 1 MiB)
proceso 4 MiB -> partición 4 MiB (desperdicio 0 MiB)
Fragmentación interna total: 4 MiB

=== Particiones variables ===
Memoria usada: 12 MiB, libre: 4 MiB
Sin fragmentación interna.

10. Probar con un simulador

Este simulador muestra un mapa de memoria con procesos asignados y huecos libres. Puedes elegir entre particiones fijas y variables, y ver la fragmentación resultante.

Simulador · particiones y fragmentación

MedidaValor
Memoria total16 MiB
Memoria usada
Fragmentación interna
Fragmentación externa (huecos)
Procesos que no caben

11. En Linux hoy

Linux no usa particiones fijas ni variables en el sentido clásico: usa paginación (tema 18), que elimina tanto la fragmentación interna (salvo el último bloque de cada proceso) como la externa (los marcos se asignan de a uno). Pero el concepto de fragmentación sigue presente:

12. Resumen

13. Preguntas de repaso

Intenta responder cada una antes de abrir la respuesta.

1. ¿Qué es la fragmentación interna?

El espacio libre dentro de una partición asignada que no puede ser usado por ningún otro proceso.

2. ¿Qué es la fragmentación externa?

El espacio libre disperso en huecos entre particiones asignadas que no pueden usarse para un proceso nuevo.

3. ¿Qué tipo de fragmentación tienen las particiones fijas?

Fragmentación interna (y ninguna externa, porque los huecos son particiones completas).

4. ¿Qué tipo de fragmentación tienen las particiones variables?

Fragmentación externa (y ninguna interna, porque la partición es exactamente del tamaño del proceso).

5. ¿Qué es la compactación?

Mover los procesos en memoria para unir los huecos libres en un solo bloque contiguo.

6. ¿Por qué la compactación requiere reubicación dinámica?

Porque los procesos se mueven a nuevas direcciones físicas; hay que actualizar sus registros base.

7. ¿Cómo elimina la paginación la fragmentación externa?

Porque los marcos de página se asignan de a uno, sin necesidad de bloques contiguos.

8. ¿Qué fragmentación queda con paginación?

Solo fragmentación interna en el último bloque de cada proceso (hasta una página).

Para practicar

  1. Modifica particiones.c para simular 5 procesos de tamaños aleatorios y calcular la fragmentación en ambos esquemas.
  2. Implementa la compactación: dado un mapa con huecos, mueve los procesos para unir los huecos.
  3. Calcula la fragmentación interna para particiones de 2, 4 y 8 MiB con los procesos del ejemplo.
  4. Explica por qué un proceso de 5 MiB no cabe en particiones fijas de 4 MiB aunque haya 8 MiB libres.
  5. Investiga cómo gestiona Linux la memoria física (buddy allocator) y qué fragmentación produce.
  6. Compara la fragmentación interna de las particiones fijas con la del último bloque de un proceso paginado.
  7. Dibuja un mapa de memoria con 3 procesos y huecos, y calcula si un proceso nuevo de 2 MiB cabe.