赞
踩
《操作系统》实验指导书
实验一 进程调度实验
一、实验的目的与要求
在多道程序或多任务系统中,系统同时处于就绪态的进程有若干个。也就是说能运行的进程数远远大于处理机个数。为了使系统中的各个进程能有条不紊的运行,必须选择某种调度策略,以选择一进程占用处理机。要求学生设计一个模拟单处理机调度的方法,以巩固和加深处理机调度的概念。
二、实验原理
处理机管理是操作系统中非常重要的部分。为深入理解进程管理部分的功能,设计几个调度算法,模拟实现处理机的调度。
三、实验仪器
一台高性能的个人计算机,计算机程序设计语言集成环境,最好能上Internet。
四、实验内容与步骤
1、实验内容
设计一个按时间片轮转法调度的算法
2、实验步骤
(1)假设系统有5个进程,每个进程用一个进程控制块PCB来代表。PCB的格式如图1所示。
其中,进程名即进程标识。
链接指针:指出下一个到达进程的进程控制块首地址。按照进程到达的顺序排队。系统设置一个队头和队尾指针分别指向第一个和最后一个进程。新生成的进程放队尾。
进 程 名 |
链接指针 |
到达时间 |
估计运行时间 |
进程状态 |
(2)为每个进程任意确定一个要求运行时间和到达时间。
(3)按照进程到达的先后顺序排成一个循环队列。在设一个队首指针指向第一个到达进程的首址。
(4)执行处理机调度时,开始选择队首的第一个进程运行。另外再设一个当前运行进程指针,指向当前正运行的进程。
(5)由于本实验是模拟实验,所以对选中进程并不实际启动运行,而只是执行: 图1进程控制块
(a)估计运行时间减1;
(b)输出当前运行进程的名字。
用这两个操作来模拟进程的一次运行。
(6) 进程运行一次后,以后的调度则将当前指针依次下移一个位置,指向下一个进程,即调整当前运行指针指向该进程的链接指针所指进程,以指示应运行进程。同时还应判断该进程的剩余运行时间是否为零。若不为零,则等待下一轮的运行;若该进程的剩余运行时间为零,则将该进程的状态置为完成态C,并退出循环队列。
(7)若就绪队列不空,则重复上述的(5)和(6)步骤直到所有的进程都运行完为止。
(8)在所设计的调度程序中,应包含显示或打印语句。以便显示或打印每次选中进程的名称及运行一次后队列的变化情况。
五、注意事项
(1)给出所选实验题目。
(2)给出程序中源程序名和执行程序名。
(3)给出程序中使用的数据结构及符号说明。
(4)给出程序流程图和源程序,源程序中要附有详细的注释。
(5)打印程序运行时的初值和运行结果,要求如下:
(1)各进程控制块的初始状态;
(2)选中运行进程的名、运行后各进程控制块状态以及每次调度时,就绪队列的进程排列顺序。
(6)总结收获体会及对该题解的改进意见和见解
六、思考题
2、设计一个按优先级调度的算法。
七、附参考代码
先来先服务
package operate;
import java.util.PriorityQueue;
import java.util.Queue;
import java.util.Scanner;
/**
* 先来先服务 算法 FCFS
* 非抢占式
* @author ymj
* @Date: 2019/12/15 20:22
*/
public class FCFS {
static Scanner cin = new Scanner(System.in);
/** 进程控制块 */
static class PCB implements Comparable<PCB>{
int id; // 进程id
int arriveTime; // 到达时间
int runTime; // 运行时间
int turnAroundTime; // 周转时间
int waitTime; // 等待时间
PCB(int id, int arriveTime, int runTime){
this.id = id;
this.arriveTime = arriveTime;
this.runTime = runTime;
}
@Override
public int compareTo(PCB o) { // 按照 到达时间 进入就绪队列
return this.arriveTime - o.arriveTime;
}
}
static PCB[] pcbs;
/** 就绪队列 */
static Queue<PCB> queue = new PriorityQueue<>();
/** 初始化 PCB 信息 */
static void initPCB(){
System.out.print("输入进程数: ");
int num = cin.nextInt();
pcbs = new PCB[num+1];
System.out.println("输入到达时间, 运行时间");
for(int i = 1; i <= num; i++) {
System.out.print("进程" + i + ":");
pcbs[i] = new PCB(i, cin.nextInt(), cin.nextInt());
queue.offer(pcbs[i]);
}
}
/** 处理及运行 */
static void run() {
int currentTime = 0; // 当前时间
if(!queue.isEmpty()){
currentTime = queue.peek().arriveTime;
}
while (true) {
if(queue.isEmpty()){
System.out.println("当前所有进程运行结束");
break;
}else{ // 进程进入 处理机运行
PCB runPCB = queue.poll(); // 1. 出就绪队列
System.out.println("当前时间:" + currentTime);
System.out.println("进程" + runPCB.id + "开始运行------");
runPCB.waitTime = currentTime - runPCB.arriveTime; // 计算等待时间
currentTime += runPCB.runTime; // 2. 进入处理机运行
System.out.println("当前时间:" + currentTime);
System.out.println("进程" + runPCB.id + "运行结束------");
runPCB.turnAroundTime = currentTime - runPCB.arriveTime; // 计算周转时间
}
}
}
public static void main(String[] args) {
initPCB();
System.out.println("-----处理机开始运行-----");
run();
System.out.println("-----处理机运行结束-----");
showTurnAroundTime();
}
// 周转时间
private static void showTurnAroundTime() {
double averageT = 0;
double averageWTAT = 0;
double averageWT = 0;
System.out.println("进程\t 周转时间\t 带权周转时间\t 等待时间\t");
for (i
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。