- 1、本文档共9页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
实验五磁盘调度管理实验分析
实验五 磁盘调度管理实验
一、实验目的
用不同算法实现对磁盘调度的模拟实现,并比较各算法性能。
二、设备与环境
1. 硬件设备:PC机一台
2. 软件环境:安装Windows操作系统或者Linux操作系统,并安装相关的程序开发环境,如C \C++\Java 等编程语言环境。
三、实验要求
设计并实现一个分别利用下列磁盘调度算法进行磁盘调度的模拟程序。
? (1)扫描算法
? (2)循环扫描算法
设计要求:
?1. 磁头初始磁道号,磁头初始运动方向,序列长度,磁道号序列等数据可键盘输入。
? 2. 最好能实现磁道号序列中磁道号的动态增加。
? 3. 磁道访问序列以链表的形式存储。
? 4. 给出各磁盘调度算法的调度顺序和平均寻道长度。
四、实验设计参考
1.算法说明
(1)扫描算法(SCAN)
扫描算法不仅考虑到欲访问的磁道与当前磁道的距离,更优先考虑的是磁头的当前移动方向。例如,当磁头正在自里向外移动时,扫描算法所选择的下一个访问对象应是其欲访问的磁道既在当前磁道之外,又是距离最近的。这样自里向外地访问,直到再无更外的磁道需要访问才将磁臂换向,自外向里移动。这时,同样也是每次选择这样的进程来调度,即其要访问的磁道,在当前磁道之内,从而避免了饥饿现象的出现。由于这种算法中磁头移动的规律颇似电梯的运行,故又称为电梯调度算法。此算法基本上克服了最短寻道时间优先算法的服务集中于中间磁道和响应时间变化比较大的缺点,而具有最短寻道时间优先算法的优点即吞吐量较大,平均响应时间较小,但由于是摆动式的扫描方法,两侧磁道被访问的频率仍低于中间磁道。
2、循环扫描算法(CSCAN)
循环扫描算法是对扫描算法的改进。如果对磁道的访问请求是均匀分布的,当磁头到达磁盘的一端,并反向运动时落在磁头之后的访问请求相对较少。这是由于这些磁道刚被处理,而磁盘另一端的请求密度相当高,且这些访问请求等待的时间较长,为了解决这种情况,循环扫描算法规定磁头单向移动。例如,只自里向外移动,当磁头移到最外的被访问磁道时,磁头立即返回到最里的欲访磁道,即将最小磁道号紧接着最大磁道号构成循环,进行扫描。
2.主要功能模块流程图
程序参考代码如下:
#include iostream
#include string
#include conio.h
#include windows.h
#includeiomanip
#include stdlib.h
using namespace std;
class LinList;
struct LinNode
{
int no;
LinNode *next;
};
class LinList
{
private :
LinNode *head;
public :
int size;
LinList() //构造函数,用于构造头结点和声明长度
{
head=new LinNode;
head-next=NULL;
size=0;
}
void Insert(int no)//插入函数
{
LinNode *newnode=new LinNode;
newnode-no=no;
newnode-next=NULL;
Index(size-1)-next=newnode;
size++;
}
LinNode *Index(int i)//定位函数
{
if(i-1||isize-1)
{
cout ;
exit(0);
}
if(i==-1)return head;
if(i==0)return head-next;
LinNode *p=head-next;
int k=0;
while(p!=NULLki)
{
p=p-next;
k++;
}
return p;
}
void SCAN1(int start_place)//电梯调度算法(向外寻道)
{
cout -SCAN调度算法(向外寻道)如下: ;
float sum=0;
float ave;
int *a=sort();
for(int i=0;isize;i++)
{
if(start_place=a[i])
{for(int m=i;msize;m++)
{
if(i==0m==size-1)
{couta[m]endl;sum+=abs(a[m]-a[m-1]);}
else
{
couta[m]-;
if(m==i){sum+=abs(s
文档评论(0)