操作系统磁盘调度算法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
操纵体系课程设计义务书题目:磁盘调剂算法
院系:
专业:
班级:
姓名:
学号:
指点教师:
设计时光:
指导教师评语
目次
1.需求剖析4
4
4
7
2.概要设计8
8
8
8
3.具体设计9
11
13
4.运行成果及剖析14
15
16
5.总结和心得16
6.参考文献17
7.附录:程序源代码23
1.需求剖析
此次课程设计我研讨的标题是:磁盘调剂算法.具体包含三种算法分离是:先来先办事算法(FCFS).最短寻道时光优
先算法(SSTF).扫描算法(电梯调剂算法)(SCAN).
经由过程此次试验,加深对磁盘调剂算法的懂得,进一步控制先来先办事FCFS,最短寻道时光优先SSTF,扫描SCAN算法的实现办法.
装备的动态分派算法与过程调剂类似,也是基于必定的分派计谋的.经常应用的分派计谋有先请求先分派.优先级高者先分派等计谋.在多道程序体系中,低效力平日是因为磁盘类扭转装备应用不当造成的.操纵体系中,对磁盘的拜访请求来自多方面,经常须要列队.这时,对浩瀚的拜访请求按必定的次序响应,会直接影响磁盘的工作效力,进而影响体系的机能.拜访磁盘的时光因子由3部分构成,它们是查找(查找磁道)时光.等待(扭转等待扇区)时光和数据传输时光,个中查找时光是决议身分.是以,磁盘调剂算法先斟酌优化查找计谋,须要时再优化扭转等待计谋.
平均寻道长度(L)为所有磁道所需移动距离之和除以总的所需拜访的磁道数(N),即:L=(M1+M2+……+Mi+……+MN)/N
个中Mi为所需拜访的磁道号所需移动的磁道数.
启动磁盘履行输入输出操纵时,要把移动臂移动到指定的柱面,再等待指定扇区的扭转到磁头地位下,然后让指定的磁头进行读写,完成信息传送.是以,履行一次输入输出所花的时光有:
查找时光——磁头在移动臂带动下移动到指定柱面所花的时光. 延迟时光——指定扇区扭转到磁头下所需的时光. 传送时光——由磁头过程读写完成信息传送的时光.
个中传送信息所花的时光,是在硬件设计就固定的.而查找时光和延迟时光是与信息在磁盘上的地位有关.为了削减移动臂进行移动消费的时光,每个文件的信息不是按盘面上的磁道次序存放满一个盘面后,再放到下一个盘面上.而是按柱面存放,统一柱面上的各磁道被放满信息后,再放到下一个柱面上.所以各磁盘的编号按柱面次序,每个柱面按磁道次序,每个磁道又按扇区次序进行排序.
磁盘是可供多个过程共享的装备,当有多个过程都请求拜访磁盘是,应采取一种最佳调剂算法,以使各类过程对磁盘的平均拜访时光最小.因为在拜访磁盘的时光中,主如果寻道时光,是以,磁盘调剂的目的,是使磁盘的平均寻道时光起码.今朝经常应用的磁盘帝调剂算法有:先来先办事.最短寻道时光优先及扫描等算法.
先来先办事(FCFS)调剂:按先来后到次序办事,未作优化.
最简略的移臂调剂算法是“先来先办事”调剂算法,这个算法现实上不斟酌拜访者请求拜访的物理地位,而只是斟酌拜访者提出拜访请求的先后次序.例如,假如如今读写磁头正在50号柱面上履行输出操纵,而等待拜访者依次要拜访的柱面为130.199.32.159.15.148.61.99,那么,当50号柱面上
的操纵停止后,移动臂将按请求的先后次序先移到130号柱面,最后到达99号柱面.
采取先来先办事算法决议等待拜访者履行输入输出操纵的次序时,移动臂往返地移动.先来先办事算法消费的查找时光较长,所以履行输入输出操纵的总时光也很长.
最短查找时光优先调剂算法老是从等待拜访者中遴选查找时光最短的谁人请求先履行的,而不管拜访者到来的先后次序.如今仍应用统一个例子来评论辩论,如今当50号柱面的操纵停止后,应当先处理61号柱面的请求,然后到达32号柱面履行操纵,随后处理15号柱面请求,后继操纵的次序应当是99.130.148.159.199.
采取最短查找时光优先算法决议等待拜访者履行操纵的次序时,读写磁头总共移动了200多个柱面的距离,与先来先办事.算法比较,大幅度地削减了查找时光,因而缩短了为各拜访者请求办事的平均时光,也就进步了体系效力.
但最短查找时光优先(SSTF)调剂,FCFS会引起读写头在盘面上的大规模移动,SSTF查找距离磁头最短(也就是查找时光最短)的请求作为下一次办事的对象.SSTF查找模式有高度局部化的偏向,会推迟一些请求的办事,甚至引起无穷迁延(又称饥饿).
SCAN 算法又称电梯调剂算法.SCAN算法是磁头进步偏向上的最短查找时光优先算法,它清除了磁头在盘面局部地位
上的来去移动,SCAN算法在很大程度上清除了SSTF算法的
不公正性,但仍有利于对中央磁道的请求.
“电梯调剂”算法是从移动臂当前地位开端沿着臂的移动偏向去选择离当前移动臂比来的谁人柱拜访者,假如沿臂的
移动偏向无请求拜访时,就转变臂的移动偏向再选择.这比如
乘电梯,假如电梯已向上活动到4层时,依次有3位乘客陈生.
伍生.张生在等候乘电梯.他们的请求是:陈生在2层等待去
10层;伍生在5层等待去底层;张生在8层等待15层.因为
电梯今朝活动偏向是向上,所以电梯的形成是先把乘客张生
从8层带到15层,然后电梯换成下行偏向,把乘客伍生从5
层带到底层,电梯最后再更换偏向,把乘客陈生从2层送到
10层.
但是,“电梯调剂”算法在实现时,不但要记住读写磁头的当前地位,还必须记住移动臂的当前进步偏向.
2.概要设计
经由过程C说话的编程,设计程序模仿先来先办事FCFS,最短寻道时光优先SSTF,和扫描SCAN算法的工作过程.假设有n个磁道号所构成的磁道拜访序列,给定开端磁道号m和磁头移动的偏向(正向或者反向),分离应用不合的磁盘调剂算法拜访磁道序列,给出磁头每一次移动的过程,算出磁头移动的距离,继而盘算每种算法的平均寻道长度.
C说话.操纵体系磁盘调剂算法.C++.
Window10.VC++6.0.
3.具体设计
先来先办事算法(FCFS):
扫描
先来先办
compute_dis(m_vec,dis,average_distance);
}
最短寻道时光优先算法(SSTF):
void SSTF(vector<int>m_vec,int position){ //最短寻道时光算法
dis = 0;
average_distance = 0;
sort(m_vec.begin(),m_vec.end()); //从小到大排序
int i = 0;
for(vector<int>::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);
}
扫描SCAN算法:
void SCAN(vector<int>m_vec,int position){ //电梯调剂算法
dis = 0;
average_distance = 0;
sort(m_vec.begin(),m_vec.end()); //从小到大排序
int i = 0;
for(vector<int>::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);
}
4.运行成果及剖析
先来先办事算法(FCFS):
最短寻道时光优先算法(SSTF):
扫描SCAN算法:
FCFS :
这是一种比较简略的磁盘调剂算法.它依据过程请求拜访磁盘的先后次序进行调剂.此算法因为未对寻道进行
优化,在对磁盘的拜访请求比较多的情形下,此算法将下
降装备办事的吞吐量,致使平均寻道时光可能较长,但各
过程得到办事的响应时光的变更幅度较小.
SSTF:
该算法选择如许的过程,其请求拜访的磁道与当前磁头地点的磁道距离比来,以使每次的寻道时光最短,该算
法可以得到比较好的吞吐量,但却不克不及包管平均寻道
时光最短.
SCAN :
扫描算法不但斟酌到欲拜访的磁道与当前磁道的距离,更优先斟酌的是磁头的当前移动偏向.此算法根本上
战胜了最短寻道时光优先算法的办事分散于中央磁道和
响应时光变更比较大的缺陷,而具有最短寻道时光优先算
法的长处即吞吐量较大,平均响应时光较小,但因为是摆
动式的扫描办法,两侧磁道被拜访的频率仍低于中央磁道.
5.总结和心得
经由过程此次的课程设计使我熟悉到要将操纵体系这门盘算机专业的课学好不但仅是要把书上的根本常识学好并且还
要不竭进行实践,将所学的跟实践操纵联合起来才干更好地
巩固所学,才干进步本身实践才能.经由过程此次的设计使
我熟悉到只逗留在概况懂得问题是很难使问题得到很好的
解决的,实践才能与理论常识同样重要.可以说此课程设计
的理论难度其实不大,各类流图设计特殊是算法过程图的设
计很轻易疏忽操纵性细节,在现实调试中带来很大麻烦,须
要特殊留意,但是若要深刻挖掘个中的器械,并且现实去编
程实现,就碰到了相当大的难度.因为与之涉及的许多方面
并没有学过,须要本身去自学和实践磨练.经由过程模仿磁
盘调剂及过程列队算法来加深对操纵体系中各个磁臂调剂
算法概念的懂得模仿磁盘调剂算法,实现各类不合调剂算法
的过程,并盘算各算法的平均寻道长度,以便于我们断定各
类算法的好坏以及各类算法应用的场合.
6.参考文献
[1]. 汤子瀛,哲凤屏,汤小丹. 《盘算机操纵体系》.西安电子科
技大学出版社, 2005;
[2]. 谭浩强编著.《 C说话程序设计(第3版)》.清华大学出
版社,2005;
[3]. 吴乃陵,况迎辉. 《C++程序设计(第二版)》.高级教
导出版社,2005.
7.附录:程序源代码
FCFS:
#include <iostream>
#include <time.h>
#include <vector>
#include<algorithm>
#include <math.h>
#include <stdlib.h>
#include <cstring>
#include <windows.h>
#include <fstream>
using namespace std;
int position = 0; //当前磁道地位
int dis = 0;
double average_distance = 0;
void request(vector<int>&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(vector<int>m_vec,int &dis,double
&average_distance){
average_distance = (double)dis / (double)m_vec.size(); }
void FCFS(vector<int>m_vec,int position){ //先来先办事算法
dis = 0;
average_distance = 0;
for(vector<int>::iterator
it=m_vec.begin();it!=m_vec.end();it++){
dis += abs(position-*it);
Sleep(500);
cout<<"->"<<*it;
position = *it;
}
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");
vector<int>m_vec;
request(m_vec,outfile); //请求办事序列
cout<<"磁盘请求的办事状态:"<<endl;
FCFS(m_vec, position);
print();
outfile.close();
return 0;
}
SSTF:
#include <iostream>
#include <time.h>
#include <vector>
#include <math.h>
#include <stdlib.h>
#include<algorithm>
#include <cstring>
#include <windows.h>
#include <fstream>
using namespace std;
int position = 0; //当前磁道地位
int dis = 0;
double average_distance = 0;
void request(vector<int>&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(vector<int>m_vec,int &dis,double
&average_distance){
average_distance = (double)dis / (double)m_vec.size(); }
void SSTF(vector<int>m_vec,int position){ //最短寻道时光算法
dis = 0;
average_distance = 0;
sort(m_vec.begin(),m_vec.end()); //从小到大排序
int i = 0;
for(vector<int>::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");
vector<int>m_vec;
request(m_vec,outfile); //请求办事序列
cout<<"磁盘请求的办事状态:"<<endl;
SSTF(m_vec, position);
print();
outfile.close();
return 0;
}
SCAN:
#include <iostream>
#include <time.h>
#include <vector>
#include <math.h>
#include <stdlib.h>
#include<algorithm>
#include <cstring>
#include <windows.h>
#include <fstream>
using namespace std;
int position = 0; //当前磁道地位
int dis = 0;
double average_distance = 0;
void request(vector<int>&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(vector<int>m_vec,int &dis,double
&average_distance){
average_distance = (double)dis / (double)m_vec.size(); }
void SCAN(vector<int>m_vec,int position){ //电梯调剂算法
dis = 0;
average_distance = 0;
sort(m_vec.begin(),m_vec.end()); //从小到大排序
int i = 0;
for(vector<int>::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");
vector<int>m_vec;
request(m_vec,outfile); //请求办事序列 cout<<"磁盘请求的办事状态:"<<endl;
SCAN(m_vec, position);
print();
outfile.close();
return 0;
}。