磁盘调度实验报告.docx
《磁盘调度实验报告.docx》由会员分享,可在线阅读,更多相关《磁盘调度实验报告.docx(11页珍藏版)》请在冰豆网上搜索。
磁盘调度实验报告
实验五磁盘调度
实验学时:
2学时
实验类型:
设计
实验要求:
必修
一、实验目的:
磁盘是高速、大容量、旋转型、可直接存取的存储设备。
它作为计算机系统的辅助存储器,担负着繁重的输入输出工作,在现代计算机系统中往往同时会有若干个要求访问磁盘的输入输出要求。
系统可采用一种策略,尽可能按最佳次序执行访问磁盘的请求。
由于磁盘访问时间主要受寻道时间T的影响,为此需要采用合适的寻道算法,以降低寻道时间。
本实验要求学生模拟设计一个磁盘调度程序,观察调度程序的动态运行过程。
通过实验让学生理解和掌握磁盘调度的职能。
二、实验内容:
模拟电梯调度算法,对磁盘进行移臂操作
三、提示及要求:
1、假设磁盘只有一个盘面,并且磁盘是可移动头磁盘。
2、磁盘是可供多个进程共享的存储设备,但一个磁盘每个时刻只能为一个进程服务。
当有进程在访问某个磁盘时,其它想访问该磁盘的进程必须等待,直到磁盘一次工作结束。
当有多个进程提出输入输出请求而处于等待状态时,可用电梯调度算法从若干个等待访问者中选择一个进程,让它访问磁盘。
为此设置“驱动调度”进程。
3、由于磁盘与处理器是并行工作的,所以当磁盘在为一个进程服务时,占有处理器的其它进程可以提出使用磁盘(这里我们只要求访问磁道),即动态申请访问磁道,为此设置“接受请求”进程。
4、为了模拟以上两个进程的执行,可以考虑使用随机数来确定二者的允许顺序,程序结构图参考附图:
5、“接受请求”进程建立一张“进程请求I/O”表,指出等待访问磁盘的进程要求访问的磁道,表的格式如下:
进程名
要求访问的磁道号
6、“磁盘调度”的功能是查“请求I/O”表,当有等待访问的进程时,按电梯调度算法(SCAN算法)从中选择一个等待访问的进程,按其指定的要求访问磁道。
SCAN算法参考课本第九章。
算法模拟框图略。
7、附图中的“初始化”工作包括:
初始化“请求I/O”表,设置置当前移臂方向;当前磁道号。
并且假设程序运行前“请求I/O”表中已有若干进程(4~8个)申请访问相应磁道。
四、实验报告:
1、实验题目。
2、程序中用到的数据结构及其说明。
3、打印源程序并附注释。
4、实验结果内容如下:
打印“请求I/O”表,当前磁道号,移臂方向,被选中的进程名和其要求访问的磁道,看是否体现了电梯调度(SCAN)算法。
5、体会与问题。
五、附图:
开始
初始化
磁盘调度
随机数>1/2
继续?
接受请求
输入在[0,1]区间内的随机数
结束
六实验源程序
主函数控制台main.cpp
#include
#include"node.h"
#include"fcfs.h"
#include"sstf.h"
#include"scan.h"
voidmain()
{
structnode*first=creatlist();
intn=0;
while(n!
=4)
{
cout<<"请输入你的选择:
\n1:
先来先服务(FCFS)\n";
cout<<"2:
最短寻道时间优先(SSTF)\n3:
扫描(SCAN)\n4:
退出\n";
cin>>n;
switch(n)
{
case1:
fcfs(first);break;
case2:
sstf(first);break;
case3:
scan(first);break;
case4:
break;
default:
break;
}
}
}
先来先服务FCFS.h
#ifndefFCFS_H
#defineFCFS_H
#include
voidfcfs(structnode*first)
{
inttotal=0;
structnode*p=first->next;
intstart=p->track;
intlast=p->track;
cout<<"该算法扫描磁道的顺序为\n";
while(p)
{
total+=abs(start-last);
//cout<cout<track<<"->";
p=p->next;
if(p)
{
last=start;
start=p->track;
}
}
cout<<"\n先来先服务总共寻道长度:
"<cout<<"先来先服务平均寻道长度:
"<}
#endif
电梯调度算法scan.h
#ifndefSCAN_H
#defineSCAN_H
structnode*search1(structnode*,structnode*,int);
voiddel1(structnode*,structnode*);
voidscan(structnode*first)
{
structnode*p=first->next;
structnode*head=newnode;
head->next=NULL;
cout<<"该算法扫描磁道的顺序为\n";
while(p)
{
structnode*s=newnode;
s->num=p->num;
s->track=p->track;
insert(head,s);
p=p->next;
}
structnode*p2=head->next;
structnode*p1=head;
inttotal=0;
while(head->next)
{
while
(1)
{
cout<track<<"->";
del1(p1,p2);
p1=search1(head,p2,1);
if(p1==NULL)
{
break;
}
if(p1->next)
{
total+=abs(p2->track-p1->next->track);
}
p2=p1->next;
}
while
(1)
{
p1=search1(head,p2,-1);
if(p1==NULL)
{
break;
}
if(p1->next)
{
total+=abs(p2->track-p1->next->track);
}
p2=p1->next;
cout<track<<"->";
del1(p1,p2);
}
}
cout<<"\n扫描(SCAN)一共寻道长度:
"<cout<<"扫描(SCAN)平均寻道长度:
"<}
structnode*search1(structnode*head,structnode*p2,inta)
{
structnode*q=head->next,*re=NULL,*q1=head;
inta1=0,a2=0;
if(q)
{
a1=a*(q->track-p2->track);
}
while(q)
{
a2=a*(q->track-p2->track);
if((a1<0&&a2>=0)||(0<=a2&&a2<=a1))
{
re=q1;
a1=a2;
}
q1=q;
q=q->next;
}
returnre;//返回相对当前磁道距离最短的磁道的前一进程要求访问的磁道位置
}
voiddel1(structnode*p1,structnode*p2)
{
p1->next=p2->next;
}
#endif
最短距离优先调度算法sstf..h
#ifndefSSTF_H
#defineSSTF_H
structnode*search(structnode*,structnode*);
voiddel(structnode*,structnode*);
voidsstf(structnode*first)
{
structnode*p=first->next;
structnode*head=newnode;
head->next=NULL;
cout<<"该算法扫描磁道的顺序为\n";
while(p)
{
structnode*s=newnode;
s->num=p->num;
s->track=p->track;
insert(head,s);
p=p->next;
}
structnode*p2=head->next;
structnode*p1=head;
inttotal=0;
while(p2)
{
cout<track<<"->";
del(p1,p2);
p1=search(head,p2);
if(p1->next)
{
total+=abs(p2->track-p1->next->track);
}
p2=p1->next;
}
cout<<"\n最短寻道时间优先一共寻道长度:
"<cout<<"最短寻道时间优先平均寻道长度:
"<}
structnode*search(structnode*head,structnode*p2)
{
structnode*q=head->next,*re=head,*q1=head;
inta1=0,a2=0;
if(q)
{
a1=abs(q->track-p2->track);
}
while(q)
{
a2=abs(q->track-p2->track);
if(a2{
re=q1;
a1=a2;
}
q1=q;
q=q->next;
}
returnre;//返回相对当前磁道距离最短的磁道的前一进程要求访问的磁道位置
}
voiddel(structnode*p1,structnode*p2)
{
p1->next=p2->next;
}
#endif
公共节点头信息node.h
#ifndefNODE_H
#defineNODE_H
structnode
{
intnum;//进程号
inttrack;//进程要求访问的磁道号
node*next;
};
structnode*creatlist();
voidinsert(structnode*first,structnode*s);//插入一个节点(尾插法)
structnode*creatlist()
{
structnode*first=newnode;
first->next=NULL;
inttrackk[10]={100,55,58,39,18,90,160,150,38,184};
for(inti=0;i<10;i++)
{
structnode*s;
s=newnode;
s->num=i;
s->track=trackk[i];
insert(first,s);
}
returnfirst;
}
voidinsert(structnode*first,structnode*s)
{
structnode*r=first;
structnode*p;
while(r){p=r;r=r->next;}
p->next=s;p=s;
p->next=NULL;
}
#endif
七实验结果