操作系统实验--SSTF磁盘调度算法

Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^

题目描述

磁盘调度在多道程序设计的计算机系统中,各个进程可能会不断提出不同的 对磁盘进行读/写操作的请求。由于有时候这些进程的发送请求的速度比磁盘响应的还要快,因此我们有必要为每个磁盘设备建立一个等待队列,最短寻道时间优先 算法(Shortest Seek Time First-SSTF)是常用的磁盘调度算法之一。

SSTF算法选择调度处理的磁道是与当前磁头所在磁道距离最近的磁道,以使每次的寻找时间最短。当然,总是选择最小寻找时间并不能保证平均寻找时间最小,但是能提供比FCFS算法更好的性能。这种算法会产生“饥饿”现象。

1、算法思想:优先选择距当前磁头最近的访问请求进行服务,主要考虑寻道优先。

2、优点:改善了磁盘平均服务时间。

3、缺点:造成某些访问请求长期等待得不到服务。

对于给定的磁头所在的当前磁道号和请求访问的磁道号队列(FIFO),试设计一个解此问题的算法,计算磁道访问序列和平均寻道长度(保留两位小数),并分析算法的正确性与计算复杂性。

输入

多组输入。输入数据的第一行是正整数n(0 < n < 500),表示磁头所在的当前磁道号;第2 行是正整数m(8 ≤ n ≤ 20),表示请求访问的磁道号队列长度;第三行有m个正整数ai(0 < a­I < 500),表示请求访问队列的m个磁道号。

输出

输出m+1行,前m行每行有两个整数,分别表示磁道号和移动的磁道数,第m+1行表示计算出的平均寻道长度(保留两位小数)。

示例输入

100 9
350
180
22
365
30
120
185
60
200

示例输出

120 20
180 60
185 5
200 15
60 140
30 30
22 8
350 328
365 15
69.00 算法思路:每次都要找距离当前磁头所在磁道最近的一条需要访问的磁道进行访问。如果当前有2条甚至多条磁道但距离当前所在磁道
距离均相同呢?按照磁道序列的优先级,进行寻道!
代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#include <math.h>
#include <algorithm>
#define eps 1e-8 using namespace std; struct node
{
int num;
int pri;
bool operator <(const node &dd)const{
return num<dd.num;
}
};
int main()
{
int n, m;
int i, j; node a[600]; while(scanf("%d %d", &n, &m)!=EOF)
{
for(i=0; i<m; i++){
scanf("%d", &a[i].num);
a[i].pri=m-i;
}
a[m].num=n; a[m].pri=0; int pos;
sort(a, a+m+1); int sum=0, cur;
for(i=0; i<=m; i++){
if(a[i].num ==n) pos=i;
}
cur=a[pos].num; i=pos-1; j=pos+1;
int dd, ff;
while(i>=0 && j<=m )
{
dd=cur-a[i].num;
ff=a[j].num-cur;
if(ff<dd){
printf("%d %d\n", a[j].num, ff);
sum+=ff;
cur=a[j].num;
j++;
}
else if(ff>dd){
printf("%d %d\n", a[i].num, dd);
sum+=dd;
cur=a[i].num;
i--;
}
else{
if(a[j].pri>a[i].pri){
printf("%d %d\n", a[j].num, a[j].num-cur );
sum+=(a[j].num-cur);
cur=a[j].num;
j++;
}
else{
printf("%d %d\n", a[i].num, cur-a[i].num);
sum+=(cur-a[i].num);
cur=a[i].num;
i--;
}
}
}
while(i<0 && j<=m){
printf("%d %d\n", a[j].num, a[j].num-cur);
sum+=(a[j].num-cur);
cur=a[j].num;
j++;
}
while(j>m && i>=0)
{
printf("%d %d\n", a[i].num, cur-a[i].num);
sum+=(cur-a[i].num);
cur=a[i].num;
i--;
}
//printf("i==%d j==%d\n", i, j);
double ans=(double)sum/m;
printf("%.2lf\n", ans); }
return 0;
}

