源文件下载://download.csdn.net/download/qq_40752913/12047066
一、 实验目的
通过模拟Linux优先级调度算法,加深对进程调度算法的理解
二、实验内容
优先级调度算法实现处理机调度的程序设计提示如下:
(1) 假设系统有n个进程,每个进程用一个进程控制块(PCB)来代表。进程控制块的格式如下表所示,且参数意义也相同。进程的优先数、到达时间和估计运行时间由用户程序任意设定,且优先数越低,优先级越高。调度时,总是选择优先级最高的进程运行。
进程名 |
链接指针 |
进程的到达时间 |
进程的优先级 |
估计运行时间 |
进程状态 |
(2) 为了调度方便,设计一个指针指向就绪队列的第一个到达进程。另外再设一个当前运行进程指针,指向当前正运行的进程。
(3) 处理机调度时,总是选择已经到达队列的优先级最高的进程运行。为了采用动态优先级调度,进程每运行一次,其优先级就减1。
(4) 由于本题目是模拟实验,所以对被选中的进程并不实际启动运行,而只是执行如下操作:
- 优先数加1;
- 估计运行时间减1;
- 输出当前运行进程的名字。
用这三个操作来模拟进程的一次运行。 - 进程运行一次后,应判断该进程的剩余运行时间是否为0,若不为0,且其优先级低于就绪队列的其他进程的优先级,则选择一个高优先级进程抢占CPU运行,若该进程的剩余运行时间为0,则将该进程的状态置为完成状态“C”,并撤出就绪队列。
- 若就绪队列不为空,则重复上述的步骤(4)和(5)直到所有进程都运行完为止。
- 在所设计的调度程序中,应包含显示或打印语句,以便显示或打印每次选中进程的名称及运行一次后进程的变化以及就绪队列中各进程排队情况。
三、实验原理
此实验模拟的是进程调度的优先级法。优先级法有抢占式和非抢占式两种,这里模拟的是“抢占式优先级法”。
抢占式优先级法的原理是:当前进程在运行过程中,一旦有另一个优先级更高的进程出现在就绪队列中,进程调度程序就停止当前进程的运行,强行将CPU分给那个进程。
那这里的优先级是怎么确定呢?优先级是“一定终身”还是“随机应变呢”?
这里是选择跟Linux一样的,这里采用“随机应变”的优先级,优先级有两部分组成,一部分是一开始用户指定的优先级,另一部分是根据进程等待CPU的时间,随着等待CPU越长,优先级不断提升。
四、实验设备
Linux环境下,语言使用Java,编译器用IDEA
五、实验要求
书写课程设计报告,报告中应该包含如下内容:
(1) 课程设计题目及内容
(2) 程序中使用的数据结构及主要符号说明
(3) 程序流程图和带有详细注释的源程序
(4) 执行程序名,并打印程序运行时的初值和运算结果
(5) 实验结果分析,实验收获和体会
(6) 实验的改进意见和建议。
六、实验程序
实验的类结构图为:
Main类
package com.zhengzeliang;
/**
* @author Zzl
*/
public class Main {
public static void main(String[] args) {
SchedulingThread processSchedule = new SchedulingThread();
new Thread(processSchedule).start();
}
}
SchedulingThread类
package com.zhengzeliang;
/**
* @author Zzl
*/
public class SchedulingThread implements Runnable{
/**
* @author Zzl
* @date 2019/12/16 13:13
* @description 调度管理类的实体,用于实现优先级的调度
*/
private ScheduleManagement scheduleManagement = new ScheduleManagement();
/**
* @author Zzl
* @date 2019/12/16 13:13
* @description 对将要到达的进程的管理
*/
private ReachingProcessManagement reachingProcessManagement = new ReachingProcessManagement(scheduleManagement);
@Override
public void run() {
reachingProcessManagement.initReadyToArriveProcessTable();
while (true){
System.out.print("当前时间为:" + reachingProcessManagement.getTimeCounter());
reachingProcessManagement.enterReadySequenceOrNot();
scheduleManagement.priorityScheduling();
reachingProcessManagement.addTimeCounter();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
ProcessObj类
package com.zhengzeliang;
/**
* @author Zzl
*/
public class ProcessObj {
ProcessObj(String processName, ProcessObj nextProcess, int arriveTime, int priority, int runTime, String status) {
this.processName = processName;
this.nextProcess = nextProcess;
this.arriveTime = arriveTime;
this.priority = priority;
this.runTime = runTime;
this.status = status;
}
public ProcessObj() {
}
ProcessObj(ProcessObj process) {
this.processName = process.getProcessName();
this.nextProcess = process.getNextProcess();
this.arriveTime = process.getArriveTime();
this.priority = process.getPriority();
this.runTime = process.getRunTime();
this.status = process.getStatus();
}
/**
* @author Zzl
* @date 2019/12/15 16:53
* @description 进程名
*/
private String processName;