`

操作系统课程设计--磁盘调度算法的模拟实现及对比

阅读更多

本来已经做好了个课程设计是银行家算法的,不过由于借给同学抄,被老师发现了,要重做...就选了磁盘高度算法的题目。

实验要求及提示

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文件。

4
0
分享到:
评论
2 楼 bosshida 2010-12-27  
heming_way 写道
你好搞笑啊,我也选的银行家算法,不过现在还是蛮纠结,是不是我的题目选得太简单了,

呵呵,做银行家算法如果能实现得比较好,也是有点难度的。
1 楼 heming_way 2010-12-27  
你好搞笑啊,我也选的银行家算法,不过现在还是蛮纠结,是不是我的题目选得太简单了,

相关推荐

    操作系统课程设计---磁盘调度算法.doc

    操作系统课程设计---磁盘调度算法 磁盘调度算法是操作系统中的一种重要算法,用于管理磁盘I/O操作,提高磁盘的存取效率和系统的整体性能。在本文中,我们将详细介绍磁盘调度算法的设计思想和实现过程。 一、先来先...

    模拟磁盘调度算法,操作系统课程设计.pdf

    模拟磁盘调度算法在操作系统课程设计中的应用 磁盘调度算法是操作系统中的一种重要算法,负责管理磁盘的输入/输出操作。模拟磁盘调度算法是指通过软件模拟磁盘的调度过程,以达到优化磁盘的输入/输出性能的目的。...

    操作系统课程设计磁盘调度算法.doc

    操作系统课程设计磁盘调度算法是计算机操作系统中的一种重要算法,用于确定磁盘读写操作的顺序,以提高磁盘的读写效率。本文将对磁盘调度算法的设计进行详细的介绍,并对其实现过程进行剖析。 1. 操作系统课程设计...

    操作系统-课程设计报告X - 操作系统课程设计---磁盘调度算法.docx

    ### 操作系统课程设计报告X - 磁盘调度算法 #### 一、摘要与关键词解析 本课程设计报告旨在探讨磁盘调度算法,并通过实际编程实现这些算法,以优化磁盘I/O操作的效率。磁盘调度算法是操作系统中的一个重要组成部分...

    磁盘调度算法的模拟实现及对比

    通过磁盘调度算法的模拟设计,了解磁盘调度的特点。 模拟实现FCFS、SSTF、SCAN、C-SCAN和LOOK算法,并计算及比较磁头移动道数。 磁盘调度算法是根据访问都指定的磁道(柱面)位置来决定执行次序的调度。其目的是尽...

    模拟磁盘调度算法操作系统课程设计

    本文主要讲解了模拟磁盘调度算法操作系统课程设计的相关知识点。磁盘调度算法是操作系统中的一种算法,用于管理磁盘I/O操作,以提高磁盘的读写效率。本设计主要介绍了磁盘调度算法的基本概念、设计思想、数据结构、...

    磁盘调度算法的模拟实现及对比1

    本项目是针对"磁盘调度算法的模拟实现及对比1"的课程设计,旨在通过C#编程语言来模拟不同的磁盘调度算法,并进行性能比较。 首先,我们要理解磁盘调度的背景。磁盘是计算机存储的重要组成部分,其工作原理是通过...

    操作系统磁盘调度算法实验报告

    操作系统磁盘调度算法实验报告 本实验报告的主要目的是设计一个磁盘调度模拟系统,旨在使磁盘调度算法更加形象化、易于理解,使磁盘调度的特点更简单明了。通过本实验,学生可以加深对先来先服务算法、最短寻道时间...

    操作系统课程设计-磁盘调度、进程调度、页面置换

    首先,磁盘调度算法在操作系统中扮演着关键角色,它的主要任务是决定硬盘读写头的移动顺序,以提高磁盘操作的效率。常见的磁盘调度算法有先来先服务(FCFS)、最短寻道时间优先(SSTF)、扫描(SCAN)和循环扫描(C-...

    模拟磁盘调度算法操作系统课程设计.pdf

    模拟磁盘调度算法操作系统课程设计 本课程设计的主要目标是设计和实现一个模拟磁盘调度算法,以便更好地理解操作系统中的磁盘调度机制。通过本设计,我们可以了解磁盘调度算法的原理和实现方法,并学会使用编程语言...

    操作系统课程设计磁盘调度算法

    本课程设计的目的是通过设计一个磁盘调度模拟系统,从而使磁盘调度算法更加形象化,容易使人理解,使磁盘调度的特点更简单明了,能使使用者加深对先来先服务算法、最短寻道时间优先算法、扫描算法以及循环扫描算法等...

    操作系统磁盘调度算法实验报告及代码.pdf

    操作系统中的磁盘调度算法是管理硬盘驱动器读写头移动的关键技术,其目的是最小化磁头移动距离,从而提高磁盘操作的效率。本实验报告和代码涉及的是四种常见的磁盘调度算法:先来先服务(FCFS)、最短寻道时间优先...

    操作系统课程设计-磁盘调度算法

    摘要磁盘调度算法建立相应的数据结构;在屏幕上显示磁盘请求的服务状况;时间的流逝可用下面几种方法模拟:(a)按键盘,每按一次可认为过一个时间单位; (b) 响应WM_TIMER;(本课程设计采用此方式)将一批...

    操作系统磁盘调度课程设计

    本课程设计旨在通过模拟不同的磁盘调度算法,帮助学生深入理解这些算法的工作原理。 首先,我们要讨论的是FCFS(先来先服务)算法。该算法是最简单的调度策略,它按照磁道请求的先后顺序进行服务。如代码所示,FCFS...

    磁盘调度算法 课程设计

    在这个课程设计中,我们将探讨几种常见的磁盘调度算法,并分析其设计和实现。 1. **前言** 在操作系统中,磁盘调度算法扮演着提升I/O性能的角色。通过模拟实际操作系统的运行,我们可以更好地理解这些算法如何在...

    操作系统课程设计 磁盘调度算法

    在操作系统课程设计中,磁盘调度算法是一项重要的学习内容,因为有效的磁盘调度能显著提升系统的性能和响应速度。 磁盘调度是指操作系统如何决定磁头的移动顺序以服务来自不同磁道上的I/O请求。其主要目标是减少...

    操作系统课程设计磁盘调度c++算法最终版本

    在这个"操作系统课程设计——磁盘调度算法最终版本"中,我们将探讨几种常见的磁盘调度算法,并通过C++编程语言实现它们。 首先,我们来看"先来先服务"(First-Come, First-Served, FCFS)算法。这种算法简单直观,...

    OS操作系统课程设计模拟磁盘管理系统SCAU

    介绍 华南农业大学SCAU操作系统OS课程设计,JAVAFX开发,可以实现查找文件,磁盘空间使用情况可视化,观察每一个磁盘块的情况。完成文件的基本操作,界面数据实时更新。当时这个课设的成绩是全班第一,如果对你有...

    磁盘调度算法的模拟实现.docx

    磁盘调度算法是操作系统中管理硬盘访问的重要策略,它的主要目标...通过这个课程设计,学生不仅能学习到磁盘调度算法的原理,还能实际体验到从问题分析到代码实现的全过程,这对培养实际操作系统的开发能力非常有帮助。

Global site tag (gtag.js) - Google Analytics