sdut oj 操作系统实验--SSTF磁盘调度算法【操作系统算法】的更多相关文章

  1. SDUT OJ 数据结构实验之图论十:判断给定图是否存在合法拓扑序列

    数据结构实验之图论十:判断给定图是否存在合法拓扑序列 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Prob ...

  2. SDUT OJ 数据结构实验之图论八:欧拉回路

    数据结构实验之图论八:欧拉回路 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Problem Descrip ...

  3. SDUT OJ 数据结构实验之图论六:村村通公路(最小生成树)

    数据结构实验之图论六:村村通公路 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Problem Descri ...

  4. SDUT OJ 数据结构实验之图论五:从起始点到目标点的最短步数(BFS)

    数据结构实验之图论五:从起始点到目标点的最短步数(BFS) Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss P ...

  5. SDUT OJ 数据结构实验之图论四:迷宫探索

    数据结构实验之图论四:迷宫探索 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Problem Descrip ...

  6. SDUT OJ 数据结构实验之二叉树八:(中序后序)求二叉树的深度

    数据结构实验之二叉树八:(中序后序)求二叉树的深度 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Probl ...

  7. SDUT OJ 数据结构实验之二叉树七:叶子问题

    数据结构实验之二叉树七:叶子问题 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Problem Descri ...

  8. SDUT OJ 数据结构实验之二叉树六:哈夫曼编码

    数据结构实验之二叉树六:哈夫曼编码 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Problem Descr ...

  9. SDUT OJ 数据结构实验之二叉树五:层序遍历

    数据结构实验之二叉树五:层序遍历 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Problem Descri ...

随机推荐

  1. SpannableString 设置一段文字中部分字体颜色

    SpannableString strTitle = new SpannableString("病情描述(必填项,请至少填写20个字)"); strTitle.setSpan(ne ...

  2. go学习资料

    go书单 1.代码规范 https://github.com/golang/go/wiki/CodeReviewComments 2.基础知识 先看: https://github.com/mikel ...

  3. JQ多种刷新方式

    下面介绍全页面刷新方法:有时候可能会用到 window.location.reload()刷新当前页面. parent.location.reload()刷新父亲对象(用于框架) opener.loc ...

  4. cnn 实例

    http://www.geekcome.com/content-10-3761-1.html http://www.geekcome.com/content-10-3761-1.html http:/ ...

  5. vue实践---根据不同环境,自动转换请求的url地址

    一般的项目环境分为:本地环境,测试环境,预发环境,正式环境. 这些环境的域名一般是一样的, 前端请求接口的url也会随着这些环境的变化而改变,手动修改有点麻烦,所以想个办法,让请求的地址根据域名改变而 ...

  6. phpstudy配置php7.1.11 + phpstudy nginx伪静态

    切记要把新的php版本配到环境变量,cmd才会生效 php7.1.11下载地址 http://windows.php.net/download/ 下载之后,解压. 重名的为php-7.1.11-nts ...

  7. 高仿微信app (含有发红包,聊天,消息等)用到 Rxjava+Retrofit+MVP+Glide技术

    https://github.com/GitLqr/LQRWeChat 技术很牛,可以看看

  8. 【BZOJ3230】相似子串 后缀数组+二分+RMQ

    [BZOJ3230]相似子串 Description Input 输入第1行,包含3个整数N,Q.Q代表询问组数.第2行是字符串S.接下来Q行,每行两个整数i和j.(1≤i≤j). Output 输出 ...

  9. 【BZOJ3672】[Noi2014]购票 树分治+斜率优化

    [BZOJ3672][Noi2014]购票 Description  今年夏天,NOI在SZ市迎来了她30周岁的生日.来自全国 n 个城市的OIer们都会从各地出发,到SZ市参加这次盛会.       ...

  10. EasyDSS流媒体解决方案实现的实时数据统计报表、视频文件上传、点播、分享、集成代码等功能

    之前的EasyDSS作为rtmp流媒体服务器自从推出就备受用户好评,随着用户的需求的变更产品自身的发展是必须的: 为了更好的用户体验和和功能的完善,我们在EasyDSS的基础上增添了服务器硬件数据报表 ...