原创


上一篇博客写了最短寻道优先算法(SSTF)——磁盘调度管理:http://www.cnblogs.com/chiweiming/p/9073312.html

此篇介绍扫描算法(SCAN)——磁盘调度管理,与上一篇的代码有类似的片段,但较最短寻道优先算法难。

(题目阐述看上一篇博客)

随机选择一磁道号为起点开始寻道后,先从磁道序列中筛选出比起点磁道号大的磁道号,再在这批磁道号中筛选出

最小的磁道号,访问它,再以它为起点继续上述操作(自里向外的访问磁道),直到访问完最大的磁道号。

再在未访问过的磁道号中筛选出最大的磁道号访问,再以它为起点,从剩下未被访问过的磁道号中筛选出最大的磁

道号访问,再以它为起点继续上述操作(自外向里的访问磁道),直到访问完全部磁道。

#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<time.h> #define MAX 50 //可访问的最大磁道号
#define N 20 //磁道号数目 int track[N]; //存放随机产生的要进行寻道访问的磁道号序列
int num_track[N]; //记录其他磁道与当前被访问磁道的距离
int total=; //统计已被访问的磁道号数
int all_track=; //移动的磁道总数
double aver_track; //平均寻道总数
int ff=; //ff==0代表自里向外扫描,==1代表自外向里扫描 void SCAN(int order){ //order为track中当前被访问的磁道下标
printf("%d ",track[order]);
num_track[order]=-;
total++; //已被访问磁道号+1
if(total==N){
return;
}
int i=;
for(i=;i<=N-;i++){ //计算其他磁道与当前被访问磁道的距离
if(num_track[i]!=-){
num_track[i]=abs(track[order]-track[i]);
}
}
if(ff==){ //自里向外移动
int min=;
int x=-;
for(i=;i<=N-;i++){
if(num_track[i]!=-){
if(track[i]>=track[order]){
if(num_track[i]<min){ //从比track[order]大的磁道号中选出最小的
min=num_track[i];
x=i;
}
}
}
}
if(x==-){ //x==-1代表找不出大于等于track[order]的数,下次应该自外向里扫描
ff=;
int max=-;
int x;
for(i=;i<=N-;i++){ //自外向里移动,找到第一个未被访问过的磁盘后以它为起点自外向里扫描
if(num_track[i]!=-){
if(track[i]>max){
max=track[i];
x=i;
}
}
}
all_track+=abs(track[order]-track[x]);
SCAN(x);
}
else{
all_track+=abs(track[order]-track[x]);
SCAN(x);
}
}
else{ //自外向里移动
int min=;
int x;
for(i=;i<=N-;i++){
if(num_track[i]!=-){
if(track[i]<=track[order]){
if(num_track[i]<min){
min=num_track[i];
x=i;
}
}
}
}
all_track+=abs(track[order]-track[x]);
SCAN(x);
}
} int main(){
int i=;
srand(time());
printf("磁道号序列为: ");
for(i=;i<=N-;i++){ //随机产生要进行寻道访问的磁道号序列
track[i]=rand()%(MAX+);
printf("%d ",track[i]);
}
printf("\n");
printf("寻道序列为: ");
SCAN(rand()%N); //随机选择起点磁道
printf("\n移动的磁道总数: %d\n",all_track);
printf("平均寻道总数: %0.2lf",(double)all_track/N);
return ;
}

(运行结果部分截图)

19:33:25

2018-05-22

