-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathSRT.java
125 lines (100 loc) · 5.17 KB
/
SRT.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package planista;
import java.util.ArrayList;
import java.util.PriorityQueue;
/**
*
* @author konrad
*/
public class SRT extends Strategia {
public SRT() {
this.nazwa = "SRT";
}
@Override
public void przedstawSię () {
System.out.println("Strategia: " + this.nazwa);
}
@Override
void przeprowadzStrategie(ArrayList<Proces> procesy) {
// Przygotowanie zmiennych i pojemników, porządkowanie danych
PriorityQueue<Proces> OczekująceProcesy = new PriorityQueue<>(new SRTComparator());
PriorityQueue<Proces> AktywneProcesy = new PriorityQueue<>(new SRTxtraComparator());
double czas = 0;
for (Proces p: procesy) {
p.setPostęp(0);
p.setCzasZakończenia(-1);
}
for (Proces p: procesy) {
OczekująceProcesy.add(p);
}
// Symulacja wykonywania zadań
Proces bieżącyProces = OczekująceProcesy.poll(); // zbiór procesów jest niepusty
// System.out.println("Czas: " + czas + " ,nowy proces: " + bieżącyProces.getId());
while(!OczekująceProcesy.isEmpty() || !AktywneProcesy.isEmpty()) {
// Jeśli bieżący proces wykonał się, to kończymy go
if (bieżącyProces != null && bieżącyProces.getZapotrzebowanie() == bieżącyProces.getPostęp()) {
bieżącyProces.setCzasZakończenia(czas);
// System.out.println("Czas: " + czas + " ,kończę: " + bieżącyProces.getId());
// gdzieś na pewno jest jeszcze zadanie
if (!AktywneProcesy.isEmpty() && !OczekująceProcesy.isEmpty()) {
Proces p = OczekująceProcesy.peek();
Proces a = AktywneProcesy.peek();
if (p.getCzasPojawienia() == czas && p.getZapotrzebowanie() <= a.getZapotrzebowanie() && p.getId() < a.getId()) {
bieżącyProces = OczekująceProcesy.poll();
}
else {
bieżącyProces = AktywneProcesy.poll();
}
}
else if (!AktywneProcesy.isEmpty()) {
bieżącyProces = AktywneProcesy.poll();
}
else
bieżącyProces = OczekująceProcesy.poll();
// System.out.println("Czas: " + czas + " ,nowy proces x: " + bieżącyProces.getId());
}
// Jeśli pojawiły się nowe procesy, to bierzemy je
while (!OczekująceProcesy.isEmpty() && czas == OczekująceProcesy.peek().getCzasPojawienia()) {
Proces p = OczekująceProcesy.poll();
// Jeśli nowy proces wykona się szybciej, to bierzemy się za niego
if (p.getZapotrzebowanie() < bieżącyProces.pozostałyCzas()) {
// System.out.println("Czas: " + czas + " ,przerywam bieżący proces: " + bieżącyProces.getId());
AktywneProcesy.add(bieżącyProces);
bieżącyProces = p;
// System.out.println("Czas: " + czas + " ,biorę nowy proces: " + bieżącyProces.getId());
}
// W przeciwnym wypadku odkładamy proces na później
else {
AktywneProcesy.add(p);
// System.out.println("Czas: " + czas + " ,odkładam na później: " + p.getId());
}
}
// Wykonujemy bieżący proces do momentu pojawienia się nowego procesu lub do momentu zakończenia tego procesu
// bieżącyProces na pewno nie jest tutaj nullem
if (!OczekująceProcesy.isEmpty()) {
// Proces kończy się przed pojawieniem się kolejnego zadania
if( bieżącyProces.pozostałyCzas() < OczekująceProcesy.peek().getCzasPojawienia() - czas) {
czas += bieżącyProces.pozostałyCzas();
bieżącyProces.setPostęp(bieżącyProces.getZapotrzebowanie());
// System.out.println("essa");
}
// Proces nie zdąży się wykonać w całości
else{
bieżącyProces.setPostęp(bieżącyProces.getPostęp() + OczekująceProcesy.peek().getCzasPojawienia() - czas);
czas = OczekująceProcesy.peek().getCzasPojawienia();
}
}
// Jeśli nie ma więcej nowych procesów, to po prostu robimy bieżący proces
else {
czas += bieżącyProces.pozostałyCzas();
bieżącyProces.setPostęp(bieżącyProces.getZapotrzebowanie());
}
// System.out.println("Ustawiono czas na: " + czas);
}
bieżącyProces.setCzasZakończenia(czas);
}
}