-
Notifications
You must be signed in to change notification settings - Fork 3
/
Queue.java
145 lines (129 loc) · 3.78 KB
/
Queue.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
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
/**
* @author Mark Dunne
*/
import java.util.LinkedList;
public class Queue extends LinkedList<Process> {
private long quantum;
private long quantumClock;
private Scheduler scheduler;
private int priorityLevel;
private QueueType queueType;
/**
* The types of queue that can exist
*/
public static enum QueueType {
CPU_QUEUE,
BLOCKED_QUEUE
}
/**
* Creates a new Queue object
*
* @param scheduler The Scheduler instance the queue is tied to
* @param quantum The quantum time of the queue
* @param priorityLevel The priority of the queue
* @param queueType The type of the queue
*/
public Queue(Scheduler scheduler, long quantum, int priorityLevel, QueueType queueType) {
this.priorityLevel = priorityLevel;
this.scheduler = scheduler;
this.quantum = quantum;
this.quantumClock = 0;
this.queueType = queueType;
}
/**
* Manage changing between time slices
*
* @param currentProcess The process that is currently being worked on
* @param time The amount of time that has passed
*/
public void manageTimeSlice(Process currentProcess, long time) {
if (currentProcess.isStateChanged()) {
quantumClock = 0;
return;
}
quantumClock += time;
if (quantumClock > quantum) {
quantumClock = 0;
Process process = remove();
if (!process.isFinished()) {
//move down to next queue if we can
scheduler.event(this, process, Scheduler.Interrupt.LOWER_PRIORITY);
} else {
System.out.println("Process complete!");
}
}
}
/**
* Simulate doing some computation work on the process
*
* @param time The amount of time for computation given to the process
*/
public void doCPUWork(long time) {
Process process = element();
process.doCPUWork(time);
manageTimeSlice(process, time);
}
/**
* Simulate working through a blocked process
*
* @param time The amount of time given for working through the block
*/
public void doBlockedWork(long time) {
Process process = element();
process.doBlockedWork(time);
manageTimeSlice(process, time);
}
/**
* Determine if the queue is empty
*
* @return True if the queue is empty
*/
public boolean isEmpty() {
return size() == 0;
}
/**
* Notify the queue of any interrupts that happen on the process
*
* @param source The source process
* @param interrupt The interrupt type
*/
public void event(Process source, Scheduler.Interrupt interrupt) {
remove(source);
switch (interrupt) {
case PROCESS_BLOCKED:
//process entered blocked state
scheduler.event(this, source, Scheduler.Interrupt.PROCESS_BLOCKED);
break;
case PROCESS_READY:
scheduler.event(this, source, Scheduler.Interrupt.PROCESS_READY);
break;
}
}
/**
* Add a process to the queue and set its parent queue to this one
*
* @param process The queue to add
* @return True as usual with collections
*/
@Override
public boolean add(Process process) {
process.setParentQueue(this);
return super.add(process);
}
/**
* Get the priority level of the queue
*
* @return The priority level
*/
public int getPriorityLevel() {
return priorityLevel;
}
/**
* Get the type of the queue
*
* @return The type of the queue
*/
public QueueType getType() {
return queueType;
}
}