基于JAVA的磁盘调度算法

Theheartoflove

发布日期: 2018-11-03 00:17:23 浏览量: 2389
评分:
star star star star star star star star star star_border
*转载请注明来自write-bug.com

一、需求分析

编译程序运用磁盘的四种调度算法实现对磁盘的调度,四种算法分别为先来先服务(FCFS)算法,最短寻道时间优先(SSTF)算法,扫描调度(SCAN)算法,循环扫描(C-SCAN)算法。

二、概要设计

  • 对系统进行功能模块分析、控制模块分析正确

  • 系统设计要实用

  • 编程简练,可用,功能全面,具有较好的健壮性

  • 说明书、流程图要清楚

总流程图

先来先服务(FCFS)算法流程图

最短寻道时间优先(SSTF)算法流程图

扫描调度(SCAN)算法流程图

循环扫描(C-SCAN)算法流程图

三、详细设计

3.1 设计思想

  • 先来先服务(FCFS)算法。即先来的请求先被响应。FCFS策略为我们建立起一个随机访问机制的模型,但是假如用这个策略反复响应从里到外的请求,那么将会消耗大量的时间。FCFS也被看作是最简单的磁盘调度算法

  • 最短寻道时间优先(SSTF)算法。要求访问的磁道,与当前磁头所在的磁道距离最近,以使每次的寻道时间最短

  • 扫描调度(SCAN)算法。该算法不仅考虑到欲访问的磁道与当前磁道间的距离,更优先考虑的是磁头当前的移动方向。例如,当磁头正在自里向外移动时,SCAN算法所考虑的下一个访问对象,应是其欲访问的磁道,既在当前磁道之外,又是距离最近的。这样自里向外的访问,直至再无更外的磁道需要访问时,才将磁道换向自外向里移动。这时,同样也是每次选择这样的进程来调度,也就是要访问的当前位置内距离最近者,这样,磁头又逐步地从外向里移动,直至再无更里面的磁道要访问,从而避免了出现“饥饿”现像

  • 循环扫描(C-SCAN)算法。当磁头刚从里向外移动而越过了某一磁道时,恰好又有一进程请求访问此磁道,这时,该里程就必须等待,为了减少这种延迟,CSCAN算法规定磁头单向移动,而本实验过程中我们所设计的是磁头从里向外移动,而从外向里移动时只须改方向而已,本实验未实现。但本实验已完全能演示循环扫描的全过程

3.2 模块设计

3.2.1 定义函数部分主要代码

  1. Random r = new Random(); // 生成随机数
  2. Scanner in = new Scanner(System.in);
  3. System.out.println("请输入当前磁道的个数,随机生成磁道号:");
  4. int s = in.nextInt(); // 磁道个数
  5. OS[] a = new OS[100];// new了100个引用
  6. // OS[] b = new OS[100];
  7. System.out.println("生成的随机磁道号为:");
  8. for (int i = 0; i < s; i++) {
  9. a[i] = new OS();// 分配内存空间
  10. a[i].Set_x(r.nextInt(200));
  11. System.out.println(a[i].Get_x() + " ");
  12. } // for

3.2.2 先来先服务(FCFS)算法部分主要代码

  1. System.out.print("请输入当前磁盘号:");
  2. Scanner in = new Scanner(System.in);
  3. now = in.nextInt(); // 当前磁头位置
  4. System.out.println("磁盘调度顺序:");
  5. for (int i = 0; i < s; i++)
  6. System.out.print(a[i].Get_x() + " ");
  7. for (int i = 0; i < s; i++) {
  8. a[i].Set_y(now - a[i].Get_x());
  9. if (a[i].Get_y()< 0)
  10. a[i].Set_y(-a[i].Get_y()); // 外围磁道与最里面磁道的距离
  11. sum += a[i].Get_y();
  12. now = a[i].Get_x();
  13. }

