一、实验目的:
- 了解多道批处理系统的工作原理和调度算法
- 熟悉先来先服务调度算法(First Come First Served, FCFS)的实现
- 学习如何模拟多道批处理系统的调度过程
实验设备与实验环境: 计算机,Java编译系统,idea,ChatGPT 二、实验程序设计内容:
- 设计一个模拟操作系统多道批处理作业调度算法(FCFS)的程序,包括两个进程(Program)的信息输入和调度过程展示。
- 实现程序初始化方法,用于输入两个进程的延迟时间、处理时间和读写时间。
- 实现判断哪个进程先到达的方法,用于确定FCFS调度顺序。
- 实现计算CPU使用时间的方法,计算两个进程的处理时间和读写时间之和。
- 实现展示时序图的方法,展示CPU和IO的时间线,并返回总运行时间。
- 实现计算CPU利用率的方法,计算CPU使用时间与总运行时间的比值。
三、实验程序设计思路及流程图
- 创建一个 Program 类来表示进程,包含延迟时间和处理时间等属性。
- 在 Tool 类中实现初始化进程信息的方法,通过输入来初始化两个进程的信息。
- 实现判断哪个进程先到达的方法,根据延迟时间来判断先后顺序。
- 实现计算CPU使用时间的方法,将两个进程的处理时间和读写时间相加。
- 实现展示时序图的方法,按照FCFS调度顺序展示CPU和IO的时间线,并返回总运行时间。
- 实现计算CPU利用率的方法,计算CPU使用时间与总运行时间的比值,反映CPU的利用情况。
四、实验源程序及注释: package homework.os;
import java.util.Scanner;
/**
* Date:2024/2/26 9:15
* Description:模拟操作系统多道批处理作业调度算法(FCFS)
*
* @author Leon
* @version 1.0
*/
public class exm1 {
public static void main(String[] args) {
Program p1=new Program();
Program p2=new Program();
Tool.initProgram(p1,p2);
System.out.println("\n\nCPU使用时间为: "+Tool.cpuUseTime(p1,p2)+"\t " +
"CPU利用率为"+ String.format("%.2f",Tool.cpuUtilization(p1,p2)*100)+"%");
}
}
class Program{
int delay;
int operation[]=new int[3];
}
class Tool{
public static void initProgram(Program P1,Program P2){
Scanner scanner=new Scanner(System.in);
System.out.println("输入P1信息(延迟输入时间,处理时间1,读写时间,处理时间2)");
P1.delay=scanner.nextInt();
for(int i=0;i<P1.operation.length;i++){
P1.operation[i]=scanner.nextInt();
}
System.out.println("输入P2信息(延迟输入时间,处理时间1,读写时间,处理时间2)");
P2.delay=scanner.nextInt();
for(int i=0;i<P1.operation.length;i++){
P2.operation[i]=scanner.nextInt();
}
}
public static boolean isP1First(Program p1,Program p2){
return p1.delay<p2.delay;
}
public static int cpuUseTime(Program p1,Program p2){
return p1.operation[0]+p2.operation[0]+p1.operation[2]+p2.operation[2];
}
public static double showTimeTable(Program p1,Program p2){
Program tmp1,tmp2;
int operationNums=p1.operation.length;
int[] timeTable=new int[operationNums*2];
int curTime=0;
if(!isP1First(p1,p2)){
tmp1=p2;
tmp2=p1;
}else {
tmp1=p1;
tmp2=p2;
}
int i=0,j=0;
curTime+=tmp1.operation[i++];
timeTable[0]=curTime;
for(int k=1;k<operationNums;k++){
int bgTim=curTime+Math.max(tmp1.operation[i],tmp2.operation[j]);
int smTim=curTime+Math.min(tmp1.operation[i++],tmp2.operation[j++]);
timeTable[k]=bgTim;
timeTable[k+operationNums-1]=smTim;
curTime=bgTim;
}
curTime+=tmp2.operation[j];
timeTable[timeTable.length-1]=curTime;
System.out.print("===============时序图(ms)===============\n" +
"CPU : "+timeTable[0]);
for(int k=1;k<=2;k++){
System.out.print("\t "+timeTable[k]);
}
System.out.print("\t "+timeTable[timeTable.length-1]);
System.out.print("\nIO : "+" ");
for(int k=3;k<=4;k++){
System.out.print("\t "+timeTable[k]);
}
return curTime;
}
public static double cpuUtilization(Program p1,Program p2){
return Tool.cpuUseTime(p1,p2)/Tool.showTimeTable(p1,p2);
}
}
五、实验程序测试过程及解释说明 输入P1信息(延迟输入时间,处理时间1,读写时间,处理时间2) 0 60 80 20 输入P2信息(延迟输入时间,处理时间1,读写时间,处理时间2) 5 120 40 40 六、实验程序测试过程与结果分析 ===============时序图(ms)=============== CPU : 60 180 220 260 IO : 140 200 CPU使用时间为: 240 CPU利用率为92.31% Process finished with exit code 0 七、理论学习与实践能力锻炼方面的个人心得体会 通过实验,我深入理解了多道批处理系统的调度过程和先来先服务算法的原理。 实践中,我发现先来先服务调度算法可能会导致长作业等待时间过长,不利于提高系统的性能。 通过模拟多道批处理系统的调度过程,我对操作系统中进程调度的重要性有了更深刻的认识,也更加熟悉了Java编程的应用。 |