Para que SJF funcione siempre se tiene que saber el tiempo de la siguiente ráfaga de CPU de cada programa. En ese ejemplo que ponés el planificador debe saber si el programa se va a bloquear o no (mirando el valor del semáforo) para poder decidir a quien le da la CPU.
De todas formas es importante que quede claro que ese algoritmo no se usa en la práctica dado que es muy difícil saber previamente el tiempo de la ráfaga de CPU de cada proceso (el ejemplo ese muestra una de las posibles dificultades)