创建基于优先级的循环算法
Create a priority based round robin algorithm
在这个问题中,我想开发一个基于优先级的循环算法来安排一些任务。
This is the input tasks
AT = Arrival Time
BT = Burst Time
P = Priority
Process AT BT P
1 0 8 5
2 1 4 1
3 2 9 4
4 3 5 3
所需的输出是
Process Start End
1 0 1
2 1 5
4 5 10
1 10 17
3 17 26
有什么合适的算法来安排这个吗?它能够使用队列等数据结构
我试过使用 2 PriorityQueues
但没有成功
这是在 JAVA 中完成的,但它以大部分无所作为结束。
public static void scheduleRoundRobin(int q, ArrayList<CPUProcess> processes){
processes.sort(new ArrivalTimeSorter());
int t = processes.get(0).getArriveTime();
PriorityQueue<CPUProcess> idleQ = new PriorityQueue<>(new BurstComparator());
PriorityQueue<CPUProcess> readyQ = new PriorityQueue<>(new PriorityComparator());
ArrayList<CPUProcess> results = new ArrayList<>();
CPUProcess currentJob = null;
while (processes.size() > 0 || readyQ.size() > 0 || idleQ.size() > 0){
for (CPUProcess process : processes){
if (!process.isFinished() && process.getArriveTime() <= t){
if (currentJob == null){
currentJob = process;
currentJob.setStartTime(t);
}
else
readyQ.add(process);
}
}
if (currentJob != null){
if (readyQ.peek() != null){
CPUProcess process = readyQ.peek();
if (process.getPriority() < currentJob.getPriority() && process.getBrustTime() < currentJob.getBrustTime()){
currentJob.setEndTime(t);
idleQ.add(currentJob);
results.add(CPUProcess.getClone(currentJob));
currentJob = process;
}
}
else if (idleQ.peek() != null){
if (currentJob.getBrustTime() <= 0){
results.add(CPUProcess.getClone(currentJob));
processes.remove(currentJob);
}
currentJob = idleQ.peek();
idleQ.remove();
}
}
if (currentJob != null){
currentJob.setBrustTime(currentJob.getBrustTime() - t);
}
t += q;
}
System.out.println(results);
}
这是我实现的接口
class PriorityComparator implements Comparator<CPUProcess>{
@Override
public int compare(CPUProcess o1, CPUProcess o2) {
return o1.getPriority() - o2.getPriority();
}
}
class ArrivalTimeSorter implements Comparator<CPUProcess>{
@Override
public int compare(CPUProcess o1, CPUProcess o2) {
return o1.getArriveTime() - o2.getArriveTime();
}
}
class BurstComparator implements Comparator<CPUProcess>{
@Override
public int compare(CPUProcess o1, CPUProcess o2) {
return o1.getBrustTime() - o2.getBrustTime();
}
}
基本算法是一个简单的模拟。你把你的流程放在一个到达队列中,按到达时间排序(就像你展示的那样)。然后你模拟调度程序,遍历时间。在每个时间步
- Ingest:此时到达的任何进程,从到达队列移动到执行列表,按优先级插入。
- 调度:选择优先级最高的进程。
- 执行:减少该进程的剩余执行(突发)时间。如果结果为0,则将该进程从执行列表中移除。
继续此操作,直到到达队列和执行列表为空。
在这个问题中,我想开发一个基于优先级的循环算法来安排一些任务。
This is the input tasks
AT = Arrival Time
BT = Burst Time
P = Priority
Process AT BT P
1 0 8 5
2 1 4 1
3 2 9 4
4 3 5 3
所需的输出是
Process Start End
1 0 1
2 1 5
4 5 10
1 10 17
3 17 26
有什么合适的算法来安排这个吗?它能够使用队列等数据结构
我试过使用 2 PriorityQueues
但没有成功
这是在 JAVA 中完成的,但它以大部分无所作为结束。
public static void scheduleRoundRobin(int q, ArrayList<CPUProcess> processes){
processes.sort(new ArrivalTimeSorter());
int t = processes.get(0).getArriveTime();
PriorityQueue<CPUProcess> idleQ = new PriorityQueue<>(new BurstComparator());
PriorityQueue<CPUProcess> readyQ = new PriorityQueue<>(new PriorityComparator());
ArrayList<CPUProcess> results = new ArrayList<>();
CPUProcess currentJob = null;
while (processes.size() > 0 || readyQ.size() > 0 || idleQ.size() > 0){
for (CPUProcess process : processes){
if (!process.isFinished() && process.getArriveTime() <= t){
if (currentJob == null){
currentJob = process;
currentJob.setStartTime(t);
}
else
readyQ.add(process);
}
}
if (currentJob != null){
if (readyQ.peek() != null){
CPUProcess process = readyQ.peek();
if (process.getPriority() < currentJob.getPriority() && process.getBrustTime() < currentJob.getBrustTime()){
currentJob.setEndTime(t);
idleQ.add(currentJob);
results.add(CPUProcess.getClone(currentJob));
currentJob = process;
}
}
else if (idleQ.peek() != null){
if (currentJob.getBrustTime() <= 0){
results.add(CPUProcess.getClone(currentJob));
processes.remove(currentJob);
}
currentJob = idleQ.peek();
idleQ.remove();
}
}
if (currentJob != null){
currentJob.setBrustTime(currentJob.getBrustTime() - t);
}
t += q;
}
System.out.println(results);
}
这是我实现的接口
class PriorityComparator implements Comparator<CPUProcess>{
@Override
public int compare(CPUProcess o1, CPUProcess o2) {
return o1.getPriority() - o2.getPriority();
}
}
class ArrivalTimeSorter implements Comparator<CPUProcess>{
@Override
public int compare(CPUProcess o1, CPUProcess o2) {
return o1.getArriveTime() - o2.getArriveTime();
}
}
class BurstComparator implements Comparator<CPUProcess>{
@Override
public int compare(CPUProcess o1, CPUProcess o2) {
return o1.getBrustTime() - o2.getBrustTime();
}
}
基本算法是一个简单的模拟。你把你的流程放在一个到达队列中,按到达时间排序(就像你展示的那样)。然后你模拟调度程序,遍历时间。在每个时间步
- Ingest:此时到达的任何进程,从到达队列移动到执行列表,按优先级插入。
- 调度:选择优先级最高的进程。
- 执行:减少该进程的剩余执行(突发)时间。如果结果为0,则将该进程从执行列表中移除。
继续此操作,直到到达队列和执行列表为空。