操作系统 时间片轮转RR进程调度算法 JAVA版
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
// 调度程序 char w = 'A'; System.out.println("时刻" + NowTime + ":进程" + (char)(w + order[0]) + "开始运行;"); if (PServiceTime[order[0]] > q) { //进程还未完成
PServiceTime[order[0]] = PServiceTime[order[0]] - q; //对应的进 程的服务时间减去一个时间片
public class B_RR {
// 声明变量 // 时间片 public static int q = 0; // 允许的最大进程数 public static int MaxNum = 100; // 真正的进程数 public static int realNum; // order数组的一个下标 public static int number; // 当前时间 public static int NowTime; // 各进程的达到时间 public static int ArrivalTime[] = new int[MaxNum]; // 各进程的服务时间
"./file/02")); System.setIn(in); stdin = new Scanner(System.in);
q = stdin.nextInt(); // 时间片q realNum = stdin.nextInt(); // 真实进程数 for (int i = 0; i < realNum; i++) { // 各进程的服务时间
4、 需求分析
(1) 输入的形式和输入值的范围
时间片
真实进程数
各进程的到达时间
各进程的服务时间
(2) 输出的形式
模拟整个调度过程、周转时间、带权周转时间、所有进程的平均周转
时间以及带权平均周转时间。
(3)测试用例
作业情况 进程名
A
B
C
D
到达时间
0
1
2
3Βιβλιοθήκη Baidu
时间片
服务时间
4
3
5
2
RR
完成时间
12 10
18
NowTime += q; //现在时刻增加一个时间片 System.out.println("时刻" + NowTime + ":进程" + (char)(w + order[0]) + "停止运行,加入就绪序列尾;"); } else { //进程剩一个时间片后结束 NowTime += PServiceTime[order[0]]; //现在时间增加一个时间片 PServiceTime[order[0]] = 0; //对应进程的服务时间归零 System.out.println("时刻" + NowTime + ":进程" + (char)(w + order[0]) + "运行结束;"); FinishTime[order[0]] = NowTime; WholeTime[order[0]] = NowTime - ArrivalTime[order[0]]; WeightWholeTime[order[0]] = 1.0 * WholeTime[order[0]] / ServiceTime[order[0]]; }
// 将到达的程序加入序列尾 if (all_add < realNum) {
for (int i = 1; i < realNum; i++) { if (NowTime >= ArrivalTime[i] && Finished[i] == false) { //
判断该进程是否已经在就绪队列中 order[number++] = i; all_add++; Finished[i] = true;
11
q=1
周转时间
12 9
16
8
带权周转时间 3
3
3.2
4
RR
完成时间
4
7
18
13
q=4
周转时间
4
6
16
10
带权周转时间 1
2
3.2
5
5、 调试分析
E
平均
4
4
17
13
11.6
3.25
3.29
17
13
9.8
3.25
2.89
由于自己自编写代码方面与他人有一定的差距,因此在做实验的
过程中我在网上搜了很多相关的资料,了解实现该算法的原理及各部
+ ServiceTime[i] + "\t" + FinishTime[i] + "\t" + WholeTime[i] + "\t" + WeightWholeTime[i]); }
AverageWT = all / realNum; System.out.println("平均周转时间:" + AverageWT); AverageWWT = all1 / realNum; System.out.println("平均带权周转时间: " + AverageWWT); } }
输出
输入时间片,进程数,进程到达时间,服务时间 输出
7、附录(java)
package experiment;
import java.io.BufferedInputStream; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.util.Scanner;
int all_add = 1; //就绪队列中的进程个数
order[0] = 0; //进程调度队列(存放的是各个进程的数字代号,如进程A数字代 号为1)
number = 1; NowTime = 0; //现在时间 while (order[0] != 100) { //order[0]为100,是认为规定进程调度结束的标志
order[--number] = 100; }else{ //进程还未调度结束
order[number - 1] = temp; } }
double all = 0, all1 = 0; for (int i = 0; i < realNum; i++) {// 计算总周转时间和总带权周转时间
all += WholeTime[i]; all1 += WeightWholeTime[i]; } System.out.println("\n进程名\t到达时间\t服务时间\t完成时间\t周转时间\t 带权周转时间"); for (int i = 0; i < realNum; i++) { System.out.println((char)(i + 'A') + "\t" + ArrivalTime[i] + "\t"
分实现的代码,同时参考了几个别人写好的源代码,然后自己在理解
的基础上不断的根据要求修改写程序,不过其中碰见的很多的问题。
我已经自己调了好多错误,在一遍遍的调试和修改中,发现自己的经
验在快速增长,这个感觉真的很不错。然而,实验的运行结果还不是
很完美,每个进程在最后一个时间片的运行过程中,进程列表的更新 总是修改错误。不过在在本次试验中学到了不少东西,一点点的在进 步。 6、 测试结果 输入时间片,进程数,进程到达时间,服务时间
} } }
// 将序列首程序调到序列尾 int temp = order[0]; for (int i = 0; i < number - 1; i++){ //将order中的每个数前移一位
order[i] = order[i + 1]; }
if (PServiceTime[temp] == 0){ //进程已将全部调度结束,通过将order的 第一个数标记为100,来结束进程调度
实验二 间片轮转RR进程调度算法
1、 实验目的 通过这次实验,加深对进程概念的理解,进一步掌握进程状态的 转变、进程调度的策略及对系统性能的评价方法。
2、 试验内容 问题描述: 设计程序模拟进程的时间片轮转 RR 调度过程。假设有 n 个进程 分别在 T1, … ,Tn 时刻到达系统,它们需要的服务时间分别为 S1, … ,Sn。分别利用不同的时间片大小 q,采用时间片轮转 RR 进 程调度算法进行调度,计算每个进程的完成时间、周转时间和带 权周转时间,并且统计 n 个进程的平均周转时间和平均带权周转 时间。
ArrivalTime[i] = stdin.nextInt(); } for (int j = 0; j < realNum; j++) { // 各进程的服务时间
ServiceTime[j] = stdin.nextInt(); PServiceTime[j] = ServiceTime[j]; //用于记录进程服务时间随时间片轮 转减少的过程 Finished[j] = false; } stdin.close();
3、 程序要求: 1 ) 进 程 个 数 n ; 每 个 进 程 的 到 达 时 间 T1, … ,Tn 和 服 务 时 间 S1, … ,Sn;输入时间片大小 q。 2)要求时间片轮转法 RR 调度进程运行,计算每个进程的周转时 间和带权周转时间,并且计算所有进程的平均周转时间和带权平 均周转时间; 3)输出:要求模拟整个调度过程,输出每个时刻的进程运行状态, 如“时刻 3:进程 B 开始运行”等等; 4)输出:要求输出计算出来的每个进程的周转时间、带权周转时 间、所有进程的平均周转时间以及带权平均周转时间。
public static Scanner stdin;
public static void main(String[] args) throws FileNotFoundException {
// 从文件中输入数据 BufferedInputStream in = new BufferedInputStream(new FileInputStream(
public static int ServiceTime[] = new int[MaxNum]; // 各进程的服务时间(用于记录进程服务时间随时间片轮转减少的过程) public static int PServiceTime[] = new int[MaxNum]; // 各进程的完成时间 public static int FinishTime[] = new int[MaxNum]; // 各进程的周转时间 public static int WholeTime[] = new int[MaxNum]; // 进程调度队列(存放的是各个进程的数字代号,如进程A数字代号为1) public static int order[] = new int[MaxNum]; // 各进程的带权周转时间 public static double WeightWholeTime[] = new double[MaxNum]; // 平均周转时间、平均带权周转时间 public static double AverageWT, AverageWWT; // 周转时间总和 public static int SumWT = 0; // 带权周转时间总和 public static double SumWWT = 0; // 进程是否已经结束的标志 public static boolean Finished[] = new boolean[MaxNum];
PServiceTime[order[0]] = PServiceTime[order[0]] - q; //对应的进 程的服务时间减去一个时间片
public class B_RR {
// 声明变量 // 时间片 public static int q = 0; // 允许的最大进程数 public static int MaxNum = 100; // 真正的进程数 public static int realNum; // order数组的一个下标 public static int number; // 当前时间 public static int NowTime; // 各进程的达到时间 public static int ArrivalTime[] = new int[MaxNum]; // 各进程的服务时间
"./file/02")); System.setIn(in); stdin = new Scanner(System.in);
q = stdin.nextInt(); // 时间片q realNum = stdin.nextInt(); // 真实进程数 for (int i = 0; i < realNum; i++) { // 各进程的服务时间
4、 需求分析
(1) 输入的形式和输入值的范围
时间片
真实进程数
各进程的到达时间
各进程的服务时间
(2) 输出的形式
模拟整个调度过程、周转时间、带权周转时间、所有进程的平均周转
时间以及带权平均周转时间。
(3)测试用例
作业情况 进程名
A
B
C
D
到达时间
0
1
2
3Βιβλιοθήκη Baidu
时间片
服务时间
4
3
5
2
RR
完成时间
12 10
18
NowTime += q; //现在时刻增加一个时间片 System.out.println("时刻" + NowTime + ":进程" + (char)(w + order[0]) + "停止运行,加入就绪序列尾;"); } else { //进程剩一个时间片后结束 NowTime += PServiceTime[order[0]]; //现在时间增加一个时间片 PServiceTime[order[0]] = 0; //对应进程的服务时间归零 System.out.println("时刻" + NowTime + ":进程" + (char)(w + order[0]) + "运行结束;"); FinishTime[order[0]] = NowTime; WholeTime[order[0]] = NowTime - ArrivalTime[order[0]]; WeightWholeTime[order[0]] = 1.0 * WholeTime[order[0]] / ServiceTime[order[0]]; }
// 将到达的程序加入序列尾 if (all_add < realNum) {
for (int i = 1; i < realNum; i++) { if (NowTime >= ArrivalTime[i] && Finished[i] == false) { //
判断该进程是否已经在就绪队列中 order[number++] = i; all_add++; Finished[i] = true;
11
q=1
周转时间
12 9
16
8
带权周转时间 3
3
3.2
4
RR
完成时间
4
7
18
13
q=4
周转时间
4
6
16
10
带权周转时间 1
2
3.2
5
5、 调试分析
E
平均
4
4
17
13
11.6
3.25
3.29
17
13
9.8
3.25
2.89
由于自己自编写代码方面与他人有一定的差距,因此在做实验的
过程中我在网上搜了很多相关的资料,了解实现该算法的原理及各部
+ ServiceTime[i] + "\t" + FinishTime[i] + "\t" + WholeTime[i] + "\t" + WeightWholeTime[i]); }
AverageWT = all / realNum; System.out.println("平均周转时间:" + AverageWT); AverageWWT = all1 / realNum; System.out.println("平均带权周转时间: " + AverageWWT); } }
输出
输入时间片,进程数,进程到达时间,服务时间 输出
7、附录(java)
package experiment;
import java.io.BufferedInputStream; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.util.Scanner;
int all_add = 1; //就绪队列中的进程个数
order[0] = 0; //进程调度队列(存放的是各个进程的数字代号,如进程A数字代 号为1)
number = 1; NowTime = 0; //现在时间 while (order[0] != 100) { //order[0]为100,是认为规定进程调度结束的标志
order[--number] = 100; }else{ //进程还未调度结束
order[number - 1] = temp; } }
double all = 0, all1 = 0; for (int i = 0; i < realNum; i++) {// 计算总周转时间和总带权周转时间
all += WholeTime[i]; all1 += WeightWholeTime[i]; } System.out.println("\n进程名\t到达时间\t服务时间\t完成时间\t周转时间\t 带权周转时间"); for (int i = 0; i < realNum; i++) { System.out.println((char)(i + 'A') + "\t" + ArrivalTime[i] + "\t"
分实现的代码,同时参考了几个别人写好的源代码,然后自己在理解
的基础上不断的根据要求修改写程序,不过其中碰见的很多的问题。
我已经自己调了好多错误,在一遍遍的调试和修改中,发现自己的经
验在快速增长,这个感觉真的很不错。然而,实验的运行结果还不是
很完美,每个进程在最后一个时间片的运行过程中,进程列表的更新 总是修改错误。不过在在本次试验中学到了不少东西,一点点的在进 步。 6、 测试结果 输入时间片,进程数,进程到达时间,服务时间
} } }
// 将序列首程序调到序列尾 int temp = order[0]; for (int i = 0; i < number - 1; i++){ //将order中的每个数前移一位
order[i] = order[i + 1]; }
if (PServiceTime[temp] == 0){ //进程已将全部调度结束,通过将order的 第一个数标记为100,来结束进程调度
实验二 间片轮转RR进程调度算法
1、 实验目的 通过这次实验,加深对进程概念的理解,进一步掌握进程状态的 转变、进程调度的策略及对系统性能的评价方法。
2、 试验内容 问题描述: 设计程序模拟进程的时间片轮转 RR 调度过程。假设有 n 个进程 分别在 T1, … ,Tn 时刻到达系统,它们需要的服务时间分别为 S1, … ,Sn。分别利用不同的时间片大小 q,采用时间片轮转 RR 进 程调度算法进行调度,计算每个进程的完成时间、周转时间和带 权周转时间,并且统计 n 个进程的平均周转时间和平均带权周转 时间。
ArrivalTime[i] = stdin.nextInt(); } for (int j = 0; j < realNum; j++) { // 各进程的服务时间
ServiceTime[j] = stdin.nextInt(); PServiceTime[j] = ServiceTime[j]; //用于记录进程服务时间随时间片轮 转减少的过程 Finished[j] = false; } stdin.close();
3、 程序要求: 1 ) 进 程 个 数 n ; 每 个 进 程 的 到 达 时 间 T1, … ,Tn 和 服 务 时 间 S1, … ,Sn;输入时间片大小 q。 2)要求时间片轮转法 RR 调度进程运行,计算每个进程的周转时 间和带权周转时间,并且计算所有进程的平均周转时间和带权平 均周转时间; 3)输出:要求模拟整个调度过程,输出每个时刻的进程运行状态, 如“时刻 3:进程 B 开始运行”等等; 4)输出:要求输出计算出来的每个进程的周转时间、带权周转时 间、所有进程的平均周转时间以及带权平均周转时间。
public static Scanner stdin;
public static void main(String[] args) throws FileNotFoundException {
// 从文件中输入数据 BufferedInputStream in = new BufferedInputStream(new FileInputStream(
public static int ServiceTime[] = new int[MaxNum]; // 各进程的服务时间(用于记录进程服务时间随时间片轮转减少的过程) public static int PServiceTime[] = new int[MaxNum]; // 各进程的完成时间 public static int FinishTime[] = new int[MaxNum]; // 各进程的周转时间 public static int WholeTime[] = new int[MaxNum]; // 进程调度队列(存放的是各个进程的数字代号,如进程A数字代号为1) public static int order[] = new int[MaxNum]; // 各进程的带权周转时间 public static double WeightWholeTime[] = new double[MaxNum]; // 平均周转时间、平均带权周转时间 public static double AverageWT, AverageWWT; // 周转时间总和 public static int SumWT = 0; // 带权周转时间总和 public static double SumWWT = 0; // 进程是否已经结束的标志 public static boolean Finished[] = new boolean[MaxNum];