Превантивната версия на планирането за най-кратко задание (SJF) се нарича първо най-кратко оставащо време (SRTF). В SRTF процесът с най-малко оставащо време за завършване е избран за изпълнение. Текущият процес продължава, докато завърши или пристигне нов процес с по-кратко оставащо време, като се гарантира, че най-бързият завършващ процес винаги има приоритет.
Пример за SJF алгоритъм:
Сценарий 1: Процеси с едно и също време на пристигане
Пример: Разгледайте следната таблица на времето на пристигане и времето на пакет за три процеса P1 P2 и P3 .
| Процес | Време за спукване | Време на пристигане |
|---|---|---|
| P1 | 6 мс | 0 ms |
| P2 | 8 мс | 0 ms |
| P3 | 5 мс | 0 ms |
Изпълнение стъпка по стъпка:
- Време 0-5 (P3) : P3 работи за 5 ms (общо оставащо време: 0 ms), тъй като има най-краткото оставащо време.
- Време 5-11 (P1) : P1 работи 6 ms (общо оставащо време: 0 ms), тъй като има най-краткото оставащо време.
- Време 11-19 (P2) : P2 работи за 8 ms (общо оставащо време: 0 ms), тъй като има най-краткото оставащо време.
Диаграма на Гант:
cpp е равно на
Сега нека изчислим средната стойност изчакайте и се обърнете време:
Както знаем
- Време за обръщане = Час на завършване - час на пристигане
- Време на изчакване = Време за обръщане - време за избухване
| Процес | Време на пристигане parseint java (AT) | Време за спукване (BT) | Време за завършване (CT) | Време за обръщане (TAT) | Време на изчакване (WT) |
|---|---|---|---|---|---|
| P1 | 6 | 11 | 11-0 = 11 | 11-6 = 5 | |
| P2 | 8 | 19 | 19-0 = 19 | 19-8 = 11 | |
| P3 | великденски яйца в android | 5 | 5 | 5-0 = 5 | 5-5 = 0 |
Сега
- Средно време за обръщане = (11 + 19 + 5)/3 = 11,6 ms
- Средно време на изчакване = (5 + 0 + 11 )/3 = 16/3 = 5,33 ms
Сценарий 2: Процеси с различно време на пристигане
Разгледайте следната таблица на времето на пристигане и времето на пакет за три процеса P1 P2 и P3.
| Процес | Време за спукване | Време на пристигане |
|---|---|---|
| P1 | 6 мс | 0 ms |
| P2 | 3 мс | 1 мс |
| P3 | 7 мс | 2 мс |
Изпълнение стъпка по стъпка:
- Време 0-1 (P1) : P1 работи за 1 ms (общо оставащо време: 5 ms), тъй като има най-краткото оставащо време.
- Време 1-4 (P2) : P2 работи за 3 ms (общо оставащо време: 0 ms), тъй като има най-краткото оставащо време сред P1 и P2.
- Време 4-9 (P1) : P1 работи за 5 ms (общо оставащо време: 0 ms), тъй като има най-краткото оставащо време сред P1 и P3.
- Време 9-16 (P3) : P3 работи 7 ms (общо оставащо време: 0 ms), тъй като има най-краткото оставащо време.
Диаграма на Гант:
Сега нека изчислим средната стойност изчакайте и се обърнете време:
пример за java карта
| Процес | Час на пристигане (AT) | Време на избухване (BT) | Време за завършване (CT) | Време за обръщане (TAT) | Време на изчакване (WT) |
|---|---|---|---|---|---|
| P1 | 6 | 9 | 9-0 = 9 | 9-6 = 3 | |
| P2 | 1 | 3 | 4 | 4-1 = 3 | 3-3 = 0 |
| P3 | 2 опитайте catch catch java | 7 | 16 | 16-2 = 14 | 14-7 = 7 |
- Средно време за обръщане = (9 + 14 + 3)/3 = 8,6 ms
- Средно време на изчакване = (3 + 0 + 7 )/3 = 10/3 = 3,33 ms
Внедряване на SRTF алгоритъм
Стъпка 1: Въведете брой процеси с време на пристигане и време на избухване.
Стъпка 2: Инициализиране на оставащите времена (времена на избухване) текущо време = 0 и броячи.
Стъпка 3: Във всяка единица време добавете процеси, които са пристигнали в готовата опашка.
Стъпка 4: Изберете процеса с най-кратко оставащо време (изключете, ако пристигне по-кратък).
Стъпка 5: Изпълнете избрания процес за 1 единица, намалете оставащото време и увеличете текущото време.
Стъпка 6: Ако процесът завърши:
- Време за изпълнение = Време за завършване − Време на пристигане
- Време на изчакване = време за изпълнение − време на спукване
Стъпка 7: Повторете стъпки 3–6, докато всички процеси завършат.
Стъпка 8: Изчислете средното време на изчакване и времето за изпълнение.
Стъпка 9: Показване на времето за изчакване и изпълнение на завършване за всеки процес заедно със средните стойности.
Внедряване на код
Програмата за прилагане на първо най-краткото оставащо време е следната:
C++#include #include #include using namespace std; struct Process { int id arrivalTime burstTime remainingTime waitingTime turnaroundTime completionTime; }; int main() { int n currentTime = 0 completed = 0; cout << 'Enter number of processes: '; cin >> n; vector<Process> p(n); for (int i = 0; i < n; i++) { p[i].id = i + 1; cin >> p[i].arrivalTime >> p[i].burstTime; p[i].remainingTime = p[i].burstTime; } while (completed < n) { int idx = -1; for (int i = 0; i < n; i++) { if (p[i].arrivalTime <= currentTime && p[i].remainingTime > 0 && (idx == -1 || p[i].remainingTime < p[idx].remainingTime)) { idx = i; } } if (idx != -1) { p[idx].remainingTime--; currentTime++; if (p[idx].remainingTime == 0) { p[idx].completionTime = currentTime; p[idx].turnaroundTime = currentTime - p[idx].arrivalTime; p[idx].waitingTime = p[idx].turnaroundTime - p[idx].burstTime; completed++; } } else { currentTime++; } } double totalWT = 0 totalTAT = 0; for (auto &proc : p) { totalWT += proc.waitingTime; totalTAT += proc.turnaroundTime; cout << 'P' << proc.id << ' CT: ' << proc.completionTime << ' WT: ' << proc.waitingTime << ' TAT: ' << proc.turnaroundTime << endl; } cout << 'Avg WT: ' << totalWT / n << ' Avg TAT: ' << totalTAT / n << endl; }
Java import java.util.*; class Process { int id arrivalTime burstTime remainingTime waitingTime turnaroundTime completionTime; public Process(int id int arrivalTime int burstTime) { this.id = id; this.arrivalTime = arrivalTime; this.burstTime = burstTime; this.remainingTime = burstTime; } } public class SRTF { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); Process[] processes = new Process[n]; for (int i = 0; i < n; i++) { int arrivalTime = sc.nextInt() burstTime = sc.nextInt(); processes[i] = new Process(i + 1 arrivalTime burstTime); } Arrays.sort(processes Comparator.comparingInt(p -> p.arrivalTime)); int currentTime = 0 completed = 0; while (completed < n) { int idx = -1; for (int i = 0; i < n; i++) { if (processes[i].arrivalTime <= currentTime && processes[i].remainingTime > 0 && (idx == -1 || processes[i].remainingTime < processes[idx].remainingTime)) { idx = i; } } if (idx != -1) { processes[idx].remainingTime--; currentTime++; if (processes[idx].remainingTime == 0) { processes[idx].completionTime = currentTime; processes[idx].turnaroundTime = currentTime - processes[idx].arrivalTime; processes[idx].waitingTime = processes[idx].turnaroundTime - processes[idx].burstTime; completed++; } } else { currentTime++; } } double totalWT = 0 totalTAT = 0; for (Process p : processes) { totalWT += p.waitingTime; totalTAT += p.turnaroundTime; System.out.println('P' + p.id + ' CT: ' + p.completionTime + ' WT: ' + p.waitingTime + ' TAT: ' + p.turnaroundTime); } System.out.println('Avg WT: ' + totalWT / n + ' Avg TAT: ' + totalTAT / n); } }
Python class Process: def __init__(self id arrival_time burst_time): self.id = id self.arrival_time = arrival_time self.burst_time = burst_time self.remaining_time = burst_time def srtf(processes): current_time completed = 0 0 while completed < len(processes): idx = -1 for i p in enumerate(processes): if p.arrival_time <= current_time and p.remaining_time > 0 and (idx == -1 or p.remaining_time < processes[idx].remaining_time): idx = i if idx != -1: processes[idx].remaining_time -= 1 current_time += 1 if processes[idx].remaining_time == 0: processes[idx].completion_time = current_time processes[idx].turnaround_time = current_time - processes[idx].arrival_time processes[idx].waiting_time = processes[idx].turnaround_time - processes[idx].burst_time completed += 1 else: current_time += 1 def print_results(processes): total_wt total_tat = 0 0 for p in processes: total_wt += p.waiting_time total_tat += p.turnaround_time print(f'P{p.id} CT: {p.completion_time} WT: {p.waiting_time} TAT: {p.turnaround_time}') print(f'Avg WT: {total_wt / len(processes)} Avg TAT: {total_tat / len(processes)}') n = int(input('Enter number of processes: ')) processes = [Process(i + 1 *map(int input(f'Enter arrival and burst time for P{i + 1}: ').split())) for i in range(n)] srtf(processes) print_results(processes)
Изход
Enter number of processes: Avg WT: -nan Avg TAT: -nan
Предимства на SRTF График
- Минимизира средното време на изчакване : SRTF намалява средното време на изчакване чрез приоритизиране на процеси с най-краткото оставащо време за изпълнение.
- Ефективен за кратки процеси : По-кратките процеси се завършват по-бързо, подобрявайки цялостната реакция на системата.
- Идеален за системи с критично време : Гарантира, че чувствителните към времето процеси се изпълняват бързо.
Недостатъци на SRTF График
- Гладуване на дълги процеси : По-дългите процеси може да се забавят за неопределено време, ако продължават да пристигат по-кратки процеси.
- Трудно е да се предвиди времето за спукване : Точното предвиждане на времената на импулс на процеса е предизвикателство и засяга решенията за планиране.
- Високи режийни разходи : Честото превключване на контекста може да увеличи натоварването и да забави производителността на системата.
- Не е подходящ за системи в реално време : Задачите в реално време може да претърпят закъснения поради чести превключвания.