Ir al contenido

Scheduling + page replacement (hoja sem. 11)

🎯 Al terminar podrás

  1. Simular FIFO, LRU, OPT y Clock mostrando los frames después de cada referencia.
  2. Construir la secuencia global de referencias a partir del Gantt de RR o de prioridad.
  3. Contar los page faults por proceso y decir qué páginas quedan cargadas.
  4. Explicar por qué el orden de ejecución cambia el número de fallos.

Antes necesitas: Reemplazo: OPT, LRU, FIFO y Clock (teoría y escalera) · Algoritmos de scheduling a mano

  • Simulador predice el estado antes de pulsar el paso siguiente
  • Examen cronométrate y no abras la solución hasta terminar

Ejercicio 1: los cuatro algoritmos con la misma cadena

Sección titulada «Ejercicio 1: los cuatro algoritmos con la misma cadena»

Cadena A B C A D B E A C D B E, con 3 frames inicialmente vacíos.

Reemplazo de páginas paso a paso

Escribe la cadena de referencias, elige cuántos frames hay y el algoritmo. «F» marca un fallo de página; en Clock, el * es el bit de uso y ▸ es la posición del puntero.

refABCADBEACDBE
f0A*A*▸A*▸A*D*D*▸D*DC*▸C*CE*
f1▸·B*B*B*▸B▸B*BA*▸A*AB*▸B*
f2·▸·C*C*CCE*▸E*ED*▸D*D
falloFFFFFFFFFF
Paso 12: Fallo: el puntero apaga el bit de D y encuentra C con uso = 0: la expulsa.
Fallos10
Aciertos2
Tasa de fallos83 %

Fallos según el número de frames

algoritmo1 fr2 fr3 fr4 fr5 fr6 fr7 fr
FIFO
12
12
10
7
5
5
5
OPT
12
9
7
6
5
5
5
LRU
12
12
11
9
5
5
5
Clock
12
12
10
7
5
5
5
Con esta cadena ningún algoritmo empeora al agregar frames.

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

Resuelto: FIFO (10 fallos)

Ref.ABCADBEACDBE
f0AAAADDDDCCCE
f1BBBBBEEEDDD
f2CCCCCAAABB
Fallo✗✗✗✗✗✗✗✗✗✗
SaleABCDEAC

10 fallos. Quedan cargadas E, D, B. FIFO saca siempre la que entró hace más tiempo, aunque se acabe de usar: en el paso 5 sale A, que se había usado en el paso 4.

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

Complétalo: LRU

Las primeras 6 columnas ya están resueltas. Completa las otras 6.

Ref.ABCADBEACDBE
f0AAAAAA??????
f1BBBDD??????
f2CCCB??????
Fallo✗✗✗✗✗
Comparar
Ref.EACDBE
f0EEEDDD
f1DAAABB
f2BBCCCE
SaleADBEAC

11 fallos: solo acierta en la 4.ª referencia. Quedan D, B, E. En la 5.ª (D) sale B, no C: B se usó en la 2.ª y C en la 3.ª, y A se acaba de usar.

Peldaño 3 · Solosin ayuda; luego compara

Solo: OPT y Clock

Haz las dos tablas y escribe los fallos y las páginas finales de cada una. Para Clock, marca con * los bits de uso y escribe dónde queda el puntero.

Comparar: OPT (7 fallos)
Ref.ABCADBEACDBE
f0AAAAAAAACCBB
f1BBBBBEEEEEE
f2CCDDDDDDDD
Fallo✗✗✗✗✗✗✗
SaleCBAC

En la 5.ª referencia (D), lo próximo que viene es B, E, A, C…: C es la que se usa más tarde, así que sale C. Quedan B, E, D.

Comparar: Clock (10 fallos)

El * marca u = 1. «Puntero» es el frame al que apunta después de la referencia.

Ref.f0f1f2FalloPunteroQué pasó
AA*✗f1f0 vacío
BA*B*✗f2f1 vacío
CA*B*C*✗f0f2 vacío; el puntero da la vuelta
AA*B*C*f0acierto: u ya era 1, el puntero no se mueve
DD*BC✗f1apaga A, B y C, vuelve a f0 (ahora u = 0) y saca A
BD*B*Cf1acierto: u de B = 1
ED*BE*✗f0apaga B; f2 tiene C con u = 0 → sale C
ADA*E*✗f2apaga D; f1 tiene B con u = 0 → sale B
CC*A*E✗f1apaga E; f0 tiene D con u = 0 → sale D
DC*AD*✗f0apaga A; f2 tiene E con u = 0 → sale E
BCB*D*✗f2apaga C; f1 tiene A con u = 0 → sale A
EE*B*D✗f1apaga D; f0 tiene C con u = 0 → sale C

10 fallos. Quedan E, B, D: el mismo conjunto que FIFO, pero en otros frames y con otros bits.

Resumen del ejercicio 1 (verificado con un script y con el programa en C de abajo):

