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
    }
  }
}

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

相关文章
|
1月前
|
算法 调度 UED
探索操作系统的心脏:调度算法的奥秘与影响
【10月更文挑战第9天】 本文深入探讨了操作系统中至关重要的组件——调度算法,它如同人体的心脏,维持着系统资源的有序流动和任务的高效执行。我们将揭开调度算法的神秘面纱,从基本概念到实际应用,全面剖析其在操作系统中的核心地位,以及如何通过优化调度算法来提升系统性能。
|
12天前
|
算法 调度 UED
深入理解操作系统:进程调度与优先级队列
【10月更文挑战第31天】在计算机科学的广阔天地中,操作系统扮演着枢纽的角色,它不仅管理着硬件资源,还为应用程序提供了运行的环境。本文将深入浅出地探讨操作系统的核心概念之一——进程调度,以及如何通过优先级队列来优化资源分配。我们将从基础理论出发,逐步过渡到实际应用,最终以代码示例巩固知识点,旨在为读者揭开操作系统高效管理的神秘面纱。
|
26天前
|
设计模式 算法 安全
实时操作系统(RTOS)深度解析及Java实现初探
【10月更文挑战第22天】实时操作系统(RTOS,Real-Time Operating System)是一种能够在严格的时间限制内响应外部事件并处理任务的操作系统。它以其高效、高速、可靠的特点,广泛应用于工业自动化、航空航天、医疗设备、交通控制等领域。本文将深入浅出地介绍RTOS的相关概念、底层原理、作用与功能,并探讨在Java中实现实时系统的方法。
59 1
|
9天前
|
算法 调度 UED
深入理解操作系统:进程管理与调度策略
【10月更文挑战第34天】本文旨在探讨操作系统中至关重要的一环——进程管理及其调度策略。我们将从基础概念入手,逐步揭示进程的生命周期、状态转换以及调度算法的核心原理。文章将通过浅显易懂的语言和具体实例,引导读者理解操作系统如何高效地管理和调度进程,保证系统资源的合理分配和利用。无论你是初学者还是有一定经验的开发者,这篇文章都能为你提供新的视角和深入的理解。
30 3
|
14天前
|
NoSQL Java 调度
Java调度任务如何保证相同任务在一个周期里只执行一次?
【10月更文挑战第29天】Java调度任务如何保证相同任务在一个周期里只执行一次?
45 6
|
14天前
|
存储 NoSQL Java
Java调度任务如何使用分布式锁保证相同任务在一个周期里只执行一次?
【10月更文挑战第29天】Java调度任务如何使用分布式锁保证相同任务在一个周期里只执行一次?
38 1
|
14天前
|
消息中间件 算法 调度
深入理解操作系统:进程管理与调度策略
【10月更文挑战第29天】本文将带领读者深入探讨操作系统中的核心组件之一——进程,并分析进程管理的重要性。我们将从进程的生命周期入手,逐步揭示进程状态转换、进程调度算法以及优先级调度等关键概念。通过理论讲解与代码演示相结合的方式,本文旨在为读者提供对进程调度机制的全面理解,从而帮助读者更好地掌握操作系统的精髓。
30 1
|
14天前
|
算法 调度 UED
深入理解操作系统中的进程调度
【10月更文挑战第29天】探索进程调度的奥秘,本文将带你深入了解在操作系统中如何管理和控制多个并发执行的程序。从简单的调度算法到复杂的多级反馈队列,我们将逐步揭示如何优化系统性能和提高资源利用率。准备好一起揭开进程调度的神秘面纱吧!
|
19天前
|
算法 大数据 Linux
深入理解操作系统之进程调度算法
【10月更文挑战第24天】本文旨在通过浅显易懂的语言,带领读者深入了解操作系统中的进程调度算法。我们将从进程的基本概念出发,逐步解析进程调度的目的、重要性以及常见的几种调度算法。文章将通过比喻和实例,使复杂的技术内容变得生动有趣,帮助读者建立对操作系统进程调度机制的清晰认识。最后,我们还将探讨这些调度算法在现代操作系统中的应用和发展趋势。
|
1月前
|
分布式计算 算法 大数据
探索操作系统的核心:调度与内存管理机制
【10月更文挑战第11天】 本文深入探讨了操作系统中两大核心功能——调度与内存管理机制。通过分析调度算法、进程状态转换及内存分配策略等关键方面,揭示了它们如何共同维护系统性能和稳定性。旨在为读者提供对操作系统内部运作的深刻理解,同时引起对优化策略的思考。
59 5