扫描算法(SCAN)——磁盘调度管理的更多相关文章

  1. 最短寻道优先算法(SSTF)——磁盘调度管理

    原创 最近操作系统实习,敲了实现最短寻道优先(SSTF)——磁盘调度管理的代码. 题目阐述如下: 设计五:磁盘调度管理 设计目的: 加深对请求磁盘调度管理实现原理的理解,掌握磁盘调度算法. 设计内容: ...

  2. 操作系统精髓与设计原理(九)——I/O管理和磁盘调度

    文章目录 I/O设备 I/O功能组织 直接存储器访问 操作系统设计问题 设计目标 IO功能的逻辑结构 I/O缓冲 单缓冲 双缓冲 循环缓冲 缓冲的作用 磁盘调度 磁盘性能参数 磁盘调度策略 先进先出 ...

  3. 操作系统-IO管理和磁盘调度

    I/O设备 IO设备的类型 分为三类:人机交互类外部设备:打印机.显示器.鼠标.键盘等等.这类设备数据交换速度相对较慢,通常是以字节为单位进行数据交换的 存储设备:用于存储程序和数据的设备,如磁盘.磁 ...

  4. 基于正向扫描的并行区间连接平面扫描算法(IEEE论文)

    作者: Panagiotis Bouros ∗Department of Computer ScienceAarhus University, Denmarkpbour@cs.au.dkNikos M ...

  5. Spark调度管理(读书笔记)

    Spark调度管理(读书笔记) 转载请注明出处:http://www.cnblogs.com/BYRans/ Spark调度管理 本文主要介绍在单个任务内Spark的调度管理,Spark调度相关概念如 ...

  6. linux磁盘管理系列一:磁盘配额管理

    磁盘管理系列 linux磁盘管理系列一:磁盘配额管理   http://www.cnblogs.com/zhaojiedi1992/p/zhaojiedi_linux_040_quota.html l ...

  7. Linux iSCSI 磁盘共享管理

    Linux iSCSI 磁盘共享管理 iSCSI 服务是通过服务端(target)与客户端(initiator)的形式来提供服务.iSCSI 服务端用于存放存储源的服务器,将磁盘空间共享给客户使用,客 ...

  8. quota - linux磁盘配额管理

    磁盘管理系列 linux磁盘管理系列一:磁盘配额管理   http://www.cnblogs.com/zhaojiedi1992/p/zhaojiedi_linux_040_quota.html l ...

  9. [计算机图形学] 基于C#窗口的Bresenham直线扫描算法、种子填充法、扫描线填充法模拟软件设计(二)

    上一节链接:http://www.cnblogs.com/zjutlitao/p/4116783.html 前言: 在上一节中我们已经大致介绍了该软件的是什么.可以干什么以及界面的大致样子.此外还详细 ...

随机推荐

  1. Python学习---ORM查询之基于对象的正向/反向/聚合/分组/Q/F查询

    ORM查询之基于对象的正向查询与反向查询 对象形式的查询 # 正向查询 ret1=models.Book.objects.first() print(ret1.title) print(ret1.pr ...

  2. ZT android -- 蓝牙 bluetooth (五)接电话与听音乐

    android -- 蓝牙 bluetooth (五)接电话与听音乐 分类: Android的原生应用分析 2013-07-13 20:53 2165人阅读 评论(9) 收藏 举报 蓝牙android ...

  3. Factory模式 http://blog.csdn.net/tf576776047/article/details/6895545

    Factory模式   http://blog.csdn.net/tf576776047/article/details/6895545 分类: 网站开发 2011-10-22 00:23 1056人 ...

  4. java多态实例

    学校有两个打印机,一个彩印,一个黑白印,都打印输出 public class printerDemo { public static void main(String[] args) { colorP ...

  5. Centos7 之目录处理命令(八)

    linux中 关于目录 有几个重要概念 一个是 / 根目录  还有一个当前用户的家目录 比如 root用户的家目录是 /root  普通用户的家目录是/home/xxx 下 root登录 默认家目录 ...

  6. 自定义控件(视图)2期笔记12:View的滑动冲突之 外部拦截法

    1. 外部拦截法: 点击事件通过父容器拦截处理,如果父容器需要就拦截,不需要就不拦截. 这种方法比较符合事件分发机制.外部拦截法需要重写父容器的onInterceptTouchEvent方法,在内部做 ...

  7. 4、集合set的功能介绍

    集合是易变(可改变)和无序聚集.集合set支持迭代,很像无值(或仅有键的)字典,用花括号表示{}.   1.集合的创建: 可以通过调用内建函数set()来创建,及向其传递一个迭代,该迭代的项目成为形成 ...

  8. 【JavaScript】explode动画

    这是一个js实现的粒子聚合文字或图片的动画特效 部分程序如下 n.container = n.container[0] || n.container; /*有且仅有一个container*/ var ...

  9. C#网络Socket编程

    1.什么是Socket Sockets 是一种进程通信机制,是一个通信链的句柄(其实就是两个程序通信用的) 2.分类 流式套接字(SOCK_STREAM):提供了一种可靠的.面向连接的双向数据传输服务 ...

  10. Freeze partial parameters while training

    1. requires_grad = False Set all parameters in the current model frozen: for p in self.parameters(): ...