实验题目:
基于优先数的时间片轮转调度算法调度处理器
一、实验目的
在采用多道程序设计的系统中,同时处于就绪态的进程往往有多个,当就绪态的进程数大于处理器的个数时,就需按照某种策略进行分配处理器。本次设计模拟在单处理器情况下采用基于优先数的时间片轮转调度算法进行处理器调度,加深了解处理器调度工作过程。
二、实验内容及要求
1、设计一个程序实现基于优先数的时间片轮转调度算法调度处理器。
2、假定系统有5个进程,每个进程用一个进程控制块PCB开代表,进程控制块的结构如下图1.2所示:
进程名
指针
到达时间
要求运行时间
已运行时间
优先数
进程状态
图1
其中:
进程名:作为进程的标识。
指针:进程按顺序排成循环链表,用指针指出下一个进程的进程控制块首地址,最后一个进程中的指针指出第一个进程的进程控制块首地址。
要求运行时间:假设进程需要运行的单位时间数。
已运行时间:假设进程已经运行的单位时间数,初值为0。
状态:可假设有两种状态,就绪状态和结束状态。进程的初始状态都为就绪状态。
3、每次运行所设计的处理器调度程序调度进程之前,为每个进程任意确定它的要求运行时间。
4、此程序是模拟处理器调度,因此,被选中的进程并不实际启动运行,而是执行
已运行时间+1
来模拟进程的一次运行,表示进程已经运行过一个单位时间。
.5、在所设计的程序中应有显示或打印语句,能显示或打印每次被选中的进程名以及运行一次后进程队列的变化。
6、为进程任意确定要求运行时间,运行所设计的处理器调度程序,显示或打印逐次被选中进程的进程名以及进程控制块的动态变化过程。
7、设有一个就绪队列,就绪进程按优先数(优先数范围0-100)由小到大排列(优先数越小,级别越高)。当某一进程运行完一个时间片后,其优先级应下调(如优先数加2或3)。
三丶 主要解决办法
3.1 判断进程是否在就绪队列中
wait_run_list = new ArrayList<>();
// 此处将所有进程中等待执行的序列的进程选出 由current_time 判断进程是否在等待序列中
for (ProgressTest pt : list) {
// 是否在就绪队列 是否执行完毕
if (current_time >= pt.arrive_time
&& pt.do_service_time != pt.service_time) {
wait_run_list.add(pt);
}
}
3.2 List list 排序
Collections.sort(wait_run_list, new Comparator<ProgressTest>() {
public int compare(ProgressTest arg0, ProgressTest arg1) {
return arg0.priority < arg1.priority ? -1 : 1;
}
});
四丶完整代码
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
/* * 编码格式utf-8 * 实现内容: 优先级的时间片轮转算法 *priority (优先级) 数字越小 优先级越高 * * @author songjiang 2016.11.21 * @jdk 1.7 * @version 1.0 */
public class ProgressTest {
private int arrive_time; //到达时间
private int service_time; //服务时间
private int do_service_time; // 已运行时间
private int priority;
private boolean state; //运行状态 false为完成 true为就绪
private char name;
public static int current_time;
public static int total_time;
static List<ProgressTest> list = new ArrayList<>();
static List<ProgressTest> wait_run_list = null;
public static void main(String[] args) throws InterruptedException {
ProgressTest A = new ProgressTest(65, 0, 6, (int) (Math.random() * 60));
ProgressTest B = new ProgressTest(66, 2, 10, (int) (Math.random() * 60));
ProgressTest C = new ProgressTest(67, 3, 5, (int) (Math.random() * 60));
ProgressTest D = new ProgressTest(68, 6, 1, (int) (Math.random() * 60));
ProgressTest E = new ProgressTest(69, 8, 2, (int) (Math.random() * 60));
ProgressTest F = new ProgressTest(70, 12, 5, (int) (Math.random() * 60));
list.add(A);
list.add(B);
list.add(C);
list.add(D);
list.add(E);
list.add(F);
total_time = getTotalTime(list);
doRRbyPriority(list);
}
private static void doRRbyPriority(List<ProgressTest> list)
throws InterruptedException {
while (current_time <= total_time) {
wait_run_list = new ArrayList<>();
// 此处将所有进程中等待执行的序列的进程选出 由current_time 判断进程是否在等待序列中
for (ProgressTest pt : list) {
// 是否在就绪队列 是否执行完毕
if (current_time >= pt.arrive_time
&& pt.do_service_time != pt.service_time) {
wait_run_list.add(pt);
}
}
Collections.sort(wait_run_list, new Comparator<ProgressTest>() {
public int compare(ProgressTest arg0, ProgressTest arg1) {
return arg0.priority < arg1.priority ? -1 : 1;
}
});
System.out.println("就绪队列wait_run_list:" + wait_run_list.toString());
System.out.println(current_time + " " + total_time + " "
+ current_time);
if (wait_run_list.size() > 0) {
ProgressTest pt = wait_run_list.get(0);
if (pt.checkProgress())
{
pt.doOnceRun();
current_time++; // 一次执行一个时间片
System.out.println("当前运行" + pt.toString());
}
System.out.println();
} else {
break;
}
}
}
public ProgressTest(int name, int arrive_time, int service_time,
int priority) {
this.arrive_time = arrive_time;
this.service_time = service_time;
this.priority = priority;
this.name = (char) name;
state = true; // 默认为就绪状态
}
// 获得总的运行时间
public static int getTotalTime(List<ProgressTest> list) {
int time = 0;
Iterator<ProgressTest> it = list.iterator();
while (it.hasNext()) {
ProgressTest pt = it.next();
time += pt.service_time;
}
return time;
}
// 一次运行时间 服务时间减一 上调优先数
public void doOnceRun() {
if (this.do_service_time < this.service_time) {
do_service_time++;
}
this.priority += 2;
}
public boolean checkProgress() {
if (this.do_service_time == this.service_time) {
state = false;
System.out.println(this.state + ",运行完毕");
return state;
} else {
return state;
}
}
@Override
public String toString() {
return this.name + " " + "已服务" + do_service_time + " 到达" + arrive_time
+ " 服务" + service_time + " 优先级" + priority;
}
}
某次运行效果:
就绪队列wait_run_list:[A 已服务0 到达0 服务6 优先级48]
0 29 0
当前运行A 已服务1 到达0 服务6 优先级50
就绪队列wait_run_list:[A 已服务1 到达0 服务6 优先级50]
1 29 1
当前运行A 已服务2 到达0 服务6 优先级52
就绪队列wait_run_list:[B 已服务0 到达2 服务10 优先级26, A 已服务2 到达0 服务6 优先级52]
2 29 2
当前运行B 已服务1 到达2 服务10 优先级28
就绪队列wait_run_list:[C 已服务0 到达3 服务5 优先级1, B 已服务1 到达2 服务10 优先级28, A 已服务2 到达0 服务6 优先级52]
3 29 3
当前运行C 已服务1 到达3 服务5 优先级3
就绪队列wait_run_list:[C 已服务1 到达3 服务5 优先级3, B 已服务1 到达2 服务10 优先级28, A 已服务2 到达0 服务6 优先级52]
4 29 4
当前运行C 已服务2 到达3 服务5 优先级5
就绪队列wait_run_list:[C 已服务2 到达3 服务5 优先级5, B 已服务1 到达2 服务10 优先级28, A 已服务2 到达0 服务6 优先级52]
5 29 5
当前运行C 已服务3 到达3 服务5 优先级7
就绪队列wait_run_list:[C 已服务3 到达3 服务5 优先级7, D 已服务0 到达6 服务1 优先级18, B 已服务1 到达2 服务10 优先级28, A 已服务2 到达0 服务6 优先级52]
6 29 6
当前运行C 已服务4 到达3 服务5 优先级9
就绪队列wait_run_list:[C 已服务4 到达3 服务5 优先级9, D 已服务0 到达6 服务1 优先级18, B 已服务1 到达2 服务10 优先级28, A 已服务2 到达0 服务6 优先级52]
7 29 7
当前运行C 已服务5 到达3 服务5 优先级11
就绪队列wait_run_list:[D 已服务0 到达6 服务1 优先级18, E 已服务0 到达8 服务2 优先级20, B 已服务1 到达2 服务10 优先级28, A 已服务2 到达0 服务6 优先级52]
8 29 8
当前运行D 已服务1 到达6 服务1 优先级20
就绪队列wait_run_list:[E 已服务0 到达8 服务2 优先级20, B 已服务1 到达2 服务10 优先级28, A 已服务2 到达0 服务6 优先级52]
9 29 9
当前运行E 已服务1 到达8 服务2 优先级22
就绪队列wait_run_list:[E 已服务1 到达8 服务2 优先级22, B 已服务1 到达2 服务10 优先级28, A 已服务2 到达0 服务6 优先级52]
10 29 10
当前运行E 已服务2 到达8 服务2 优先级24
就绪队列wait_run_list:[B 已服务1 到达2 服务10 优先级28, A 已服务2 到达0 服务6 优先级52]
11 29 11
当前运行B 已服务2 到达2 服务10 优先级30
就绪队列wait_run_list:[F 已服务0 到达12 服务5 优先级28, B 已服务2 到达2 服务10 优先级30, A 已服务2 到达0 服务6 优先级52]
12 29 12
当前运行F 已服务1 到达12 服务5 优先级30
就绪队列wait_run_list:[B 已服务2 到达2 服务10 优先级30, F 已服务1 到达12 服务5 优先级30, A 已服务2 到达0 服务6 优先级52]
13 29 13
当前运行B 已服务3 到达2 服务10 优先级32
就绪队列wait_run_list:[F 已服务1 到达12 服务5 优先级30, B 已服务3 到达2 服务10 优先级32, A 已服务2 到达0 服务6 优先级52]
14 29 14
当前运行F 已服务2 到达12 服务5 优先级32
就绪队列wait_run_list:[B 已服务3 到达2 服务10 优先级32, F 已服务2 到达12 服务5 优先级32, A 已服务2 到达0 服务6 优先级52]
15 29 15
当前运行B 已服务4 到达2 服务10 优先级34
就绪队列wait_run_list:[F 已服务2 到达12 服务5 优先级32, B 已服务4 到达2 服务10 优先级34, A 已服务2 到达0 服务6 优先级52]
16 29 16
当前运行F 已服务3 到达12 服务5 优先级34
就绪队列wait_run_list:[B 已服务4 到达2 服务10 优先级34, F 已服务3 到达12 服务5 优先级34, A 已服务2 到达0 服务6 优先级52]
17 29 17
当前运行B 已服务5 到达2 服务10 优先级36
就绪队列wait_run_list:[F 已服务3 到达12 服务5 优先级34, B 已服务5 到达2 服务10 优先级36, A 已服务2 到达0 服务6 优先级52]
18 29 18
当前运行F 已服务4 到达12 服务5 优先级36
就绪队列wait_run_list:[B 已服务5 到达2 服务10 优先级36, F 已服务4 到达12 服务5 优先级36, A 已服务2 到达0 服务6 优先级52]
19 29 19
当前运行B 已服务6 到达2 服务10 优先级38
就绪队列wait_run_list:[F 已服务4 到达12 服务5 优先级36, B 已服务6 到达2 服务10 优先级38, A 已服务2 到达0 服务6 优先级52]
20 29 20
当前运行F 已服务5 到达12 服务5 优先级38
就绪队列wait_run_list:[B 已服务6 到达2 服务10 优先级38, A 已服务2 到达0 服务6 优先级52]
21 29 21
当前运行B 已服务7 到达2 服务10 优先级40
就绪队列wait_run_list:[B 已服务7 到达2 服务10 优先级40, A 已服务2 到达0 服务6 优先级52]
22 29 22
当前运行B 已服务8 到达2 服务10 优先级42
就绪队列wait_run_list:[B 已服务8 到达2 服务10 优先级42, A 已服务2 到达0 服务6 优先级52]
23 29 23
当前运行B 已服务9 到达2 服务10 优先级44
就绪队列wait_run_list:[B 已服务9 到达2 服务10 优先级44, A 已服务2 到达0 服务6 优先级52]
24 29 24
当前运行B 已服务10 到达2 服务10 优先级46
就绪队列wait_run_list:[A 已服务2 到达0 服务6 优先级52]
25 29 25
当前运行A 已服务3 到达0 服务6 优先级54
就绪队列wait_run_list:[A 已服务3 到达0 服务6 优先级54]
26 29 26
当前运行A 已服务4 到达0 服务6 优先级56
就绪队列wait_run_list:[A 已服务4 到达0 服务6 优先级56]
27 29 27
当前运行A 已服务5 到达0 服务6 优先级58
就绪队列wait_run_list:[A 已服务5 到达0 服务6 优先级58]
28 29 28
当前运行A 已服务6 到达0 服务6 优先级60
就绪队列wait_run_list:[]
29 29 29