Shortest-Job-First (SJF)
При рассмотрении алгоритмов FCFS и RR мы видели, насколько существенным для них является порядок расположения процессов в очереди процессов, готовых к исполнению. Если короткие задачи расположены в очереди ближе к ее началу, то общая производительность этих алгоритмов значительно возрастает. Если бы мы знали время следующих CPU burst для процессов, находящихся в состоянии готовность, то могли бы выбрать для исполнения не процесс из начала очереди, а процесс с минимальной длительностью CPU burst. Если же таких процессов два или больше, то для выбора одного из них можно использовать уже известный нам алгоритм FCFS. Квантование времени при этом не применяется. Описанный алгоритм получил название "кратчайшая работа первой" или Shortest Job First (SJF).
SJF-алгоритм краткосрочного планирования может быть как вытесняющим, так и невытесняющим. При невытесняющем SJF-планировании процессор предоставляется избранному процессу на все необходимое ему время, независимо от событий, происходящих в вычислительной системе. При вытесняющем SJF-планировании учитывается появление новых процессов в очереди готовых к исполнению (из числа вновь родившихся или разблокированных) во время работы выбранного процесса. Если CPU burst нового процесса меньше, чем остаток CPU burst у исполняющегося, то исполняющийся процесс вытесняется новым.
Рассмотрим пример работы невытесняющего алгоритма SJF. Пусть в состоянии готовность находятся четыре процесса, p0, p1, p2 и p3, для которых известны времена их очередных CPU burst. Эти времена приведены в таблице 3.4. Как и прежде, будем полагать, что вся деятельность процессов ограничивается использованием только одного промежутка CPU burst, что процессы не совершают операций ввода-вывода и что временем переключения контекста можно пренебречь.
p0 | p1 | p2 | p3 |
5 | 3 | 7 | 1 |
При использовании невытесняющего алгоритма SJF первым для исполнения будет выбран процесс p3, имеющий наименьшее значение продолжительности очередного CPU burst.
После его завершения для исполнения выбирается процесс p1, затем p0 и, наконец, p2. Эта картина отражена в таблице 3.5.
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 |
Г | Г | Г | Г | И | И | И | И | И | |||||||
Г | И | И | И | ||||||||||||
Г | Г | Г | Г | Г | Г | Г | Г | Г | И | И | И | И | И | И | И |
И |
Для рассмотрения примера вытесняющего SJF планирования мы возьмем ряд процессов p0, p1, p2 и p3 с различными временами CPU burst и различными моментами их появления в очереди процессов, готовых к исполнению (см. табл. 3.6.).
0 | 6 |
2 | 2 |
6 | 7 |
0 | 5 |
осталось трудиться всего 1 единицу времени, то процесс p3 остается в состоянии исполнение. После его завершения в момент времени t = 7 в очереди находятся процессы p0 и p2, из которых выбирается процесс p0.
Наконец, последним получит возможность выполняться процесс p2.
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 |
Г | Г | Г | Г | Г | Г | Г | И | И | И | И | И | И | |||||||
И | И | ||||||||||||||||||
Г | Г | Г | Г | Г | Г | Г | И | И | И | И | И | И | И | ||||||
И | И | Г | Г | И | И | И |
![](http://www.intuit.ru/img/symbols/alpha.gif)
Определим рекуррентное соотношение
T(n+1)=
![](http://www.intuit.ru/img/symbols/alpha.gif)
![](http://www.intuit.ru/img/symbols/alpha.gif)
T(0) положим произвольной константой. Первое слагаемое учитывает последнее поведение процесса, тогда как второе слагаемое учитывает его предысторию. При
![](http://www.intuit.ru/img/symbols/alpha.gif)
T(n)= T(n+1)=...=T(0)
т. е. оценивая все CPU burst одинаково, исходя из некоторого начального предположения.
Положив
![](http://www.intuit.ru/img/symbols/alpha.gif)
T(n+1)= ?(n)
Обычно выбирают
![](http://www.intuit.ru/img/symbols/alpha.gif)
![](http://www.intuit.ru/img/symbols/alpha.gif)