AlgoritmoFallosQuedan cargadas
FIFO10E, D, B
LRU11D, B, E
OPT7B, E, D
Clock10E, B, D

Con más frames, FIFO baja 12 → 12 → 10 → 7 → 5 (de 1 a 5 frames) y LRU 12 → 12 → 11 → 9 → 5: en esta cadena no hay anomalía de Belady.

El ejercicio 1 implementado en C (la hoja dice «implemente»)
#include <stdio.h>
#include <string.h>
#define FRAMES 3
char refs[] = "ABCADBEACDBE";
int find(char *fr, char p) {
for (int i = 0; i < FRAMES; i++)
if (fr[i] == p)
return i;
return -1;
}
void show(char r, int hit, char *fr, int *bit) {
printf("%c %s |", r, hit ? "hit " : "FAIL");
for (int i = 0; i < FRAMES; i++) {
if (fr[i] == 0)
printf(" -");
else if (bit)
printf(" %c%s", fr[i], bit[i] ? "*" : " ");
else
printf(" %c", fr[i]);
}
printf("\n");
}
int fifo(void) {
char fr[FRAMES] = {0};
int next = 0, faults = 0, n = strlen(refs);
for (int k = 0; k < n; k++) {
int hit = find(fr, refs[k]) != -1;
if (!hit) {
fr[next] = refs[k];
next = (next + 1) % FRAMES;
faults++;
}
show(refs[k], hit, fr, NULL);
}
return faults;
}
int lru(void) {
char fr[FRAMES] = {0};
int last[FRAMES] = {0}, faults = 0, n = strlen(refs);
for (int k = 0; k < n; k++) {
int j = find(fr, refs[k]);
int hit = j != -1;
if (!hit) {
j = find(fr, 0);
if (j == -1) {
j = 0;
for (int i = 1; i < FRAMES; i++)
if (last[i] < last[j])
j = i;
}
fr[j] = refs[k];
faults++;
}
last[j] = k;
show(refs[k], hit, fr, NULL);
}
return faults;
}
int opt(void) {
char fr[FRAMES] = {0};
int faults = 0, n = strlen(refs);
for (int k = 0; k < n; k++) {
int hit = find(fr, refs[k]) != -1;
if (!hit) {
int j = find(fr, 0);
if (j == -1) {
int far = -1;
for (int i = 0; i < FRAMES; i++) {
int d = n;
for (int m = k + 1; m < n; m++)
if (refs[m] == fr[i]) {
d = m;
break;
}
if (d > far) {
far = d;
j = i;
}
}
}
fr[j] = refs[k];
faults++;
}
show(refs[k], hit, fr, NULL);
}
return faults;
}
int clock_alg(void) {
char fr[FRAMES] = {0};
int use[FRAMES] = {0}, ptr = 0, faults = 0, n = strlen(refs);
for (int k = 0; k < n; k++) {
int j = find(fr, refs[k]);
int hit = j != -1;
if (hit) {
use[j] = 1;
} else {
while (fr[ptr] != 0 && use[ptr] == 1) {
use[ptr] = 0;
ptr = (ptr + 1) % FRAMES;
}
fr[ptr] = refs[k];
use[ptr] = 1;
ptr = (ptr + 1) % FRAMES;
faults++;
}
show(refs[k], hit, fr, use);
}
return faults;
}
int main(void) {
printf("== FIFO\n");
printf("fallos = %d\n\n", fifo());
printf("== LRU\n");
printf("fallos = %d\n\n", lru());
printf("== OPT\n");
printf("fallos = %d\n\n", opt());
printf("== CLOCK (* = bit de uso en 1)\n");
printf("fallos = %d\n", clock_alg());
return 0;
}

Notas de diseño:

  • FIFO no necesita marcas de tiempo: como los frames se llenan en orden y siempre se reemplaza en el siguiente, basta un índice circular next.
  • LRU guarda en last[j] la última referencia de cada frame.
  • Clock reutiliza el mismo puntero para llenar los frames vacíos.

La ejecución de prueba imprime fallos = 10, 11, 7 y 10, con las mismas tablas de arriba.

P1 accede a A, B, A, C y P2 a D, E, D, F, una referencia por unidad de CPU. RR con q = 2, ambos llegan en t = 0 y P1 va primero. Hay 3 frames compartidos y FIFO.

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

Complétalo: primero el Gantt, después la cadena global

El Gantt es P1 0–2 · P2 2–4 · P1 4–6 · P2 6–8. ¿Cuál es la cadena global? Simúlala con FIFO.

Comparar

Cadena global: A B (P1) · D E (P2) · A C (P1) · D F (P2).

Ref.ABDEACDF
ProcesoP1P1P2P2P1P1P2P2
f0AAAEEEDD
f1BBBAAAF
f2DDDCCC
Fallo✗✗✗✗✗✗✗✗
SaleABDEA

