Java实现操作系统实验之磁盘调度
时间:2022-07-23
本文章向大家介绍Java实现操作系统实验之磁盘调度,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
这一版的磁盘调度,作者只分析了磁盘通道号,之后作者会加入对最晚完成时间的分析。 首先理解一下,什么是磁盘调度,磁盘调度的意思是,所有的进程都是在磁盘中得某个同道号中享受资源的,那么就会存在一个问题,我们是按什么顺序来执行这些进程呢,
一种是按照最晚完成时间的前后来安排,这种可以使得任务能够顺序的执行。但是任务完成的时间会大大的增加。
有一种就是按照磁盘的通道号的大小来操作,这样的话,能够更快速的完成任务,但是可能其中有些进程会因为超过最晚完成时间而导致进程的失效。
还有一种就是两种都比较兼顾的算法就是,电梯调度算法,这种算法既考虑到了磁盘通道号,也考虑到了最晚完成时间,这种算法首先是按照最晚完成时间进行排序,排序完了之后,再将最晚完成时间进行划分区间,比如说在时间区间内,有几个进程都可以顺利的完成,那样的话,在这种基础上,就可再对这几个进程进行磁盘通道号进行排序,这样的话又能在规定的时间内完成,又能够保证完成的时间尽量少。所以非常适合实现。
这里作者先做了电梯调度算法的一部分,源代码中会详细讲解。 下面贴源代码 第一个是纯粹是通过机器自动选择操作的方式
import java.util.Comparator;
import java.util.PriorityQueue;
import java.util.Queue;
import java.util.Random;
import java.util.Scanner;
public class 磁盘调度 {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
Random ran=new Random();
System.out.println("输入随机产生的进程数的范围");//初始化
System.out.print("最小是:");
int n=sc.nextInt();
System.out.print("最大是:");
int m=sc.nextInt();
int n1=ran.nextInt(m-n+1)+n;
System.out.println("输入磁盘号的范围");
System.out.print("最小是:");
int nn=sc.nextInt();
System.out.print("最大是:");
int mm=sc.nextInt();
Queue<node>queue=new PriorityQueue<node>(compare);
node []node1=new node[n1];
for(int i=0;i<n1;i++)
{
node1[i]=new node();
node1[i].name=i+1;
node1[i].number=ran.nextInt(mm-nn+1)+nn;
queue.add(node1[i]);
}
System.out.println("初始化已经完成!!");
int length=queue.size();
double count=ran.nextDouble();
if(count<0.5)//磁盘调度
{
length--;
System.out.println("进行磁盘调度操作!!");
node node2=queue.poll();
System.out.println(node2.name+"--"+node2.number+"已经执行结束!!");
}
else //压入新的进程
{
length++;
System.out.println("进行压入新的进程操作!!");
node node2=new node();
System.out.println("输入压入的进程的进程号,类型为int类型");
node2.name=sc.nextInt();
System.out.println("输入压入的进程的磁盘通道号,注意范围是"+nn+"----"+mm);
node2.number=sc.nextInt();
queue.add(node2);
System.out.println("已经压入");
}
System.out.println("是否继续,输入Y或者N");
String str=sc.next();
while(!str.equals("Y")&&!str.equals("N"))
{
System.out.println("你输入的操作不存在,请重新输入!!");
str=sc.next();
}
while(str.equals("Y")&&length>0)
{
count=ran.nextDouble();
if(count<0.5)//进行磁盘调度
{
length--;
System.out.println("进行磁盘调度操作!!");
node node2=queue.poll();
System.out.println(node2.name+"--"+node2.number+"已经执行结束!!");
}
else//压入新的进程
{
length++;
System.out.println("进行压入新的进程操作!!");
node node2=new node();
System.out.println("输入压入的进程的进程号,类型为int类型");
node2.name=sc.nextInt();
System.out.println("输入压入的进程的磁盘通道号,注意范围是"+nn+"----"+mm);
node2.number=sc.nextInt();
queue.add(node2);
System.out.println("已经压入");
}
System.out.println("是否继续,输入Y或者N");
str=sc.next();
while(!str.equals("Y")&&!str.equals("N"))
{
System.out.println("你输入的操作不存在,请重新输入!!");
str=sc.next();
}
}
if(length==0)
{
System.out.println("进程已经全部执行完毕!!!");
}
}
static Comparator<node>compare=new Comparator<node>() {
@Override
public int compare(node o1, node o2) {
// TODO Auto-generated method stub
return o1.number-o2.number;
}
};
static class node
{
int name;//进程名
//int limittime;//最晚完成时间
int number;//磁道通道号
public node() {
// TODO Auto-generated constructor stub
}
}
}
第二个是通过人自己选择操作的方式
import java.util.Comparator;
import java.util.PriorityQueue;
import java.util.Queue;
import java.util.Random;
import java.util.Scanner;
public class 磁盘调度第二版 {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
Random ran=new Random();
System.out.println("输入随机产生的进程数的范围");//初始化
System.out.print("最小是:");
int n=sc.nextInt();
System.out.print("最大是:");
int m=sc.nextInt();
int n1=ran.nextInt(m-n+1)+n;
System.out.println("输入磁盘号的范围");
System.out.print("最小是:");
int nn=sc.nextInt();
System.out.print("最大是:");
int mm=sc.nextInt();
Queue<node>queue=new PriorityQueue<node>(compare);
node []node1=new node[n1];
for(int i=0;i<n1;i++)
{
node1[i]=new node();
node1[i].name=i+1;
node1[i].number=ran.nextInt(mm-nn+1)+nn;
queue.add(node1[i]);
}
System.out.println("初始化已经完成!!");
int length=queue.size();
//double count=ran.nextDouble();
System.out.println("是否继续,输入Y或者N");
String str=sc.next();
while(!str.equals("Y")&&!str.equals("N"))
{
System.out.println("你输入的操作不存在,请重新输入!!");
str=sc.next();
}
if(str.equals("Y"))//磁盘调度
{
length--;
System.out.println("进行磁盘调度操作!!");
node node2=queue.poll();
System.out.println(node2.name+"--"+node2.number+"已经执行结束!!");
}
else //压入新的进程
{
length++;
System.out.println("进行压入新的进程操作!!");
node node2=new node();
System.out.println("输入压入的进程的进程号,类型为int类型");
node2.name=sc.nextInt();
System.out.println("输入压入的进程的磁盘通道号,注意范围是"+nn+"----"+mm);
node2.number=sc.nextInt();
queue.add(node2);
System.out.println("已经压入");
}
System.out.println("是否继续,输入Y或者N");
str=sc.next();
while(!str.equals("Y")&&!str.equals("N"))
{
System.out.println("你输入的操作不存在,请重新输入!!");
str=sc.next();
}
while(length>0)
{
if(str.equals("Y"))//进行磁盘调度
{
length--;
System.out.println("进行磁盘调度操作!!");
node node2=queue.poll();
System.out.println(node2.name+"--"+node2.number+"已经执行结束!!");
}
else//压入新的进程
{
length++;
System.out.println("进行压入新的进程操作!!");
node node2=new node();
System.out.println("输入压入的进程的进程号,类型为int类型");
node2.name=sc.nextInt();
System.out.println("输入压入的进程的磁盘通道号,注意范围是"+nn+"----"+mm);
node2.number=sc.nextInt();
queue.add(node2);
System.out.println("已经压入");
}
System.out.println("是否继续,输入Y或者N");
str=sc.next();
while(!str.equals("Y")&&!str.equals("N"))
{
System.out.println("你输入的操作不存在,请重新输入!!");
str=sc.next();
}
}
if(length==0)
{
System.out.println("进程已经全部执行完毕!!!");
}
}
static Comparator<node>compare=new Comparator<node>() {
@Override
public int compare(node o1, node o2) {
// TODO Auto-generated method stub
return o1.number-o2.number;
}
};
static class node
{
int name;//进程名
//int limittime;//最晚完成时间
int number;//磁道通道号
public node() {
// TODO Auto-generated constructor stub
}
}
}
还是老样子,作者很菜,如有不足,不吝赐教!!!
- kvm虚拟化管理平台WebVirtMgr部署-完整记录(安装ubuntu虚拟机)-(5)
- 从MapX到MapXtreme2004[9]-标注的强调显示
- 【第一季】Vue2.0内部指令
- 从MapX到MapXtreme2004[9]-标注的强调显示
- 分布式监控系统Zabbix-3.0.3-完整安装记录(4)-解决zabbix监控图中出现中文乱码问题
- 常用Lambda表达式实例
- centos6.8部署vnc服务
- linux下的缓存机制及清理buffer/cache/swap的方法梳理
- 分组合计且排序和显示名称
- silverlight动态读取txt文件/解析json数据/调用wcf示例
- Junit加载Spring容器作单元测试_添加事务回滚
- 实现三遍决策树,你就会想出更快的算法!
- 将一段复杂文本变成字符串的赋值语句
- Linux下squid代理缓存服务环境部署
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- 17个品牌,113款5G手机,5G离我们越来越近。
- PHP的cookie与session原理及用法详解
- Thinkphp5.0框架视图view的循环标签用法示例
- Thinkphp5.0 框架视图view的比较标签用法分析
- laravel 操作数据库常用函数的返回值方法
- laravel 验证错误信息到 blade模板的方法
- thinkPHP+LayUI 流加载实现功能
- Thinkphp5.0框架使用模型Model的获取器、修改器、软删除数据操作示例
- laravel5.2表单验证,并显示错误信息的实例
- ThinkPHP 5.1 跨域配置方法
- PHP调用接口API封装的例子
- php-fpm超时时间设置request_terminate_timeout资源问题分析
- laravel框架添加数据,显示数据,返回成功值的方法
- PHP的静态方法与普通方法用法实例分析
- 解决PHP使用CURL发送GET请求时传递参数的问题