Buenas, era para comunicar que hablando con otros estudiantes y repensando algunas cosas descubrí algunos errores conceptuales en mi razonamiento. Igualmente voy a dejar el mensaje en el foro por si algún otro estudiante tenía las mismas dudas que yo. Mis errores fueron:
1) El CPU burst no se calcula como el tiempo de ejecución de la siguiente instrucción del proceso sino como el tiempo de ejecución de la siguiente ráfaga de ejecución (esto es, todas instrucciones del proceso que consuman CPU seguidas. En otras palabras, todas las instrucciones del tipo "Ejecutar X ms" antes de llegar al final del proceso, o a un bloqueo).
2) Cuando un proceso se bloquea, aunque la invocación al scheduler no sea expropiativa, se puede reasignar el recurso procesador a otro proceso distinto. No hace falta que sea expropiativo para hacer eso porque al bloquearse, el proceso libera voluntariamente la CPU.
3) El SJF solamente es óptimo en tiempo de espera cuando es expropiativo, o cuando todos los procesos llegan a la vez después de cada CPU burst. En el ejemplo que di en mi mensaje original;
Los CPU burst se calcularían contando el tiempo de ejecución de cada ráfaga (1001 ms para el proceso 1, y 3 ms para el proceso 2). Pero si altero el ejemplo original de la siguiente manera;
En ese caso, si entendí bien los nuevos conceptos lo que pasaría sería algo así;
Y el Proceso 2 estaría en la Ready Queue durante 1000 ms, por lo que sería subóptimo en tiempo de espera. Esto sucede porque si bien la primera ráfaga de ejecución de ambos procesos llega a la vez, la segunda ráfaga de ejecución del proceso 1 llega antes que la del proceso 2, entonces el SJF no expropiativo no resulta óptimo. Si fuese expropiativo sería óptimo porque el t = 9 se le expropiaría el procesador al primer proceso, al que le quedan 998 milisegundos de ejecución, y se lo daría al segundo proceso, al que le queda 1ms de ejecución.