西安工业大学操作系统实验报告

  • 格式:docx
  • 大小:118.66 KB
  • 文档页数:17

XI`AN TECHNOLOGICAL UNIVERSITY

实验报告

实验课程名称 操作系统

专 业: 软件工程

班 级:

姓 名:

号:

实验学时

指导教师:

成 绩:

2020 年 12 月 4 日

西安工业大学实验报告

专业 软件工程 班级 姓名 学号

实验课程 操作系统 指导教师 实验日期 同实验者

实验项目 实验一 进程调度算法

实验设备及器材 计算机 win10系统 IDEA

一、实验目的

1. 利用高级语言实现三种不同的进程调度算法:

先来先服务算法、时间片轮转调度算法和优先级调度算法。

2. 通过实验理解有关进程控制块、进程队列等的概念。

二、实验原理

各调度算法思想:

1. 先来先服务算法(FCFS)

FCFS是最简单的调度算法,该算法既可用于作业调度,也可用于进程调度。当在作业调度中采用该算法时,系统将按照作业到达的先后次序来进行调度,或者说它是优先考虑在系统中等待时间最长的作业,而不管该作业所需执行时间的长短,从后备作业队列中选择几个最先进入该队列的作业,将它们调入内存,为它们分配资源和创建进程,然后把它放入就绪队列。

当在进程调度中采用FCFS算法时,每次调度是从就绪的进程队列中选择一个最先进入该队列的进程,为之分配处理机,使之投入运行

2. 时间片轮转调度算法

用于分时系统中的进程调度。每次调度时,总是选择就绪队列的队首进程,让其在CPU上运行一个系统预先设置好的时间片。一个时间片内没有完成运行的进程,返回到绪队列末尾重新排队,等待下一次调度。

3.

优先级调度算法

非抢占式优先权调度算法

系统一旦把处理机分配给优先权最高的进程后,便一直执行下去,至完成。

抢占式优先权调度算法

只要系统中出现一个新的就绪进程,就进行优先权比较 。若出现优先权更高的进程,则立即停止当前执行,并将处理机分配给新到的优先权最高的进程。

三、实验步骤、数据记录及处理

1. 算法流程

程序流程图

菜单

用户输入进程信息

选择使用的算法

SJF FCFS RR

四、总结与体会

时间片轮转调度算法(RR):给每个进程固定的执行时间,根据进程到达的先后顺序让进程在单位时间片内执行,执行完成后便调度下一个进程执行,时间片轮转调度不考虑进程等待时间和执行时间,属于抢占式调度。优点是兼顾长短作业;缺点是平均等待时间较长,上下文切换较费时。适用于分时系统。

先来先服务调度算法(FCFS):根据进程到达的先后顺序执行进程,不考虑等待时间和执行时间,会产生饥饿现象。属于非抢占式调度,优点是公平,实现简单;缺点是不利于短作业。

优先级调度算法(HPF):在进程等待队列中选择优先级最高的来执行。

高响应比优先调度算法:根据“响应比=(进程执行时间+进程等待时间)/ 进程执行时间”这个公式得到的响应比来进行调度。高响应比优先算法在等待时间相同的情况下,作业执行的时间越短,响应比越高,满足段任务优先,同时响应比会随着等待时间增加而变大,优先级会提高,能够避免饥饿现象。优点是兼顾长短作业,缺点是计算响应比开销大,适用于批处理系统。

通过这次实验,每个进程可有三个状态,并假设初始状态为就绪状态。为了便于处理,程序中的某进程运行时间以时间片为单位计算。各进程的优先数或轮转时间数以及进程需运行的时间片数的初始值均由用户给定。在优先数算法中,进程每执行一次,优先数减3,CPU时间片数加1,进程还需要的时间片数减1。在轮转算法中,采用固定时间片(即:每执行一次进程,该进程的执行时间片数为已执行了2个单位),这时,CPU时间片数加2,进程还需要的时间片数减2,并排列到就绪队列的队尾上。 对于遇到优先数一致的情况,采用FIFO策略解决。 得出结果

通过这次实验,对进程调度有深入的了解,在实验过程中遇到了很多问题,但是通过和同学请教,以及在网上查找有关资料,最终完成了本次实验要求。

附录:源代码

1.JCB.java

package Process;

public class JCB {

String name;//进程名

int arriveTime;//到达时间

int serveTime;//服务时间

int beginTime;//开始时间

int finshTime;//结束时间

int roundTime;//周转时间

double aveRoundTime;//带权周转时间

double clock=0;//在时间轮转调度算法中,记录该进程真实服务时间已经用时的时长

int waitTime;//记录每个进程到达后的等待时间,只用于最高响应比优先调度算法中

boolean firstTimeTag=false;//在RR算法中标识开始时间是否第一次计算

public JCB(String name, int arriveTime, int serveTime,double priority) {

super();

= name;

this.arriveTime = arriveTime;

this.serveTime = serveTime;

this.waitTime=0;

}

public String toString() {

String info=new String("进程名:P"+);

return info;

}

}

2.processMenu.java

package Process;

import java.util.ArrayList;

import java.util.Collections;

import parator;

import java.util.LinkedList;

public class processMenu {

ArrayList jcb;// 存放所有进程

LinkedList link;// 存放已经进入队列的进程

ArrayList new_jcb;// 存放按指定调度算法排序后的进程

JCB nowProess;// 当前应执行进程

public void init() {//初始化

jcb = new ArrayList();

link = new LinkedList();

new_jcb = new ArrayList();

JCB p1 = new JCB("1", 0, 4,3);

JCB p2 = new JCB("2", 1, 3,2);

JCB p3 = new JCB("3", 2, 5,3);

JCB p4 = new JCB("4", 3, 2,1);

JCB p5 = new JCB("5", 4, 4,5);

jcb.add(p1);jcb.add(p2);jcb.add(p3);jcb.add(p4);jcb.add(p5);

//先将jcb排序,便于下面的算法实现,就不需要再定义一个标识进程是否已到达的

boolean,即无需每次都从头开始扫描jcb容器,

//而是用一个K记录下当前已经扫描到的位置,一次遍历即可,提高了算法效率。

Collections.sort(jcb, new compareAt_St());

}

public void FCFS(){//先来先服务算法

ProcessQueue pq=new ProcessQueue();//调用内部类

pq.EnqueueLast();//让最先到达的进程先入队

System.out.println("*****************************************************");

while(!link.isEmpty()) {//while(new_jcb.size()!=jcb.size())

pq.DisplayQueue();//打印当前队列中的进程

pq.Dequeue();//出队,一次一个

pq.EnqueueLast();//已到达的进程入队

}

}

public void SJF() {// 短作业优先算法

ProcessQueue pq=new ProcessQueue();

pq.EnqueueLast();

System.out.println("*****************************************************");

while(!link.isEmpty()) {

pq.DisplayQueue();//打印当前队列中的进程

pq.Dequeue();//出队,一次一个

pq.EnqueueLast();//已到达的进程入队

Collections.sort(link, new compareSt());//队列中的进程还需按服务时间长度进行排序

}

}

public void RR() {//时间片轮转调度算法

ProcessQueue pq=new ProcessQueue();

pq.EnqueueLast();

System.out.println("*****************************************************");

while(!link.isEmpty()) {

pq.DisplayQueue();//打印当前队列中的进程

pq.Dequeue(1);//出队,一次一个,因为上一轮出的得让刚到达的进程先进队列,所以没办法,进队操作只能也放在这个函数里了

}