• 大小: 2KB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2021-06-15
  • 语言: 其他
  • 标签: 进程调度  

资源简介

实验内容: 编写一个单处理机下的进程调度程序,模拟操作系统对进程的调度。 要求: 能够创建指定数量的进程,每个进程由一个进程控制块表示。 实现先来先服务调度算法:进程到达时间可由进程创建时间表示。 实现短作业优先调度算法:可指定进程要求的运行时间。(说明:对不可剥夺的短作业优先算法,当作业运行时间相等时,优先调度进程号小的进程执行;对可剥夺式的短作业优先算法,即选最短剩余时间的进程进行运行,在剩余时间相同的情况下,选择到达时间早的进程进行运行) 实现时间片轮转调度算法:可指定生成时间片大小。(说明:新进程到来时插入到就绪队列的队尾,当进程P运行完一个时间片时,若同时有进程Q到达,则先在就绪队列队尾插入新到达的进程Q,之后再插入进程P) 实现动态优先级调度算法:可指定进程的初始优先级(优先级与优先数成反比,优先级最高为0),优先级改变遵循下列原则:进程在就绪队列中每停留一个时间片,优先级加1,进程每运行一个时间片,优先级减3。(说明:本算法在优先级相同的情况下,选择到达时间早的进程进行运行) 测试用例格式如下: 输入:调度算法    进程号/到达时间/运行时间/优先级/时间片 输出:调度顺序/进程号/开始运行时间/结束运行时间/优先级 其中调度算法选项为:1----先来先服务,2----短作业优先,3----最短剩余时间优先,4----时间片轮转,5----动态优先级

资源截图

代码片段和文件信息

import java.util.Random;
import java.util.Scanner;

public class MultiProcess{
//主函数
public static void main(String[] arg){
Process[] Pro;
int ProcessNum;
Random rand=new Random();
Scanner in = new Scanner(System.in);
//初始化全部进程实体
System.out.println(“请输入要生成的进程数目,0为随机产生“);
int choose = in.nextInt();
if(choose == 0)
ProcessNum = rand.nextInt(7)+3;
else
ProcessNum = choose;
Pro = new Process[ProcessNum];
Process[] Pro1 = new Process[ProcessNum];
System.out.println(“创建了“+ProcessNum+“个进程“);
System.out.println(“为每一个进程赋值:1为手动0为随机“);
choose = in.nextInt();
if(choose == 0){
for(int i = 0;i int a = rand.nextInt(20);
int b = rand.nextInt(9)+1;
int c = rand.nextInt(4)+1;
Pro[i]=new Process(i a b c);
Pro1[i]=new Process(i a b c);
System.out.println(“已创建进程ID“+Pro[i].GetID()+“:到达时间为:“+Pro[i].GetArriveTime()+“:运行时间为:“+Pro[i].GetRunTime()+“:优先级为:“+Pro[i].GetPriority());
}
}
else{
for(int i = 0;i int m =i+1;
System.out.println(“请输入进程“+m+“的到达时间[020]、运行时间[110]、优先级[15]“);
int a = in.nextInt();
int b = in.nextInt();
int c = in.nextInt();
if(a<0||a>20||b<1||b>10||c<1||c>5){
System.out.println(“输入错误请重新输入“);
i--;
continue;
}
else{
Pro[i]=new Process(i a b c);
Pro1[i]=new Process(i a b c);
}
}
for(int i = 0;i System.out.println(“已创建进程ID“+Pro[i].GetID()+“:到达时间为:“+Pro[i].GetArriveTime()+“:运行时间为:“+Pro[i].GetRunTime()+“:优先级为:“+Pro[i].GetPriority());
}
//先来先服务调度
FCFS(Pro1ProcessNum);
//短作业优先调度
copy(ProPro1ProcessNum);
SJF(Pro1ProcessNum);
//时间片轮转调度
copy(ProPro1ProcessNum);
RR(Pro1ProcessNum);
//动态优先级调度
copy(ProPro1ProcessNum);
DP(Pro1ProcessNum);
}

//先来先服务调度对进程链按加入时间进行排序后依次运行
public static void FCFS(Process[] Proint ProcessNum){
System.out.println();
System.out.println(“先来先服务调度“);
System.out.println(“-------------------------------------------------------“);
for(int i = ProcessNum-1;i>0;i--){
for(int j=0;j if(Pro[j].GetArriveTime()>Pro[j+1].GetArriveTime())
change(Projj+1);
}
if(Pro[0].GetArriveTime()>0)
System.out.println(“系统等待等待时间为0--“+Pro[0].GetArriveTime());
System.out.println(“当前运行进程为ID“+Pro[0].GetID()+“运行时间为“+Pro[0].GetArriveTime()+“--“+Pro[0].GetFinishTime());
for(int i = 1;i < ProcessNum;i++){
if(Pro[i].GetArriveTime()<=Pro[i-1].GetFinishTime())
Pro[i].SetArriveTime(Pro[i-1].GetFinishTime());
else
System.out.println(“系统等待等待时间为“+Pro[i-1].GetFinishTime()+“--“+Pro[i].GetArriveTime());
Pro[i].SetFinishTime(Pro[i].GetArriveTime()+Pro[i].GetRunTime());
System.out.println(“当前运行进程为ID“+Pro[i].GetID()+“运行时间为“+Pro[i].GetArriveTime()+“--“+Pro[i].GetFinishTime());
}
}
//短作业优先调度对进程链按作业时间长短进行排序后依次运行
public static void SJF(Process[] Proint ProcessNum){
System.out.println();

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件      11041  2011-10-28 11:50  MultiProcess\MultiProcess.java

     目录          0  2015-12-07 12:50  MultiProcess

----------- ---------  ---------- -----  ----

                11041                    2


评论

共有 条评论