操作系统--磁头引臂调度SCAN算法 JAVA实现--双磁头引臂

  • 具体要求
  • 代码~
  • 说明
  • 重要说明

具体要求

代码~

package com.guangluo.OS;import java.util.ArrayList;
import java.util.Iterator;
import java.util.Random;class Require{public String name;public int dest;public Require(String name, int dest) {this.name = name;this.dest = dest;}public void setName(String name) {this.name = name;}public void setDest(int dest) {this.dest = dest;}@Overridepublic String toString() {return name + " " + dest;}
}class Queue{public ArrayList<Require> queue = null;public Require r = null;public Queue(ArrayList<Require> queue) {this.queue = queue;}public void add(Require req) {queue.add(req);}public void del(String name) {Iterator<Require> iterator = queue.iterator();while(iterator.hasNext()) {Require req = iterator.next();if(req.name == name)iterator.remove();}}public boolean isNull() {if(queue == null)return true;return false;}public void show() {Iterator<Require> iterator = queue.iterator();while(iterator.hasNext()) {System.out.println(iterator.next().toString());}}public Require getReq(int orient, int current_dest) {Require r0 = null, r1 = null, r2 = null;
//      System.out.println("-----------------");
//      System.out.println("当前请求队列为:");
//      this.show();
//      System.out.println("-----------------");
//      System.out.println("磁头前进方向上的请求与其相对应的磁头间距为:");for(int i = 0; i < queue.size(); i++) {if(orient == 1) {if(queue.get(i).dest >= current_dest && queue.get(i).dest < 100) {if(r1 == null) r1 = queue.get(i);r1 = (r1.dest < queue.get(i).dest)? r1:queue.get(i);
//                  System.out.println(queue.get(i).name + "与磁头" + current_dest + " 相距:" + (queue.get(i).dest - current_dest));}else if(queue.get(i).dest >= current_dest + 100) {if(r2 == null) r2 = queue.get(i);r2 = (r2.dest < queue.get(i).dest)? r2:queue.get(i);
//                  System.out.println(queue.get(i).name + "与磁头" + (current_dest + 100) + " 相距:" + (queue.get(i).dest - current_dest - 100));}}if(orient == -1) {if(queue.get(i).dest <= current_dest && queue.get(i).dest >= 0) {if(r1 == null) r1 = queue.get(i);r1 = (r1.dest > queue.get(i).dest)? r1:queue.get(i);
//                  System.out.println(queue.get(i).name + "与磁头" + current_dest + " 相距:" + (current_dest - queue.get(i).dest));}else if(queue.get(i).dest <= current_dest + 100) {if(r2 == null) r2 = queue.get(i);r2 = (r2.dest > queue.get(i).dest)? r2:queue.get(i);
//                  System.out.println(queue.get(i).name + "与磁头" + (current_dest + 100) + " 相距:" + (current_dest + 100 - queue.get(i).dest));}}}if(r1 == null && r2 == null) {orient = -1 * orient;return getReq(orient, current_dest);}if(orient == 1) {if(r1 == null) r0 = r2;else if(r2 == null) r0 = r1;else r0 = (r1.dest - current_dest <= r2.dest - current_dest - 100)? r1: r2;}else {if(r1 == null) r0 = r2;else if(r2 == null) r0 = r1;else r0 = (current_dest - r1.dest <= current_dest + 100 - r2.dest)? r1: r2;}return r0;}
}class Scan{public int current_dest = 34;public int orient = 1;public boolean isNull = true;  // 表示磁盘是否可访问public Queue queue = null;public boolean flag = true;    // 表示请求队列是否为空public Scan(Queue queue) {this.queue = queue;}public void require(int dest) {System.out.print("当前入队请求:");System.out.println(Thread.currentThread().getName() + " " + dest);Require req = new Require(Thread.currentThread().getName(), dest);if(flag == true) {ArrayList<Require> q2 = new ArrayList<Require>();q2.add(req);queue = new Queue(q2);flag = false;}else {queue.add(req);}System.out.println("当前请求队列为:");queue.show();}public synchronized void release() throws InterruptedException{if(isNull) {isNull = false;Thread.sleep(1000);System.out.println("-------------------------------------------");Require req = queue.getReq(orient, current_dest);System.out.print("当前执行的请求为:");System.out.println("name:" + req.name + "----" + "dest:" + req.dest);if(req.dest < 100) current_dest = req.dest;else current_dest = req.dest - 100;System.out.println("双磁头磁道位置为:" + current_dest + "---" + (current_dest + 100));queue.del(req.name);System.out.println("-------------------------------------------");if(queue.isNull() == true) {System.out.println("请求队列已经空了");flag = true;}isNull = true;notifyAll();}else {wait();}}
}class MyThread implements Runnable{public Scan scan;public MyThread(Scan scan) {this.scan = scan;}@Overridepublic void run() {boolean flag = true;while(flag) {flag = false;scan.require(new Random().nextInt(200));System.out.println("===============================");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}try {scan.release();} catch (InterruptedException e) {e.printStackTrace();}}}
}public class Lei {public static void main(String[] args) {System.out.println("双磁头初始位置:34---134,初始前进方向:由小到大");Queue queue = null;Scan scan = new Scan(queue);for(int i = 0; i < 12; i++) {Thread t = new Thread(new MyThread(scan));t.start();try {Thread.sleep(10);} catch (InterruptedException e) {e.printStackTrace();}}}
}

说明

主要是对同方向且距离最近磁道请求的选取,因为是双磁头引臂,所以需要多加考虑。

重要说明