3.2.3 最短寻道时间优先(SSTF)算法部分主要代码

  1. System.out.print("请输入当前磁盘号:");
  2. Scanner in = new Scanner(System.in);
  3. now = in.nextInt(); // 当前磁头位置
  4. System.out.println("磁盘调度顺序:");
  5. // 找出每一次与当前磁头位置距离最小的磁道
  6. for (int i = 0; i < s; i++) {
  7. a[i].Set_y(now - a[i].Get_x()); // 记录每一个磁道与磁头的距离
  8. if (a[i].Get_y() < 0) {
  9. a[i].Set_y(-a[i].Get_y());
  10. }
  11. }
  12. for (int k = 0; k < s; k++) {// 将差值最小的放置最前面
  13. for (int i = 0; i < s - 1; i++) {
  14. for (int j = i + 1; j < s; j++)
  15. if (a[i].Get_y() > a[j].Get_y()) {
  16. temp = a[i];
  17. a[i] = a[j];
  18. a[j] = temp;
  19. }
  20. }
  21. System.out.print(a[k].Get_x() + " ");
  22. sum += a[k].Get_x();
  23. }

3.2.4 扫描调度(SCAN)算法部分主要代码

  1. System.out.print("请输入当前磁盘号:");
  2. Scanner in = new Scanner(System.in);
  3. now = in.nextInt(); // 当前磁头位置
  4. System.out.println("磁盘调度顺序:");
  5. for (int i = 0; i < s; i++)// 对访问磁道按由小到大顺序排序
  6. for (int j = i + 1; j < s; j++)
  7. if (a[i].Get_x() > a[j].Get_x()) {
  8. temp = a[i].Get_x();
  9. a[i].Set_x(a[j].Get_x());
  10. a[j].Set_x(temp);
  11. }
  12. // 输出排好序的磁盘
  13. System.out.println();
  14. int flag = 1;
  15. for (int i = 0; i < s; i++) { //先从比磁头大的磁道开始,磁头向外移动
  16. if (a[i].Get_x() > now) {
  17. a[i].Set_y(a[i].Get_x() - now);
  18. now = a[i].Get_x();
  19. sum += a[i].Get_y();
  20. flag++;
  21. System.out.print(a[i].Get_x() + " ");
  22. }
  23. } // for
  24. if (flag <= 9)
  25. for (int i = s - flag; i >= 0; i--) {
  26. a[i].Set_y(now - a[i].Get_x());
  27. now = a[i].Get_x();
  28. sum += a[i].Get_y();
  29. System.out.print(a[i].Get_x() + " ");
  30. } // if

3.2.5 循环扫描(C-SCAN)算法部分主要代码

  1. System.out.print("请输入当前磁盘号:");
  2. Scanner in = new Scanner(System.in);
  3. now = in.nextInt(); // 当前磁头位置
  4. System.out.println("磁盘调度顺序:");
  5. for (int i = 0; i < s; i++)// 对访问磁道按由小到大顺序排列
  6. for (int j = i + 1; j < s; j++)
  7. if (a[i].Get_x() > a[j].Get_x()) {
  8. temp = a[i].Get_x();
  9. a[i].Set_x(a[j].Get_x());
  10. a[j].Set_x(temp);
  11. }
  12. // 输出排序结果
  13. for (int i = 0; i < s; i++) {
  14. System.out.print(a[i].Get_x() + " ");
  15. }
  16. int flag = 0;
  17. for (int i = 0; i < s; i++) {
  18. if (a[i].Get_x() > now) {
  19. a[i].Set_y(a[i].Get_x() - now);
  20. now = a[i].Get_x();
  21. sum += a[i].Get_y();
  22. flag++;
  23. }
  24. } // for
  25. a[0].Set_y(now - a[s - 1].Get_x());
  26. for (int i = 1; i < s - flag; i++) {
  27. a[i].Set_y(now - a[i].Get_x());
  28. now = a[i].Get_x();
  29. sum += a[i].Get_y();
  30. }

四、调试分析

先来先服务(FCFS)算法测试结果

最短寻道时间优先(SSTF)算法测试结果

扫描调度(SCAN)算法测试结果

循环扫描(C-SCAN)算法测试结果

五、用户使用说明

在 Eclipse 中点击 File——Import——Existing Projects into WorkSpace——Browser——找到OperatingSystem文件夹的路径位置,将本工程导入到 Eclipse 中,然后右键工程 Run As Java Application,程序便开始执行,根据控制台文字提示输入相应的生产者数量,消费者数量,缓冲区个数,每个生产者生产产品数,便可看见程序的执行过程。

环境说明:本工程建立在 JDK1.7 环境下。

上传的附件 cloud_download 基于JAVA的磁盘调度算法.zip ( 150.89kb, 173次下载 )
error_outline 下载需要6点积分

发送私信

昨日渐多,明日渐少,这就是人生

13
文章数
26
评论数
最近文章
eject