- 浏览: 218170 次
- 性别:
- 来自: 广州
文章分类
最新评论
-
microwindlab:
你不应该加 --shell 参数,因为 --shell run ...
由mongodb的维护引发的 grep,awk,sed 与管道的应用 -
Jerryhome:
楼主超牛,值得好好学习
windows系统下的进程监测程序--实现过程记录 -
xb_91674981:
学习一下,模式在程序设计是很重要
《大话设计模式》一书的所有代码和UML类图 -
Jason(aijun):
正在学习,非常感谢分享。
《大话设计模式》一书的所有代码和UML类图 -
wurb_travelsky:
正在看这本书,C#的代码倒也不影响阅读
《大话设计模式》一书的所有代码和UML类图
本来已经做好了个课程设计是银行家算法的,不过由于借给同学抄,被老师发现了,要重做...就选了磁盘高度算法的题目。
实验要求及提示
1 、首先假设磁盘磁道数为 1500 ,磁头初始停止于 0 磁道。
2 、用随机数生成函数产生“磁道号”序列(即磁盘请求的位置),共产生 100 个。其中 50% 位于 0 ~ 499 , 25% 分布在 500 ~ 999 , 25% 分布在 1000 ~ 1499 。
3 、计算每种磁盘调度算法下的磁头移动道数
本程序主要是模拟实现,还有很多改进的地方,还请大家提出。
以下是为满足要求2的随机数生成代码,主要参照网上的方法:
package chow.app; import java.util.HashSet; import java.util.Iterator; import java.util.Random; /** * 用随机数生成函数产生“磁道号”序列(即磁盘请求的位置),共产生100个。其中50%位于0~499,25%分布在500~999,25%分布在1000~1499。 * @author Administrator */ public class DiskScheduleUtil { public static int count = 0;// 需要生成随机数的个数 public int[] createDiskRequest() { int[] tmpRequest = new int[100]; HashSet<Integer> s = new HashSet<Integer>(); // 50%位于0~499的序列 count = 50; genRadoms(0, 499, count, s); Iterator<Integer> it; it = s.iterator(); int i = 0; while (it.hasNext()) { tmpRequest[i] = it.next(); i++; } // 25%分布在500~999的序列 count = 25; s.clear(); genRadoms(500, 999, count, s); it = s.iterator(); i = 50; while (it.hasNext()) { tmpRequest[i] = it.next(); i++; } //25%分布在1000~1499的序列 count = 25; s.clear(); genRadoms(1000, 1499, count, s); it = s.iterator(); i = 75; while (it.hasNext()) { tmpRequest[i] = it.next(); i++; } //用来打乱tmpRequest的顺序 int[] tmpRequestReturn = new int[100]; int[] nosortSeq = random2(); for(int j = 0; j < 100; j++){ tmpRequestReturn[j] = tmpRequest[nosortSeq[j]]; System.out.print("[" + j + "]:" + tmpRequestReturn[j] + " "); if (j % 10 == 0) { System.out.println(); } } return tmpRequestReturn; } // 生成【begin,end】区间内num个随机数 public void genRadoms(int begin, int end, int num, HashSet<Integer> set) { if (num > (end - begin + 1) || end < begin) { return; } for (int i = 0; i < num; i++) {// 生成num个随机数 // 调用Math.random()方法 int temp = (int) (Math.random() * (end - begin + 1)) + begin; set.add(temp);// 将不同的数存入HashSet中 } int setLen = set.size(); // 如果存入的数小于指定生成的个数,则调用递归再生成剩余个数的随机数,如此循环,直到达到指定大小 if (setLen < count) { genRadoms(begin, end, count - setLen, set);// 递归 } } public static int[] random2() { int send[] = new int[100]; for(int i = 0; i < send.length; i++){ send[i] = i; } int temp1, temp2, temp3; Random r = new Random(); for (int i = 0; i < send.length; i++) // 随机交换send.length次 { temp1 = Math.abs(r.nextInt()) % (send.length - 1); // 随机产生一个位置 temp2 = Math.abs(r.nextInt()) % (send.length - 1); // 随机产生另一个位置 if (temp1 != temp2) { temp3 = send[temp1]; send[temp1] = send[temp2]; send[temp2] = temp3; } } return send; } }
以下是FCFS,SSTF,SCAN,C-SCAN各算法的代码,每个算法都返回磁盘移动的磁道数。
FCFS算法,first come first service.
package chow.app; /** * first come, first service * @author Administrator */ public class DiskScheduleFCFS extends DiskScheduleAlgorithm{ @Override public int getCount(final int[] diskReq, int varIndex){ count = 0; curIndex = varIndex; for(int i = 0; i < diskReq.length; i++){ count += Math.abs(diskReq[i] - curIndex); curIndex = diskReq[i]; } return count; } }
SSTF算法,shortest seek time first
package chow.app; /** * shortest seek time first 最短寻道时间优先算法 * @author Administrator */ public class DiskScheduleSSTF extends DiskScheduleAlgorithm { @Override public int getCount(final int[] diskReq, int varIndex) { count = 0; curIndex = varIndex; int[] tmpDiskReq = new int[diskReq.length]; for(int tInt = 0; tInt < diskReq.length; tInt++){ tmpDiskReq[tInt] = diskReq[tInt]; } for (int i = 0; i < tmpDiskReq.length; i++) { int index = getNearestIndex(curIndex,tmpDiskReq); count += Math.abs(curIndex - tmpDiskReq[index]); System.out.print(tmpDiskReq[index]+" "); if(i%10==0) System.out.println(); curIndex = tmpDiskReq[index]; tmpDiskReq[index] = -1; } return count; } //返回距离当前最近的索引 public int getNearestIndex(int tmpIndex,final int[] tdiskReq) { int min = 1500; int temp = 0; int index = -1; for (int i = 0; i < tdiskReq.length; i++) { if (tdiskReq[i] != -1) { temp = Math.abs(tmpIndex - tdiskReq[i]); if (temp < min) { min = temp; index = i; } } } return index; } }
SCAN算法,又叫做“电梯算法”,我是处理完最远一个请求就返回另一方向继续处理。也有教材上是一直移动到末端才转方向的。
/** * SCAN 电梯算法,先不断移到一端(尽头),再移到另一端(另一尽头) * 简化:默认为先大数端后向0端;不移到末端,只移到最外一个请求就转向 * @author Administrator */ public class DiskScheduleSCAN extends DiskScheduleAlgorithm{ @Override public int getCount(final int[] diskReq, int varIndex) { count = 0; curIndex = varIndex; int leftMin = curIndex, rightMax = curIndex; for(int i = 0; i < diskReq.length; i++){ if(diskReq[i] > curIndex && diskReq[i] > rightMax){ rightMax = diskReq[i]; }else if(diskReq[i] < curIndex && diskReq[i] < leftMin){ // 小于等于curIndex leftMin = diskReq[i]; } } if(curIndex==leftMin){ count = rightMax - curIndex; }else{ count = (rightMax - curIndex) + (rightMax - leftMin); } return count; } }
C-SCAN算法,SCAN算法的变种
package chow.app; /** * C-SCAN, 是SCAN的变种,当碰头移到另一端时,马上返回到磁盘开始,返回时不处理请求 * @author Administrator */ public class DiskScheduleC_SCAN extends DiskScheduleAlgorithm{ @Override public int getCount(final int[] diskReq, int varIndex) { count = 0; curIndex = varIndex; int leftMax = lowIndex, rightMax = curIndex; for(int i = 0; i < diskReq.length; i++){ if(diskReq[i] > curIndex && diskReq[i] > rightMax){ rightMax = diskReq[i]; }else if(diskReq[i] < curIndex && diskReq[i] > leftMax){ // 小于curIndex leftMax = diskReq[i]; } } if(curIndex==leftMax){ count = rightMax - curIndex; }else{ count = (rightMax - curIndex) + (highIndex - lowIndex) + leftMax; } return count; } }
以上是关键代码,其它的界面是在netbeans6.7上完成的。下面上传最终生成的jar文件。
- DiskSchedule.jar (26.3 KB)
- 下载次数: 119
评论
2 楼
bosshida
2010-12-27
heming_way 写道
你好搞笑啊,我也选的银行家算法,不过现在还是蛮纠结,是不是我的题目选得太简单了,
呵呵,做银行家算法如果能实现得比较好,也是有点难度的。
1 楼
heming_way
2010-12-27
你好搞笑啊,我也选的银行家算法,不过现在还是蛮纠结,是不是我的题目选得太简单了,
发表评论
-
w3school html 学习笔记
2014-04-25 20:38 911当显示页面时,浏览 ... -
phpcms 笔记
2014-04-24 16:53 867Phpcms v9的pc_webserver一安装上,就不 ... -
dive into python 笔记
2014-02-13 17:23 658第三章 tuple 是没有app ... -
python 爬某高校C++题库小程序
2014-01-18 15:44 1433最近在学习C++,爬下一些题来,用于平时练手。 原理其实也 ... -
centos下饭强--obfucated-openssh sshcenter.info
2013-09-26 21:47 15431. git clone https://github.com ... -
android的【qq通讯录】导出短信,在iphone上恢复
2013-07-14 22:00 5965事件经过:朋友原来用android手机,现在新买了ipho ... -
python的一些记录
2013-05-03 13:53 1204正则表达式的一些常用元字符和语法: http://www. ... -
《程序设计导引及在线实践》学习
2012-05-31 17:13 1038P41 int MyItoa(char s[]) 将s中以 ... -
accelerated c++ 学习笔记
2012-04-26 00:53 1199Chapter 0 A namespace is a ... -
关于foreach与普通for的区别
2012-04-10 22:07 1328请问两者的区别 for(A a : alist) { ... -
学习Linux命令,读《系统程序员成长计划》
2012-03-06 16:41 1345linux命令小结: cat : ... -
base64,日期操作,jexl读取excel
2012-03-06 16:40 219907-22:学习base64的加密和解密,求几天前的日期和求两 ... -
无题。。好代码记录
2011-12-27 11:35 771编写函数expand(s1,s2),将字符串s1中类似于a-z ... -
数据结构:排序
2011-11-09 13:08 951排序一般分为:插入排序,选择排序,交换排序,归并排序和分配排序 ... -
c语言复习笔记
2011-11-07 17:24 2133指针部分: 1.指针类型说明 main(){ in ... -
并发学习笔记(更新中,java编程思想第四版21章)
2011-10-19 23:47 1590实现并发最直接的方式是在操作系统级别使用进程。 并发任 ... -
并发学习笔记(更新中,java编程思想第四版21章)
2011-10-19 21:05 0从今天起记录学习到的知识。 -
RMI 入门
2011-10-07 16:23 1562RMI : remote method invocation, ... -
《大话设计模式》一书的所有代码和UML类图
2011-08-29 16:08 4296如题,把《大话设计模式》一书的所有代码和UML类图写出来,见附 ... -
windows系统下的进程监测程序--实现过程记录
2011-05-26 22:50 6207单位的客服中心的服务器有个接口程序,这三天都出现了自动退出的情 ...
相关推荐
操作系统课程设计---磁盘调度算法 磁盘调度算法是操作系统中的一种重要算法,用于管理磁盘I/O操作,提高磁盘的存取效率和系统的整体性能。在本文中,我们将详细介绍磁盘调度算法的设计思想和实现过程。 一、先来先...
模拟磁盘调度算法在操作系统课程设计中的应用 磁盘调度算法是操作系统中的一种重要算法,负责管理磁盘的输入/输出操作。模拟磁盘调度算法是指通过软件模拟磁盘的调度过程,以达到优化磁盘的输入/输出性能的目的。...
操作系统课程设计磁盘调度算法是计算机操作系统中的一种重要算法,用于确定磁盘读写操作的顺序,以提高磁盘的读写效率。本文将对磁盘调度算法的设计进行详细的介绍,并对其实现过程进行剖析。 1. 操作系统课程设计...
### 操作系统课程设计报告X - 磁盘调度算法 #### 一、摘要与关键词解析 本课程设计报告旨在探讨磁盘调度算法,并通过实际编程实现这些算法,以优化磁盘I/O操作的效率。磁盘调度算法是操作系统中的一个重要组成部分...
通过磁盘调度算法的模拟设计,了解磁盘调度的特点。 模拟实现FCFS、SSTF、SCAN、C-SCAN和LOOK算法,并计算及比较磁头移动道数。 磁盘调度算法是根据访问都指定的磁道(柱面)位置来决定执行次序的调度。其目的是尽...
本文主要讲解了模拟磁盘调度算法操作系统课程设计的相关知识点。磁盘调度算法是操作系统中的一种算法,用于管理磁盘I/O操作,以提高磁盘的读写效率。本设计主要介绍了磁盘调度算法的基本概念、设计思想、数据结构、...
本项目是针对"磁盘调度算法的模拟实现及对比1"的课程设计,旨在通过C#编程语言来模拟不同的磁盘调度算法,并进行性能比较。 首先,我们要理解磁盘调度的背景。磁盘是计算机存储的重要组成部分,其工作原理是通过...
操作系统磁盘调度算法实验报告 本实验报告的主要目的是设计一个磁盘调度模拟系统,旨在使磁盘调度算法更加形象化、易于理解,使磁盘调度的特点更简单明了。通过本实验,学生可以加深对先来先服务算法、最短寻道时间...
首先,磁盘调度算法在操作系统中扮演着关键角色,它的主要任务是决定硬盘读写头的移动顺序,以提高磁盘操作的效率。常见的磁盘调度算法有先来先服务(FCFS)、最短寻道时间优先(SSTF)、扫描(SCAN)和循环扫描(C-...
模拟磁盘调度算法操作系统课程设计 本课程设计的主要目标是设计和实现一个模拟磁盘调度算法,以便更好地理解操作系统中的磁盘调度机制。通过本设计,我们可以了解磁盘调度算法的原理和实现方法,并学会使用编程语言...
本课程设计的目的是通过设计一个磁盘调度模拟系统,从而使磁盘调度算法更加形象化,容易使人理解,使磁盘调度的特点更简单明了,能使使用者加深对先来先服务算法、最短寻道时间优先算法、扫描算法以及循环扫描算法等...
操作系统中的磁盘调度算法是管理硬盘驱动器读写头移动的关键技术,其目的是最小化磁头移动距离,从而提高磁盘操作的效率。本实验报告和代码涉及的是四种常见的磁盘调度算法:先来先服务(FCFS)、最短寻道时间优先...
摘要磁盘调度算法建立相应的数据结构;在屏幕上显示磁盘请求的服务状况;时间的流逝可用下面几种方法模拟:(a)按键盘,每按一次可认为过一个时间单位; (b) 响应WM_TIMER;(本课程设计采用此方式)将一批...
本课程设计旨在通过模拟不同的磁盘调度算法,帮助学生深入理解这些算法的工作原理。 首先,我们要讨论的是FCFS(先来先服务)算法。该算法是最简单的调度策略,它按照磁道请求的先后顺序进行服务。如代码所示,FCFS...
在这个课程设计中,我们将探讨几种常见的磁盘调度算法,并分析其设计和实现。 1. **前言** 在操作系统中,磁盘调度算法扮演着提升I/O性能的角色。通过模拟实际操作系统的运行,我们可以更好地理解这些算法如何在...
在操作系统课程设计中,磁盘调度算法是一项重要的学习内容,因为有效的磁盘调度能显著提升系统的性能和响应速度。 磁盘调度是指操作系统如何决定磁头的移动顺序以服务来自不同磁道上的I/O请求。其主要目标是减少...
在这个"操作系统课程设计——磁盘调度算法最终版本"中,我们将探讨几种常见的磁盘调度算法,并通过C++编程语言实现它们。 首先,我们来看"先来先服务"(First-Come, First-Served, FCFS)算法。这种算法简单直观,...
介绍 华南农业大学SCAU操作系统OS课程设计,JAVAFX开发,可以实现查找文件,磁盘空间使用情况可视化,观察每一个磁盘块的情况。完成文件的基本操作,界面数据实时更新。当时这个课设的成绩是全班第一,如果对你有...
磁盘调度算法是操作系统中管理硬盘访问的重要策略,它的主要目标...通过这个课程设计,学生不仅能学习到磁盘调度算法的原理,还能实际体验到从问题分析到代码实现的全过程,这对培养实际操作系统的开发能力非常有帮助。