本博客中的代码能运行且结果正确,但是想法是存在问题的,也有博友私信讨论过了。即本次实现时notifyall唤醒的是随机线程,并不是哪个线程提出的请求,哪个线程就来处理该请求。打个比方:线程A、B分别请求122、100。经过本次程序调用最后有可能是线程A把100请求抱走了,而线程B抱走的是122请求。该处理做法是不对的,违反了线程请求的本意,也就是说结果展示里的Thread-0等根本不是真正的线程!


  • 磁头引臂调度算法正确的理解实现见我之后改进的最终版本:https://blog.csdn.net/guangluo/article/details/108959048

操作系统 磁头引臂调度 SCAN算法 JAVA实现(二)相关推荐

  1. SCAN算法 | 磁头引臂调度问题 | 双磁头进阶 | Java实现(详细注释)

    写在前面 欢迎讨论. 问题描述 用JAVA同步方法实现磁头引臂调度问题,采用SCAN算法. 要求:(1) 给出核心调度解法,用JAVA类实现,其中包含require(dest)和release()两个 ...

  2. 数据结构与算法Java(二)——字符串、矩阵压缩、递归、动态规划

    不定期补充.修正.更新:欢迎大家讨论和指正 本文以数据结构(C语言版)第三版 李云清 杨庆红编著为主要参考资料,用Java来实现 数据结构与算法Java(一)--线性表 数据结构与算法Java(二)- ...

  3. 操作系统之磁盘调度——SCAN实例讲解

    操作系统之进程调度--优先权法和轮转法(附上样例讲解) 操作系统之银行家算法-详解流程及案例数据 操作系统之多线程编程-读者优先/写者优先详解 操作系统之存储管理--FIFO算法和LRU算法 操作系统 ...

  4. 操作系统分区分配java算法_合肥工业大学操作系统课程设计 动态分区分配存储管理java版.doc...

    合肥工业大学操作系统课程设计 动态分区分配存储管理java版.doc 1课程设计动态分区分配存储管理设计题目学号专业班级学生姓名号指导教师22010年12月合肥工业大学课程设计任务书设计题目动态分区分 ...

  5. java模拟实现操作系统进程调度中的多级反馈队列算法

    java模拟实现操作系统进程调度中的多级反馈队列算法 操作系统学了一学期了,期末作业布置下来,用编程语言模拟进程调度的过程,只会java,于是就写了一下,通过控制台模拟,模拟过程看起来可能十分不直观. ...

  6. C语言 操作系统实验 四种调度(最高响应比优先算法 HRN)

    注: 本文是四个调度算法的第一篇算法. 本文是根据CSDN上某一FCFS调度算法魔改来的,所以FCFS的算法不会发到网站. 我是个菜鸡,发文是为了纪念自己完成了代码,以及累计自己的经验. 如有知识错误 ...

  7. 操作系统实验4—磁盘调度

    操作系统实验4-磁盘调度 文章目录 操作系统实验4-磁盘调度 实验描述 设计思路 上机代码 测试结果 心得体会 实验描述 实验内容: 编写一个磁盘调度程序,模拟操作系统对磁盘的调度. 实验目的: 本实 ...

  8. 操作系统之移臂调度算法

    本章分享操作系统之移臂调度算法,移臂调度算法是驱动调度技术中的算法,目的是减少为若干I/O请求服务所需消耗的总时间,从而提高系统效率.常见的移臂调度算法有先来先服务算法(FCFS).最短查找时间优先算 ...

  9. 操作系统原理之磁盘调度

    首先介绍主要的的四种磁头调度算法 (一)先来先服务算法(FCFS) 1.算法思想:按访问请求到达的先后次序服务. 2.优点:简单,公平. 3.缺点:效率不高,相邻两次请求可能会造成最内到最外的柱面寻道 ...

最新文章

  1. 黑客都用Python?学习Python的4个理由!
  2. 【Android 异步操作】FutureTask 分析 ( Future 接口解析 | Runnable 接口解析 | Callable 接口解析 )
  3. jenkins查询mysql_jenkins流水线使用mysql数据库
  4. BGP no-export
  5. 我的 .NET Core 博客性能优化经验总结
  6. 【kruskal】【倍增】严格次小生成树(P4180)
  7. 【BZOJ2908】又是nand 树链剖分+线段树
  8. k8s pod内部容器_第三章 pod:运行于kubernetes中的容器
  9. tsql 正则_sql里的正则表达式
  10. vb用数组方式快速导出MSFlexGrid表格数据到Excel表格中
  11. 蓝桥杯 ALGO-67 算法训练 最大值与最小值的计算
  12. String 和 InputStream 互转方式
  13. 考研高等数学张宇30讲笔记——第八讲 一元函数积分学的概念与计算
  14. 2003 445端口关闭方式
  15. 434个H5游戏源码
  16. 孙玄/陈东:聊一聊ZooKeeper的顺序一致性
  17. 数据分析师如何度过互联网寒冬
  18. 来自网页的消息服务器不能创建对象,ActiveXObject(Excel.application)引发Automation 服务器不能创建对象...
  19. 初中英语语法(010)-分词
  20. 6-3 读文章(*)

热门文章

  1. 直播带货为什么这么火
  2. 基于JAVA古惠农产品线上销售系统计算机毕业设计源码+数据库+lw文档+系统+部署
  3. 徐工改制方向错 外资控制徐工更是错-左大培 中国社会科学院经济研究所研究员...
  4. MFC+DuiVision结合VLC播放器开发直播客户端
  5. Swift Selector
  6. 100Mbps和100Mb/s有什么不同
  7. java holder 遍历_如何获取所有RecyclerView ViewHolder?
  8. 简化Fragment的权限请求
  9. 嫁人的15条标准--MM来看、GG来学
  10. 直播美颜技术:视频美颜sdk的快速集成与开发实践