package com.raylew.algorithm.os;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.Random;
/**
* Created by RayLew on 2015/7/16.
* QQ:897929321
*/
/*
一种优先级进程调度算法:
最简单最直观的进程调度策略是基于优先级的调度,多数实时系统采用基于优先级的调度,
每个进程根据它重要程度的不同被赋予不同的优先级,调度器在每次调度时,总选择优先级最高的进程开始执行.
算法约定在每次选中某个进程运行后,该进程优先级减1。
*/
public class ProcessSchedule {
public static void main(String[] args) {
Linked_PCBQueue queue = new Linked_PCBQueue();
Object[] pcbs = queue.getPcbQueue().toArray();
for (int i = 0; i < pcbs.length; i++) {
PCB pcb = (PCB) pcbs[i];
System.out.print(pcb.getName() + "的优先级是" + pcb.getPriority()
+ ",运行时间是" + pcb.getRuntime());
System.out.println();
}
LinkedList<PCB> pcbQueue = queue.getPcbQueue();
int length = pcbQueue.size();
while (length > 0) {
PCB pcb = queue.deQueue();
if (pcb.getRuntime() == 1) {
System.out.println("进程" + pcb.getName() + "已经运行完毕");
System.out.println("==========================");
System.out.println();
pcbQueue.remove(pcb);
length--;
} else {
queue.enQueue(pcb);
}
}
}
}
/**
* 进程控制块
*
* @author [Ray Lew]
*/
class PCB implements Comparable<PCB> {
String name;//进程名
int runtime;//进程运行时间
int priority;//进程优先级
boolean status;//进程状态
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getRuntime() {
return runtime;
}
public void setRuntime(int runtime) {
this.runtime = runtime;
}
public int getPriority() {
return priority;
}
public void setPriority(int priority) {
this.priority = priority;
}
public boolean isStatus() {
return status;
}
public void setStatus(boolean status) {
this.status = status;
}
@Override
public int compareTo(PCB o) {
if (o.getPriority() < this.getPriority()) {
return -1;
} else if (o.getPriority() > this.getPriority()) {
return 1;
} else {
return 0;
}
}
}
class Linked_PCBQueue {
LinkedList<PCB> pcbQueue = new LinkedList<PCB>();
public LinkedList<PCB> getPcbQueue() {
return pcbQueue;
}
public void setPcbQueue(LinkedList<PCB> pcbQueue) {
this.pcbQueue = pcbQueue;
}
/**
* 模拟进程队列
*/
public Linked_PCBQueue() {
PCB[] pcbs = new PCB[5];
for (int i = 0; i < 5; i++) {
PCB pcb = new PCB();
Random random = new Random();
pcb.setPriority(random.nextInt(10) + 1);
pcb.setName("P" + (i + 1));
pcb.setRuntime(random.nextInt(10) + 1);
pcb.setStatus(false);
pcbs[i] = pcb;
}
Arrays.sort(pcbs);
for (int i = 0; i < 5; i++) {
pcbQueue.add(pcbs[i]);
}
}
public void enQueue(PCB pcb) {
if (pcb.getPriority() > 0) {
pcb.setPriority(pcb.getPriority() - 1);
}
pcb.setRuntime(pcb.getRuntime() - 1);
System.out.println("," + "进程" + pcb.getName() + "运行结束");
System.out.println("==========================");
pcbQueue.add(pcb);
// 对各进程按优先数大小重新排序
int size = pcbQueue.size();
PCB[] pcbs = new PCB[size];
for (int i = 0; i < size; i++) {
pcbs[i] = pcbQueue.get(i);
}
Arrays.sort(pcbs);
pcbQueue.clear();
for (int i = 0; i < size; i++) {
pcbQueue.add(pcbs[i]);
}
}
public PCB deQueue() {
System.out.println("当前各进程情况:");
System.out.println("进程名 优先数 剩余运行时间 状态");
pcbQueue.get(0).setStatus(true);
for (int i = 0; i < pcbQueue.size(); i++) {
System.out.println(pcbQueue.get(i).getName() + " "
+ pcbQueue.get(i).getPriority() + " "
+ pcbQueue.get(i).getRuntime() + " "
+ pcbQueue.get(i).isStatus());
}
pcbQueue.get(0).setStatus(false);
System.out.println();
PCB pcb = pcbQueue.removeFirst();
System.out.print("进程" + pcb.getName() + "正在运行");
return pcb;
}
}