Buenas, me surgió una duda a raíz de la solución del ejercicio 2, parte a.
En el problema se usan a nivel de usuario 3 hilos con el criterio SJF. Inicialmente pensé que el SJF asignaba procesos en función del tiempo de ejecución restante del programa (el programa que fuera a terminar primero era el próximo en asignarse), pero a juzgar por la solución, parece ser que el SJF únicamente se fija en el tiempo de ejecución del próximo CPU burst, no del tiempo total de ejecución.
Me fijé en las diapositivas del curso, y parece ser que sí, solamente ordena por CPU burst, no por todo el tiempo de ejecución restante del programa (aunque por cierto, los ejemplos son un poco engañosos porque solamente se muestran procesos con una única instrucción de ejecución, por lo que el tiempo del próximo CPU burst es el mismo que el tiempo total de ejecución, dejando sin resolver la ambigüedad que planteé).
El punto es que, mientras estaba intentando entender cómo funciona el SJF desde esta confusión, me surgió una duda que no me supe responder. Partiendo de la base de que el SJF expropiativo y el SJF no expropiativo solamente diferen en una cosa, y es que el expropiativo es capaz de indicar al Scheduler que reasigne la CPU a un nuevo proceso si detecta que terminará de ejecutar antes, mientras que el no expropiativo una vez que asignó el procesador a un proceso debe esperar a que el proceso termine para poder asignar el recurso procesador a otro proceso, imaginemos que tenemos los siguientes procesos en un sistema multiprogramado monoprocesador con un SJF no expropiativo a nivel Kernel:
(en el ejemplo, asumir que ambos procesos llegan a la vez, en t=0)
Si el SJF se fijara en el tiempo total de ejecución, entonces vería que el proceso 1 tiene un tiempo de ejecución de 1001 ms, mientras que el Proceso 2 tiene un tiempo de ejecución de 3 ms, y le asignaría primero el procesador al proceso 2, y después de que el proceso ya haya terminado, le asignaría el procesador al proceso 1.
Pero, según lo que entendí, el SJF se fija solamente en el tiempo del próximo CPU burst, entonces, siguiendo el ejemplo, vería que el próximo CPU burst demora 1 ms para el Proceso 1, y 2ms para el proceso 2, entonces le asignaría el procesador al Proceso 1, porque es el que tiene el próximo CPU burst más corto. Pero entonces, se procesaría primero el Proceso 1 (de 1001 ms), y después el Proceso 2 (de 3 ms). Esto hace que el tiempo de espera sea subóptimo, porque el Proceso 2 estuvo 1001 ms en la Ready Queue ... y se supone que el SJF es óptimo en tiempo de espera (notar que el una vez asignado el Proceso 1, no puede asignarse el 2 hasta que el 1 termine porque en el ejemplo el SJF es no expropiativo).
Gracias por leer mi duda, tal vez hay algún concepto que estoy entendiendo mal, en cuyo caso agradezco correcciones.