实验一 模拟处理机调度的时间片轮转法
一、实验目的:用c/c++模拟时间片轮转法
二、实验内容:输入进程的个数,每个进程的名称及每个进程需要工作的时间,本实验中假定对CPU时间片设置为一个时间单位,首先输入进程的个数,然后输入进程名称,最后输入进程所需要的处理时间。然后通过模拟程序,显示以下信息:
1)处理机对进程的调度过。
2)计算每个进程的周转时间(假设N个进程在0时刻几乎同时达到,处理机对进程的调度顺序和输入进程的顺序一致)。
三、示例:
若输入:
3
A 2
B 3
C 4
进程名称 每个进程需要工作的时间
显示:
CPU时刻:1
正在运行的进程:A
Name run req status
A 1 2 R R:就绪 E: 结束
B 0 3 R
C 0 4 R
CPU时刻:2
正在运行的进程:B
Name run req status
A 1 2 R
B 1 3 R
C 0 4 R
CPU时刻:3
正在运行的进程:C
Name run req status
A 1 2 R R:就绪 E: 结束
B 1 3 R
C 1 4 R
CPU时刻:4
正在运行的进程:A
Name run req status
A 2 2 E
B 1 3 R
C 1 4 R
CPU时刻:5
正在运行的进程:B
Name run req status
B 2 3 R
C 1 4 R
CPU时刻:6
正在运行的进程:C
Name run req status
B 2 3 R
C 2 4 R
CPU时刻:7
正在运行的进程:B
Name run req status
B 3 3 E
C 2 4 R
CPU时刻:8
正在运行的进程:C
Name run req status
C 3 4 R
CPU时刻:9
正在运行的进程:C
Name run req status
C 4 4 E
A的周转时间:4ms
B的周转时间:7ms
C的周转时间:9ms
四、实验提示
1)采用什么数据结构用来存放每个进程的信息?
每个进程的信息包括:进程的名称和进程需要工作的时间
2)怎么样控制进程轮转的循环和结束?
解决思路:
首先对进行遍历,每次遍历CPU时间+1,然后当前遍历到的时间片运行时间+1
然后如果当前时间片的运行时间等于所需要的运行时间,那么状态就从R->E结束
随后将该时间片进行弹出集合,同时记录弹出的时间片名和当前CPU时间(即为当前时间片的周转时间)
package com.eternally.test;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
class Process {
public String name;// 进程名
public int run;// 已经运行的时间
public Process(String name, int run, int needtime) {
this.name = name;
this.run = run;
this.needtime = needtime;
}
public int needtime;// 所需要的时间
}
public class Test1 {
public static void main(String[] args) {
List<String> listname=new ArrayList<>();//记录淘汰的进程名
List<Integer> listtime=new ArrayList<>();//记录淘汰的进程的淘汰时间
int cputime = 0;// CPU运行时间
Scanner in = new Scanner(System.in);
int n = in.nextInt();
String name;
int ttime;
int needtime;
List<Process> list = new ArrayList<>();
for (int i = 0; i < n; i++) {
name = in.next();
needtime = in.nextInt();
Process pcb = new Process(name, 0, needtime);// 运行时间初始化为0
list.add(pcb);
}
for (int i = 0; i < list.size(); i++) {
cputime++;
System.out.println("CPU时刻:" + cputime);
System.out.println("正在运行的进程:"+list.get(i).name);
System.out.println("Name run req status");
list.get(i).run++;//当前进程的运行时间+1
for(int j = 0;j <list.size();j ++) {
System.out.print(list.get(j).name+" "+list.get(j).run+" "+list.get(j).needtime+" ");
System.out.println(list.get(j).run==list.get(j).needtime?"E":"R");
}
if(list.get(i).needtime==list.get(i).run) {
listtime.add(cputime);
listname.add(list.get(i).name);
list.remove(i);
i--;
}else {
if (i == (list.size() - 1)) {
i = -1;
}
}
}
for(int i =0;i < n;i ++) {
System.out.println(listname.get(i)+"的周转时间:"+listtime.get(i)+"ms");
}
}
}