Java实现操作系统实验之磁盘调度

简介: 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
    }
  }
}

还是老样子,作者很菜,如有不足,不吝赐教!!!

相关文章
|
3月前
|
算法 调度 UED
探索操作系统的心脏:调度算法的奥秘与影响
【10月更文挑战第9天】 本文深入探讨了操作系统中至关重要的组件——调度算法,它如同人体的心脏,维持着系统资源的有序流动和任务的高效执行。我们将揭开调度算法的神秘面纱,从基本概念到实际应用,全面剖析其在操作系统中的核心地位,以及如何通过优化调度算法来提升系统性能。
|
2月前
|
算法
数据结构实验之操作系统打印机管理器问题
本实验旨在通过实现操作系统中的打印机管理器问题,掌握队列的基本操作如入队、出队等,利用队列的先进先出特性解决先申请先打印的问题。实验包括队列的初始化、入队、出队、打印队列内容等功能,并通过菜单式界面进行交互。实验结果显示基本功能可正常执行,但在连续操作时存在执行失败的情况,需进一步优化。
53 4
|
2月前
|
算法 调度 UED
深入理解操作系统:进程调度与优先级队列
【10月更文挑战第31天】在计算机科学的广阔天地中,操作系统扮演着枢纽的角色,它不仅管理着硬件资源,还为应用程序提供了运行的环境。本文将深入浅出地探讨操作系统的核心概念之一——进程调度,以及如何通过优先级队列来优化资源分配。我们将从基础理论出发,逐步过渡到实际应用,最终以代码示例巩固知识点,旨在为读者揭开操作系统高效管理的神秘面纱。
|
1月前
|
存储 算法 调度
深入理解操作系统:进程调度的奥秘
在数字世界的心脏跳动着的是操作系统,它如同一个无形的指挥官,协调着每一个程序和进程。本文将揭开操作系统中进程调度的神秘面纱,带你领略时间片轮转、优先级调度等策略背后的智慧。从理论到实践,我们将一起探索如何通过代码示例来模拟简单的进程调度,从而更深刻地理解这一核心机制。准备好跟随我的步伐,一起走进操作系统的世界吧!
|
2月前
|
消息中间件 算法 调度
深入理解操作系统:进程管理与调度
操作系统是计算机系统的核心,负责管理和控制硬件资源、提供用户接口以及执行程序。其中,进程管理是操作系统的重要组成部分,它涉及到进程的创建、调度、同步和通信等方面。本文将深入探讨进程管理的基本概念、进程调度算法以及进程间的同步和通信机制。通过本文的学习,读者将能够更好地理解操作系统的工作原理,并掌握进程管理的基本技能。
60 11
|
2月前
|
算法 调度 UED
深入理解操作系统:进程管理与调度策略
操作系统作为计算机系统的核心,其进程管理和调度策略对于系统性能和用户体验至关重要。本文将通过直观的代码示例和浅显易懂的语言,带领读者了解操作系统如何有效管理进程以及常见的进程调度算法。我们将从进程的基本概念出发,逐步深入到进程状态、进程控制块(PCB)的作用,最后探讨不同的调度算法及其对系统性能的影响。无论您是初学者还是有一定基础的开发者,都能从中获得有价值的信息。
|
2月前
|
负载均衡 算法 调度
深入理解操作系统:进程管理与调度
在数字世界的心脏,操作系统扮演着至关重要的角色。它如同一位精明的指挥家,协调着硬件资源和软件需求之间的和谐乐章。本文将带你走进操作系统的核心,探索进程管理的艺术和调度策略的智慧。你将了解到进程是如何创建、执行和消亡的,以及操作系统如何巧妙地决定哪个进程应该在何时获得CPU的青睐。让我们一起揭开操作系统神秘的面纱,发现那些隐藏在日常计算背后的精妙机制。
|
2月前
|
调度 开发者
深入理解操作系统之进程调度
在计算机科学领域,操作系统是核心的一环,它管理着计算机硬件资源,并提供接口供上层软件运行。本文将通过深入浅出的方式,探讨操作系统中至关重要的一个概念——进程调度。我们将从基础理论出发,逐步展开讲解进程调度的原理和实现,并配以实际代码示例,旨在帮助读者更好地理解和掌握这一主题。文章不仅适合初学者建立基础,也适合有一定基础的开发者深化理解。
|
2月前
|
算法 调度 UED
深入理解操作系统:进程管理与调度策略
【10月更文挑战第40天】在数字世界中,操作系统是连接硬件与软件的桥梁,它管理着计算机资源和提供用户服务。本文将深入探讨操作系统中的进程管理与调度策略,揭示它们如何协调多任务运行,保证系统高效稳定运作。通过代码示例,我们将展示进程创建、执行以及调度算法的实际应用,帮助读者构建对操作系统核心机制的清晰认识。
|
2月前
|
算法 调度 UED
深入理解操作系统:进程管理与调度策略
【10月更文挑战第34天】本文旨在探讨操作系统中至关重要的一环——进程管理及其调度策略。我们将从基础概念入手,逐步揭示进程的生命周期、状态转换以及调度算法的核心原理。文章将通过浅显易懂的语言和具体实例,引导读者理解操作系统如何高效地管理和调度进程,保证系统资源的合理分配和利用。无论你是初学者还是有一定经验的开发者,这篇文章都能为你提供新的视角和深入的理解。
47 3