Išankstinė trumpiausio darbo pradžia (SJF) planavimo versija vadinama trumpiausiu likusiu laiku pirmiausia (SRTF). SRTF pasirenkamas paleisti procesas, kuriam iki pabaigos liko mažiausiai laiko. Vykdomas procesas tęsiasi tol, kol baigiasi arba atsiranda naujas procesas su trumpesniu likusiu laiku, todėl pirmenybė visada teikiama greičiausiam užbaigimo procesui.
SJF algoritmo pavyzdys:
1 scenarijus: procesai su tuo pačiu atvykimo laiku
Pavyzdys: Apsvarstykite toliau pateiktą trijų procesų atvykimo laiko ir serijos trukmės lentelę P1 P2 ir P3 .
| Procesas | Burst Time | Atvykimo laikas |
|---|---|---|
| P1 | 6 ms | 0 ms |
| P2 | 8 ms | 0 ms |
| P3 | 5 ms | 0 ms |
Žingsnis po žingsnio vykdymas:
- Laikas 0–5 (P3) : P3 veikia 5 ms (bendras likęs laikas: 0 ms), nes liko trumpiausias laikas.
- Laikas 5–11 (P1) : P1 veikia 6 ms (bendras likęs laikas: 0 ms), nes liko trumpiausias laikas.
- Laikas 11–19 (P2) : P2 veikia 8 ms (bendras likęs laikas: 0 ms), nes liko trumpiausias laikas.
Ganto diagrama:
rdbms
Dabar paskaičiuokime vidurkį laukimo laiko ir apsisukti laikas:
Kaip žinome
- Apsisukimo laikas = Užbaigimo laikas – atvykimo laikas
- Laukimo laikas = Apsisukimo laikas – serijos laikas
| Procesas | Atvykimo laikas (AT) | Burst Time metus į ketvirčius (BT) | Užbaigimo laikas (KT) | Apsisukimo laikas (TAT) | Laukimo laikas (WT) |
|---|---|---|---|---|---|
| P1 | 6 | 11 | 11-0 = 11 | 11-6 = 5 | |
| P2 | pitono gyvatė vs anakonda | 8 | 19 | 19-0 = 19 | 19-8 = 11 |
| P3 | 5 | 5 | 5-0 = 5 | 5-5 = 0 |
Dabar
- Vidutinis apsisukimo laikas = (11 + 19 + 5)/3 = 11,6 ms
- Vidutinis laukimo laikas = (5 + 0 + 11) / 3 = 16/3 = 5,33 ms
2 scenarijus: procesai su skirtingu atvykimo laiku
Apsvarstykite toliau pateiktą trijų procesų P1 P2 ir P3 atvykimo laiko ir serijos trukmės lentelę.
| Procesas | Burst Time | Atvykimo laikas |
|---|---|---|
| P1 | 6 ms | 0 ms |
| P2 | 3 ms | 1 ms |
| P3 | 7 ms | 2 ms |
Žingsnis po žingsnio vykdymas:
kitaip jei bash
- Laikas 0–1 (P1) : P1 veikia 1 ms (bendras likęs laikas: 5 ms), nes liko trumpiausias laikas.
- Laikas 1–4 (P2) : P2 veikia 3 ms (bendras likęs laikas: 0 ms), nes liko trumpiausias laikas tarp P1 ir P2.
- Laikas 4–9 (P1) : P1 veikia 5 ms (bendras likęs laikas: 0 ms), nes liko trumpiausias laikas tarp P1 ir P3.
- Laikas 9–16 (P3) : P3 veikia 7 ms (bendras likęs laikas: 0 ms), nes liko trumpiausias laikas.
Ganto diagrama:
Dabar paskaičiuokime vidurkį laukimo laiko ir apsisukti laikas:
| Procesas | Atvykimo laikas (AT) | serijos laikas (BT) | Užbaigimo laikas (KT) | Apsisukimo laikas (TAT) | Laukimo laikas (WT) |
|---|---|---|---|---|---|
| P1 | nepakeičiamas sąrašas | 6 | 9 | 9-0 = 9 | 9-6 = 3 |
| P2 | 1 | 3 | 4 | 4-1 = 3 | 3-3 = 0 |
| P3 | 2 | 7 | 16 | 16-2 = 14 | 14-7 = 7 |
- Vidutinis apsisukimo laikas = (9 + 14 + 3) / 3 = 8,6 ms
- Vidutinis laukimo laikas = (3 + 0 + 7)/3 = 10/3 = 3,33 ms
SRTF algoritmo įgyvendinimas
1 veiksmas: Įveskite procesų skaičių su atvykimo laiku ir serijos trukme.
2 veiksmas: Inicijuoti likusį laiką (sujungimo laiką), dabartinį laiką = 0 ir skaitiklius.
3 veiksmas: Prie kiekvieno laiko vieneto pridėkite procesus, kurie atėjo į paruoštų eilę.
4 veiksmas: Pasirinkite procesą, kurio likęs laikas yra trumpiausias (iš anksto, jei ateina trumpesnis).
5 veiksmas: Vykdykite pasirinktą procesą 1 vienetui, sumažinkite likusį laiką ir padidinkite esamą laiką.
6 veiksmas: Jei procesas baigtas:
- Apdorojimo laikas = užbaigimo laikas − atvykimo laikas
- Laukimo laikas = apyvartos laikas − serijos laikas
7 veiksmas: Kartokite 3–6 veiksmus, kol bus baigti visi procesai.
8 veiksmas: Apskaičiuokite vidutinį laukimo ir apyvartos laiką.
9 veiksmas: Rodyti kiekvieno proceso užbaigimo laukimo ir apyvartos laiką kartu su vidurkiais.
Kodo įgyvendinimas
Programa, skirta įgyvendinti trumpiausią likusį laiką, yra tokia:
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)
Išvestis
Enter number of processes: Avg WT: -nan Avg TAT: -nan
SRTF privalumai Planavimas
- Sumažina vidutinį laukimo laiką : SRTF sumažina vidutinį laukimo laiką, suteikdama pirmenybę procesams, kurių vykdymo laikas yra trumpiausias.
- Veiksmingas trumpiems procesams : trumpesni procesai užbaigiami greičiau, pagerinant bendrą sistemos reagavimą.
- Idealiai tinka laiko kritinėms sistemoms : Tai užtikrina, kad laikui jautrūs procesai būtų vykdomi greitai.
SRTF trūkumai Planavimas
- Ilgų procesų badas : Ilgesni procesai gali būti atidėti neribotam laikui, jei vis atsiranda trumpesnių procesų.
- Sunku numatyti sprogimo laiką : Tikslus proceso eigos laiko numatymas yra sudėtingas ir turi įtakos planavimo sprendimams.
- Aukštos pridėtinės išlaidos : Dažnas konteksto perjungimas gali padidinti išlaidas ir sulėtinti sistemos veikimą.
- Netinka realaus laiko sistemoms : Užduotys realiuoju laiku gali vėluoti dėl dažnų prevencijų.