时间片的实现过程
package com.xiangongyedaxue.OS;
import java.util.Iterator;
import java.util.LinkedList;
import javax.swing.JOptionPane;
import com.xiangongyedaxue.OS.util.RRname;
/*
* 时间片轮转算法: 1. 系统将所有进程按照先来先服务的原则进行排序, 每次调度分配给首进程,并执行一个时间片 ;
* 2.执行完时间片,如果该进程小于时间片,输出;并将该进程放入LinkedList的队首 3.
* 同时,查找执行总时间内是否有进程到达?如果有到达,执行到达进程,转至2; 4.
* 执行linkedList的首进程,如果进程服务时间小于时间片,输出;如果大于,将首进程加入到LinkedList尾,移除首进程
*/
public class RoundRobin
{
String str[] =
{
"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M",
"N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"
};// 用于标记进程号码
LinkedList<RRname> list = new LinkedList<RRname>();// 用来存放未一次执行完毕的进程
/*
* 将String转化为Int 目的: 将输入的变量转换成字符数组
*/
public int[] StringtoInt(String string[])
{
int a[] = null;
a = new int[string.length];
for (int i = 0; i < string.length; i++)
{
int temp = Integer.parseInt(string[i]);
a[i] = (int) temp;
}
return a;
}
public void init()
{
int pronum;
int timepic;// 分别用于记录进程进入数目和时间片大小
RRname rr[] = null; // 用于为进程创建数组
int Prointime[] = null;
int ProSertime[] = null;
pronum = Integer.parseInt(JOptionPane.showInputDialog("请输入进程数目"));
timepic = Integer.parseInt(JOptionPane.showInputDialog("请输入时间片"));
String proIntime = JOptionPane
.showInputDialog("分别输入进程的进入时间:格式为:(XX,XX,XX)");
String proServicetime = JOptionPane
.showInputDialog("分别输入进程的服务时间:格式为:(XX,XX,XX)");
rr = new RRname[pronum];
System.out.println(rr.length);
for (int i = 0; i < pronum; i++)
{
rr[i] = new RRname();
String prointime[] = proIntime.split(",");
String proservicetime[] = proServicetime.split(",");// 以","为分隔条件
Prointime = new int[prointime.length];
ProSertime = new int[proservicetime.length];
Prointime = StringtoInt(prointime);// 进程进入时间数组
ProSertime = StringtoInt(proservicetime);// 进程服务时间数组
rr[i].setInname(Prointime[i]);
rr[i].setProTime(ProSertime[i]);
rr[i].setProname(str[i]);
}
for (int j = 0; j < pronum; j++)// 辅助显示功能--以上代码只是用于实现了将进程初始条件成功赋值
{
System.out.println(rr[j].toString());
}
Linkpro(rr, timepic, pronum);
System.out.println("时间片" + timepic);
float evequan = 0;
float eveRound = 0;
for (int j = 0; j < pronum; j++)// 辅助显示功能--以上代码只是用于实现了将进程初始条件成功完成后的结果
{
evequan += rr[j].getRoundTimer() / rr[j].getKeepservice();
eveRound += rr[j].getRoundTimer();
System.out.println(rr[j].toString1());
}
System.out.println("平均周转时间为" + eveRound / pronum + "带权周转时间为:" + evequan
/ pronum);
}
/*
* 目的:实现连接的作用以及进行必要的处理: 输入参数:RRname[]:各个进程的初始化条件 timepic:时间片 pronum:进程数目
*/
public void Linkpro(RRname rname[], int timepic, int pronum)
{
int count = 0;
int i = 0;
for (int j = 0; j < rname.length; j++)// 用于保存服务时间
{
rname[j].setKeepservice(rname[j].getProTime());
}
excPro(rname, i, timepic, count, pronum);
}
/*
* 目的:将所有进程依照进入时间进行排序 输入变量:RRname[]:各个进程的初始状态
*/
public void find_Pro1(RRname fl[])// OK
{
RRname na = null;
na = new RRname();
int temp = -1;
for (int i = 0; i < fl.length; i++)
{
for (int j = i + 1; j < fl.length; j++)
{
if (fl[i].getInname() > fl[j].getInname())
{
na = fl[i];
fl[i] = fl[j];
fl[j] = na;
temp = j;
}
}
}
}
/*
* 目的:
*
*/
public void excPro(RRname r[], int i, int timepic, int count, int pronum)
{
int coun = 0;// 计数器
find_Pro1(r); // 按进入时间大小排序
for (int j = 0; j < r.length; j++)
{
coun = exqTimepic(r[j], timepic, coun);
if (r[j].getProTime() <= 0)// OK----进程小于时间片
{
// System.out.println(r[j].toString());
// System.out.println(j + "****@@@" + coun);
}
else//进程大于时间片
{
list.addLast(r[j]);// 将执行完的进程放入队列尾部
// System.out.println("size:"+list.size());
if (list.size() > 1)//排除linkedList只有一个的情况
{ // 队列中存在进程
coun = exqTimepic(list.getFirst(), timepic, coun);//找到首进程 ,执行
if (list.getFirst().getProTime() == -1) //执行完
{// 进程结束
// System.out.println(list.getFirst().toString());
list.remove(list.getFirst());//从队列中移除
}
else
{
// System.out.println(list.getFirst().toString());
// System.out.println("(*******)");
RRname na = list.getFirst();
list.remove();
list.addLast(na);//将进程放入队尾
}
continue;
}
continue;
}
}//
// System.out.println("(*******)"+list.size());
while (list.size() > 0)//队列中还有进程,执行完毕
{
coun = exqTimepic(list.getFirst(), timepic, coun);
if (list.getFirst().getProTime() == -1)
{// 进程结束
// System.out.println(list.getFirst().toString());
list.remove(list.getFirst());
}
else
{
RRname na = list.getFirst();
list.remove();
list.addLast(na);
}
continue;
}
}
/*
* 將所有进程按照时间片执行 输入参数:RRname:找到的进程 timepic:时间片 count:未完成此进程的总时间
* 输出参数:完成此进程后的总时间
*/
public int exqTimepic(RRname proser, int timepic, int count)
{
if (timepic >= proser.getProTime())// 在时间片大于或等于进程的进入时间的同时并且时间片大于或等于该进程的服务时间
{
if (proser.getInname() > count)// 说明可能是第一次到达进程,也可能是进入时间太大
// count将被重新赋值
{
proser.setResult(proser.getProTime() + proser.getInname());
count = proser.getInname() + proser.getProTime();// 说明count已经变为新值
}
else
{
proser.setResult(proser.getProTime() + count);
count = count + proser.getProTime();// 说明count已经变为新值
}
proser.setProTime(-1);// 标记进程已经被访问
}
else
{// 将会在访问
proser.setResult(count + timepic);
proser.setProTime(proser.getProTime() - timepic);
count = count + timepic;
}
return count;
}
}
想请前辈们指点下,此代码在格式上和思路上存在什么不足?请大侠指点
分享到:
相关推荐
短作业优先进程调度算法是一种在批处理系统中常用的调度策略,其目的是为了提高系统的吞吐量和响应速度,通过优先选择运行时间较短的任务进行执行,从而减少等待时间较长的进程数量。这种算法特别适用于具有大量短...
提供的"先来先服务FCFS和短作业优先SJF进程调度算法(软件二班-徐铭-1011115046-2012-10-01).doc"文档可能包含了具体的算法实现细节和分析结果。"Scheduling.java"很可能是Java源代码文件,实现了这两种调度算法。而...
本文将深入探讨Java环境下实现的四种进程调度算法:先来先服务(FCFS)、短作业优先(SJF)、时间片轮转(RR)以及高响应比优先(HRN)。这些算法在多任务环境中用于决定哪个进程应该获得CPU的执行权,以达到资源分配的公平...
基于 Java 语言,设计了一种进程调度算法模拟程序,实现了短作业优先和先来先服务的调度策略。本程序模拟了操作系统中的进程调度过程,包括进程的创建、执行和调度等过程。 知识点一:进程调度算法 进程调度算法是...
本次试验是使用程序来模拟操作系统中进程调度的三种不同的调度策略,分别为最短作业有限、时间片轮转、最高响应比。 模拟的情况下,进程数为8,进程所需执行时间为随机产生的整数,单位为1S,默认进程同时到达。 ...
Java模拟最短作业优先、时间片轮转、最高响应比和先来先服务进程调度算法 rar中有四种算法和俩个对进程用时和周转时间制图的java源代码,另外有jcommon-1.0.23.jar和jfreechart-1.0.19.jar俩个制图包
在操作系统设计中,进程调度和作业调度是两个关键的组件,它们决定了系统资源如何被有效且公平地分配给各个程序。本项目通过C语言实现了这些调度算法,旨在帮助理解其工作原理并提供实践操作的机会。 首先,我们...
课程设计大作业C++模拟操作系统进程...要求采用先来先服务FCFS和短作业优先SJF分别调度进程运行,计算每个进程的周转时间,带权周转时间和等待时间,并且计算所有进程的平均周转时间,带权平均周转时间和平均等待时间。
本文档主要介绍了操作系统中时间片轮转RR进程调度算法的Java实现。该算法用于模拟进程的时间片轮转调度过程,计算每个进程的完成时间、周转时间和带权周转时间,并统计所有进程的平均周转时间和平均带权周转时间。 ...
进程管理和进程调度算法模拟 ...通过动态优先数和时间片轮转法,我们可以实现一个基本的进程调度算法。该实验可以帮助学生更好地理解操作系统的基本概念和技术,并为以后深入学习操作系统提供了基础。
操作系统实验一 先来先服务FCFS和短作业优先SJF进程调度算法(内含源代码和详细实验报告),详细介绍:http://blog.csdn.net/xunciy/article/details/79239096
在进程控制、请求分页存储器管理、设备管理基础上 实现按先来先服务 FCFS 、短作业优先 SJF 以及时间片 轮转算法调度进程的模拟过程 。 内容 1.在第 1 3 部分基础上扩展; 2.支持 FCFS 、短 作业优先以及时间片调度...
操作系统调度算法是计算机科学中的核心概念,主要用于管理多道程序环境下CPU的执行顺序,以达到高效、公平地分配计算资源。在本Java源代码中,涵盖了三种常见的调度算法:先来先服务(First-Come, First-Served, ...
2. 短作业优先(SJF,Shortest Job First):优先选择运行时间最短的进程。分为非抢占式和抢占式两种,抢占式允许在运行过程中发现更短进程时暂停当前进程。 3. 时间片轮转(RR,Round-Robin):将所有进程按固定...
操作系统编程进程或作业先来先服务、高优先权、按时间片轮转调度算法实验报告 本实验报告旨在通过编写程序实现进程或作业先来先服务、高优先权、按时间片轮转调度算法,了解 Windows2000/XP 中进程(线程)的调度...
每种算法都有其独特的特性和适用场景,理解并能够实现这些算法对于深入理解操作系统的作业调度至关重要。 1. **先进先入(First In First Out, FIFO)** FIFO是最简单的调度策略,按照作业到达的顺序依次执行。...
操作系统课程设计大作业C++进程调度算法的模拟实现源码,实现了 动态优先级、先来先服务、时间片轮转 三个算法 安装教程 下载到本地,然后直接用VS打开运行即可 操作系统课程设计大作业C++进程调度算法的模拟实现...
在Windows操作系统中,程序员可以通过使用VC、VB、Java或C等编程语言,并结合WIN32 API函数,来实现对进程或作业的调度策略。本节我们将深入探讨“先来先服务”(First-Come, First-Served, FCFS)、“高优先权”...