8 fallos de 8 referencias: P1 = 4, P2 = 4. Quedan D, F, C. Cada proceso, solo, tendría 3 fallos y 1 acierto (la página que repite). Intercalados, con 3 frames para 6 páginas distintas, cada uno expulsa la página que el otro está por reutilizar: A sale justo antes de que P1 la vuelva a pedir, y D justo antes de que P2 la pida. Es un thrashing en miniatura.

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

Variante: ¿y con q = 4?

Comparar

Con q = 4 cada proceso corre entero: la cadena es A B A C D E D F. FIFO: A ✗, B ✗, A ✓, C ✗, D ✗ (sale A), E ✗ (sale B), D ✓, F ✗ (sale C) → 6 fallos (P1 = 3, P2 = 3). Un quantum más grande mantiene la localidad de cada proceso. Es uno de los costos ocultos de cambiar de proceso muy seguido.

Reemplazo de páginas paso a paso

Escribe la cadena de referencias, elige cuántos frames hay y el algoritmo. «F» marca un fallo de página; en Clock, el * es el bit de uso y ▸ es la posición del puntero.

refABDEACDF
f0AAAEEEDD
f1·BBBAAAF
f2··DDDCCC
falloFFFFFFFF
Paso 8: Fallo: FIFO expulsa la página que lleva más tiempo cargada, A.
Fallos8
Aciertos0
Tasa de fallos100 %

Fallos según el número de frames

algoritmo1 fr2 fr3 fr4 fr5 fr6 fr7 fr
FIFO
8
8
8
6
6
6
6
OPT
8
7
6
6
6
6
6
LRU
8
8
8
6
6
6
6
Clock
8
8
8
6
6
6
6
Con esta cadena ningún algoritmo empeora al agregar frames.

Ejercicio 3: prioridad + LRU, comparado con FCFS

Sección titulada «Ejercicio 3: prioridad + LRU, comparado con FCFS»

Todos llegan en t = 0. Prioridad no expropiativa, número mayor = más prioridad. 3 frames y LRU.

ProcesoPrioridadReferencias
P12A, B, A
P23C, D, C
P31E, A, E

Peldaño 3 · Solosin ayuda; luego compara

Solo: orden, cadena global, fallos y páginas finales, con prioridad y con FCFS

Comparar: con prioridad (5 fallos)

Orden: P2 (3) → P1 (2) → P3 (1). Cadena: C D C · A B A · E A E.

Ref.CDCABAEAE
Proc.P2P2P2P1P1P1P3P3P3
f0CCCCCCEEE
f1DDDBBBBB
f2AAAAAA
Fallo✗✗✗✗✗
SaleDC

5 fallos (P2 = 2, P1 = 2, P3 = 1). Quedan E, B, A. Cuando entra B, el LRU es D (usada en la 2.ª referencia), no C (usada en la 3.ª). Cuando entra E, el LRU es C. P3 tiene un solo fallo porque encuentra A ya cargada por P1.

Comparar: con FCFS P1, P2, P3 (6 fallos)

Cadena: A B A · C D C · E A E.

Ref.ABACDCEAE
f0AAAAAAEEE
f1BBBDDDAA
f2CCCCCC
Fallo✗✗✗✗✗✗
SaleBAD

6 fallos (2 por proceso). Quedan E, A, C.

Comparación: con prioridad, P1 (que usa A) corre justo antes de P3 (que también usa A), así que A sigue cargada. Con FCFS, entre P1 y P3 corre P2, que llena la memoria con C y D y hace que A sea expulsada: P3 falla en A. El orden de ejecución cambia la localidad de la cadena global.

Reemplazo de páginas paso a paso

Escribe la cadena de referencias, elige cuántos frames hay y el algoritmo. «F» marca un fallo de página; en Clock, el * es el bit de uso y ▸ es la posición del puntero.

refCDCABAEAE
f0CCCCCCEEE
f1·DDDBBBBB
f2···AAAAAA
falloFFFFF
Paso 9: E ya está en el frame 0: acierto.
Fallos5
Aciertos4
Tasa de fallos56 %

Fallos según el número de frames

algoritmo1 fr2 fr3 fr4 fr5 fr6 fr7 fr
FIFO
9
6
5
5
5
5
5
OPT
9
5
5
5
5
5
5
LRU
9
5
5
5
5
5
5
Clock
9
6
5
5
5
5
5
Con esta cadena ningún algoritmo empeora al agregar frames.

Autoevaluación

0/5 correctas · 0 respondidas
1. Cadena A B C A D B E A C D B E con 3 frames: ¿cuántos fallos da OPT?
2. En esa misma cadena, ¿quién tiene más fallos?
3. En el ej. 2 (RR q = 2 + FIFO), los fallos totales son…
4. En el ej. 3 con prioridad, ¿en qué orden corren?
5. Al aumentar el quantum en el ej. 2, los fallos…

📈 ¿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 ·sem_11/Sem11-OSL-Ejercicios_Repaso.pdf (Page Replacement, ej. 1–3) · Soluciones propias: verificadas con un script, con el programa en C y con el simulador