磁盘调度-操作系统

实验项目名称: 磁盘调度算法
一、实验目的
1、掌握Shortest Service Time First和电梯调度SCAN算法;
2、对磁盘工作的进一步了解。
二、实验内容
最短寻道时间优先Shortest Service Time First和电梯调度SCAN算法,
格式要求:
输入:
磁盘访问序列
当前磁头位置
输出:
调度顺序
总磁头移动磁道数
三、实验原理
SSTF:总是从等待访问者中挑选寻找时间最短的那个请求先执行的,而不管访问者到来的先后次序。 SSTF 查找距离磁头最短(也就是查找时间 最短)的请求作为下一次服务的对象。 SSTF 查找模式有高度局部化的倾向,会推迟一些请求的服务,甚至引起无限拖延(又称饥饿)。
SCAN:又称电梯调度算法。SCAN 算法是磁头前进方向上的最短查找时间优先算法,它排除了磁头在盘面局部位置上的往复移动,SCAN 算法在很大程度上消除了 SSTF 算法的不公平性,但仍有利于对中间磁道的请求。
四、程序框图
SSTF:

SCAN:

五、实验代码
(1)最短寻道时间优先算法 ( SSTF ) :
#include
#include <time.h>
#include
#include <math.h>
#include <stdlib.h>
#include
#include
#include <windows.h>
#include
using namespace std;
int position = 0; // 当前磁道位置
int dis = 0;
double average_distance = 0;
void request(vector&m_vec,ofstream &outfile){
cout<<" 随机生成磁盘序列: “<<endl;
int n = 0;
srand(time(NULL)); // 添加随机数种子
n = rand() % 20 + 1;
int temp = 0;
for(int i=0;i<n;i++){
temp = rand() % 100;
m_vec.push_back(temp);
cout<<temp<<” “;
outfile<<temp<<endl;
}
cout<<endl;
position = rand() % 100;
cout<<” 当前磁道: “<<position<<endl;
}
void compute_dis(vectorm_vec,int &dis,double &average_distance){
average_distance = (double)dis / (double)m_vec.size();
}
void SSTF(vectorm_vec,int position){ // 最短寻道时间算法
dis = 0;
average_distance = 0;
sort(m_vec.begin(),m_vec.end()); // 从小到大排序
int i = 0;
for(vector::iterator it=m_vec.begin();it!=m_vec.end();it++){
if(position >= *it)
i++;
}
int count = 0;
int left = i-1;
int right = i;
while(count<m_vec.size()){
if((left >=0 && abs(m_vec[right]-position) > abs(m_vec[left]-position)) || right>=m_vec.size()){
dis += abs(m_vec[left]-position);
Sleep(500);
cout<<”->"<<m_vec[left];
position = m_vec[left];
left–;
}
else{
dis += abs(m_vec[right]-position);
Sleep(500);
cout<<"->"<<m_vec[right];
position = m_vec[right];
right++;
}
count++;
}
compute_dis(m_vec,dis,average_distance);
}
void print(){
cout<<endl<<endl;
cout<<" 经计算,磁头移动的总距离为 :"<<dis<<endl;
cout<<" 磁头平均移动距离 :"<<average_distance<<endl;
cout<<endl<<endl;
}
int main(){
ofstream outfile;
outfile.open(“data.txt”);
vectorm_vec;
request(m_vec,outfile); // 请求服务序列
cout<<" 磁盘请求的服务状况: “<<endl;
SSTF (m_vec, position);
print();
outfile.close();
return 0;
}
(2)扫描 SCAN 算法 :
#include
#include <time.h>
#include
#include <math.h>
#include <stdlib.h>
#include
#include
#include <windows.h>
#include
using namespace std;
int position = 0; // 当前磁道位置
int dis = 0;
double average_distance = 0;
void request(vector&m_vec,ofstream &outfile){
cout<<” 随机生成磁盘序列: “<<endl;
int n = 0;
srand(time(NULL)); // 添加随机数种子
n = rand() % 20 + 1;
int temp = 0;
for(int i=0;i<n;i++){
temp = rand() % 100;
m_vec.push_back(temp);
cout<<temp<<” “;
outfile<<temp<<endl;
}
cout<<endl;
position = rand() % 100;
cout<<” 当前磁道: “<<position<<endl;
}
void compute_dis(vectorm_vec,int &dis,double &average_distance){
average_distance = (double)dis / (double)m_vec.size();
}
void SCAN(vectorm_vec,int position){ // 电梯调度算法
dis = 0;
average_distance = 0;
sort(m_vec.begin(),m_vec.end()); // 从小到大排序
int i = 0;
for(vector::iterator it=m_vec.begin();it!=m_vec.end();it++){
if(position >= *it)
i++; // 找到 position 所在的磁道
}
int left = i - 1; // 先从外到内扫描
int right = i;
while(left >= 0){
dis += abs(position - m_vec[left]);
Sleep(500);
cout<<”->"<<m_vec[left];
position = m_vec[left];
left --;
}
while(right < m_vec.size()){
dis += abs(position - m_vec[right]);
Sleep(500);
cout<<"->"<<m_vec[right];
position = m_vec[right];
right ++;
}
compute_dis(m_vec,dis,average_distance);
}
void print(){
cout<<endl<<endl;
cout<<" 经计算,磁头移动的总距离为 :"<<dis<<endl;
cout<<" 磁头平均移动距离 :"<<average_distance<<endl;
cout<<endl<<endl;
}
int main(){
ofstream outfile;
outfile.open(“data.txt”);
vectorm_vec;
request(m_vec,outfile); // 请求服务序列
cout<<" 磁盘请求的服务状况: "<<endl;
SCAN(m_vec, position);
print();
outfile.close();
return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值