E1 2026-1 (mayo 2026)
Pregunta 1 · Alternativas (cada 2 errores restan 1 pto)
Sección titulada «Pregunta 1 · Alternativas (cada 2 errores restan 1 pto)»Responde aquí y se corrige al instante. Las explicaciones completas están en los temas enlazados.
Pregunta 1
0/6 correctas · 0 respondidasread() sobre un socket sin datos. ¿Qué pasa?pthread_mutex_lock(&m); pid = fork(); y el hijo hace pthread_mutex_lock(&m) (mutex NORMAL). ¿Qué pasa en el hijo?sem_wait(&mutex); sem_wait(&espacios_vacios); … con el buffer lleno. Resultado:stats.contador_hilo1 y stats.contador_hilo2; el rendimiento es pésimo. Causa:lock(&m); hilo B hace unlock(&m) sin tenerlo (mutex NORMAL). POSIX dice:Pregunta 2 (3 pts) · Algoritmo A
Sección titulada «Pregunta 2 (3 pts) · Algoritmo A»1. f[i] ← V2. mientras (turno ≠ i) hacer:3. mientras (f[j]) hacer omitir4. turno ← i5. /* SC */6. f[i] ← F¿Exclusión mutua? ¿Deadlock-free? ¿Starvation-free? Justifica con trazas.
Ver solución
Es el algoritmo de Hyman. Mutex ✘ (traza de 7 pasos: P1 pasa el while interno, se desaloja antes de turno ← 1, P0 entra porque turno = 0, P1 escribe turno = 1 y entra). Deadlock-free ✔. Starvation ✘ (P0 re-entra una y otra vez sin que P1 alcance a ver f[0] = F).
→ Traza completa y reproducible en el intercalador (elige «Algoritmo A» y pulsa Buscar contraejemplo).
Pregunta 3 (5 pts) · Morris simplificado
Sección titulada «Pregunta 3 (5 pts) · Morris simplificado»Semáforos débiles A = 1, M = 0, B = 1; contadores NA y NM. ¿Mantiene la protección contra inanición? Si no, da una traza y la corrección mínima.
Ver solución
Análisis completo en Problemas clásicos → Morris. En resumen: la propuesta es equivalente al algoritmo de Morris (solo mueve NM-- después de la SC y protege NM con B), así que sí mantiene la protección. Allí mismo están las dos modificaciones que sí la romperían, con su traza y su corrección.
Pregunta 4 (6 pts) · pthreads y race de argumentos
Sección titulada «Pregunta 4 (6 pts) · pthreads y race de argumentos»Ver solución
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; // [1]pthread_mutex_lock(&mutex); // [2]pthread_mutex_unlock(&mutex); // [3]pthread_create(&threads[i], NULL, rutina_hilo, (void *) &arg_struct); // [4]pthread_join(threads[i], NULL); // [5]Si el for termina antes de que algún hilo lea: todos leen local_id = 3, local_mult = 30 y el acumulador final es 4 × 30 = 120. Verificado con una ejecución de prueba. Detalle en threads.
Fuente ·for_partial/Evaluaciones_OS_20261 (1).pdf