实验七磁盘调度
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验七磁盘调度
一、实验目的:
磁盘是高速、大容量、旋转型、可直接存取的存储设备。它作为计算机系统的辅助存储器,担负着繁重的输入输出工作,在现代计算机系统中往往同时会有若干个要求访问磁盘的输入输出要求。系统可采用一种策略,尽可能按最佳次序执行访问磁盘的请求。
由于磁盘访问时间主要受寻道时间T的影响,为此需要采用合适的寻道算法,以降低寻道时间。本实验要求模拟设计一个磁盘调度程序,观察调度程序的动态运行过程。通过实验来理解和掌握磁盘调度的职能。
二、实验容:
分别模拟如下电梯调度算法,对磁盘进行移臂操作:
●先来先服务算法
●最短寻道优先算法
●电梯算法
三、实验要求:
1、假设磁盘只有一个盘面,并且磁盘是可移动头磁盘。
2、磁盘是可供多个进程共享的存储设备,但一个磁盘每个时刻只能为一个进程服务。
当有进程在访问某个磁盘时,其它想访问该磁盘的进程必须等待,直到磁盘一次工
作结束。当有多个进程提出输入输出请求而处于等待状态时,可用磁盘调度算法从
若干个等待访问者中选择一个进程,让它访问磁盘。为此设置“驱动调度”进程。
3、由于磁盘与处理器是并行工作的,所以当磁盘在为一个进程服务时,占有处理器的
其它进程可以提出使用磁盘(这里我们只要求访问磁道),即动态申请访问磁道,
为此设置“接受请求”进程。
4、为了模拟以上两个进程的执行,可以考虑使用随机数来确定二者的允许顺序,参考
程序流程图。
5、“接受请求”进程建立一“进程请求I/O”表,指出等待访问磁盘的进程要求访问
的磁道,表的格式如下:
6、磁盘调度的功能是查“请求I/O”表,当有等待访问的进程时,按磁盘调度算法从
中选择一个等待访问的进程,按其指定的要求访问磁道。流程图中的“初始化”工
作包括:初始化“请求I/O”表,设置当前移臂方向;当前磁道号。并且假设程序
运行前“请求I/O”表中已有若干进程(4~8个)申请访问相应磁道。
..
四、程序流程图:
五.参考程序代码:
#include
#include
#include
typedef struct node
{
int data;
struct node *next;
}Node;
void main()
{
void fcfs(Node *,int,int);//声明先来先服务函数FCFS
void sstf(Node *,int,int);//声明最短寻道时间优先函数SSTF
void scan(Node *,int,int);//声明扫描函数SCAN
void print(Node *); //输出链表函数
Node *head,*p,*q; //建立一个链表
int it,c=0,f,s; //c为链表长度,f是开始的磁道号,s是选择哪个算法head=(Node *)malloc(sizeof(Node));
head->next=NULL;
q=head;
..
cout<<" /**************磁盘调度算法***************/"< cout< cout<<"新建一个单链表,以0作为结束标志:"; cin>>it; while(it!=0) { p=(Node *)malloc(sizeof(Node)); p->next=NULL; p->data=it; q->next=p; q=p; cin>>it; c++; } cout<<"从几号磁道开始:"; cin>>f; //f为磁道号 print(head); cout<<"链表长度为:"< cout<<"1、先来先服务算法FCFS"< cout<<"2、最短寻道时间优先算法SSTF"< cout<<"3、电梯调度算法(扫描算法SCAN)"< cout<<"0、退出"< cout<<"请选择:"; cin>>s; while(s!=0) { switch(s) { case 1:cout<<"你选择了:先来先服务算法FCFS"< fcfs( head,c,f); break; case 2:cout<<"你选择了:最短寻道时间优先算法SSTF"< sstf( head,c,f); break; case 3:cout<<"你选择了:电梯调度算法(扫描算法SCAN)"< scan( head,c,f); break; } cout<<"退出请选0,继续请选1,2,3:"; cin>>s; } } /***********************************************************/ .. void fcfs(Node *head,int c,int f)//先来先服务算法 { void print(Node *); Node *l;//*m,*n; float num=0; //num为平均寻道长度 l=head->next; for(int i=0;i { num+=abs(l->data-f); f=l->data; l=l->next; } num=num/c; cout<<"先来先服务的寻道顺序是:"< print(head); cout<<"平均寻道长度:"< } /*****************************************************************/ void sstf(Node *head,int c,int f)//最短寻道时间优先算法 { void print(Node *); Node *p,*q,*r,*s,*l,*m; l=(Node *)malloc(sizeof(Node)); l->next=NULL; m=l; q=head; p=head->next; s=head; r=head->next; float num=0; for(int i=0;i { int min=abs(f-r->data); for(int j=0;j { p=p->next; q=q->next; if(abs(f-p->data) { min=abs(f-p->data); r=p; s=q; ..