磁盘调度算法的模拟实现.docx
《磁盘调度算法的模拟实现.docx》由会员分享,可在线阅读,更多相关《磁盘调度算法的模拟实现.docx(10页珍藏版)》请在冰豆网上搜索。
![磁盘调度算法的模拟实现.docx](https://file1.bdocx.com/fileroot1/2023-1/30/9e1fe181-3a08-4669-9241-2ce65de12e98/9e1fe181-3a08-4669-9241-2ce65de12e981.gif)
磁盘调度算法的模拟实现
磁盘调度算法的模拟实现
学院
专业
学号
学生姓名
指导教师姓名
2014年3月19日
2.3具体内容.......................................3
一、课设简介
1.1课程设计题目
磁盘调度算法的模拟实现1
1.2程序设计目的
操作系统课程设计是计算机专业重要的教学环节,它为学生提供了一个既动手又动脑,将课本上的理论知识和实际有机的结合起来,独立分析和解决实际问题的机会。
1)进一步巩固和复习操作系统的基础知识。
2)培养学生结构化程序、模块化程序设计的方法和能力。
3)提高学生调试程序的技巧和软件设计的能力。
4)提高学生分析问题、解决问题以及综合利用C语言进行程序设计的能力。
1.3设计要求
1)磁头初始磁道号,序列长度,磁道号序列等数据可从键盘输入,也可从文件读入。
2)最好能实现磁道号序列中磁道号的动态增加。
3)磁道访问序列以链表的形式存储
4)给出各磁盘调度算法的调度顺序和平均寻道长度
二、设计内容
2.1功能实现
设计并实现一个本别利用下列磁盘调度算法进行磁盘调度的模拟程序。
1)先来先服务算法FCFS
2)最短寻道时间优先算法SSTF
2.2流程图
2.3具体内容
1)先来先服务算法FCFS
这是一种比较简单的磁盘调度算法。
它根据进程请求访问磁盘的先后次序进行调度。
此算法的优点是公平、简单,且每个进程的请求都能依次得到处理,不会出现某一进程的请求长期得不到满足的情况。
此算法由于未对寻道进行优化,在对磁盘的访问请求比较多的情况下,此算法将降低设备服务的吞吐量,致使平均寻道时间可能较长,但各进程得到服务的响应时间的变化幅度较小。
2)最短寻道时间优先算法SSTF
该算法选择这样的进程,其要求访问的磁道与当前磁头所在的磁道距离最近,以使每次的寻道时间最短,该算法可以得到比较好的吞吐量,但却不能保证平均寻道时间最短。
其缺点是对用户的服务请求的响应机会不是均等的,因而导致响应时间的变化幅度很大。
在服务请求很多的情况下,对内外边缘磁道的请求将会无限期的被延迟,有些请求的响应时间将不可预期。
三、测试数据
3.1先来先服务算法
输入磁道序列:
555839189016015038184
当前磁道号:
100
3.2最短寻道时间优先算法
(1)当前磁道号大于磁道序列中的最大的磁道号时
输入磁道序列:
555839189016015038184
当前磁道号:
100
3.3测试结果
四、源代码
#include
#include
#include
usingnamespacestd;
typedefstructnode
{
intdata;
structnode*next;
}Node,*Linklist;
voidmain()
{
voidCreate_Linklist(Node*);
voidfcfs();//声明先来先服务函数FCFS
voidsstf();//声明最短寻道时间优先函数SSTF
voidprint(Node*);//输出链表函数
ints;//s是选择哪个算法
printf("**************磁盘调度算法***************\n");
printf("\t***1,先来先服务算法FCFS\n");
printf("\t***2,最短寻道时间优先算法SSTF\n");
printf("\t***0,退出\n");
printf("\t***请选择:
");
scanf("%d",&s);
while(s!
=0)
{
switch(s)
{
case1:
printf("\t\t********你选择了:
先来先服务算法FCFS\n");
fcfs();
break;
case2:
printf("\t\t******你选择了:
最短寻道时间优先算法SSTF\n");
sstf();
break;
}
printf("\t\t*******退出请选0,继续请选1,2,\n");
scanf("%d",&s);
}
}
/******************************************************************/
voidfcfs()//先来先服务算法
{
voidCreate_Linklist(Node*);
voidprint(Node*);
intLength_Linklist(Node*);
Node*l,*head;//*m,*n;*/
floatnum=0;//num为平均寻道长度
intc,f;
head=(Node*)malloc(sizeof(Node));
head->next=NULL;
printf("**************新建一个单链表,以0作为结束标志:
********\n");
Create_Linklist(head);
c=Length_Linklist(head);
printf("\t\t******从几号磁道开始:
********");
scanf("%d",&f);//f为磁道号
print(head);
printf("\t***链表长度为:
%d\n",c);
l=head->next;
for(inti=0;i{
num+=abs(l->data-f);
f=l->data;
l=l->next;
}
num=num/c;
printf("\t\t*****先来先服务的寻道顺序是:
\n");
print(head);
printf("\t\t******平均寻道长度:
%f\n",num);
}
/*****************************************************************/
voidsstf()//最短寻道时间优先算法
{
voidCreate_Linklist(Node*);
voidprint(Node*);
intLength_Linklist(Node*);
Node*p,*q,*r,*s,*l,*m,*head;
intc,f;
head=(Node*)malloc(sizeof(Node));
head->next=NULL;
printf("**************新建一个单链表,以0作为结束标志:
********\n");
Create_Linklist(head);
c=Length_Linklist(head);
printf("\t\t******从几号磁道开始:
********");
scanf("%d",&f);//f为磁道号
print(head);
printf("\t***链表长度为:
%d\n",c);
l=(Node*)malloc(sizeof(Node));
l->next=NULL;
m=l;
q=head;
p=head->next;
s=head;
r=head->next;
floatnum=0;
for(inti=0;i{
intmin=abs(f-r->data);
for(intj=0;j{
p=p->next;
q=q->next;
if(abs(f-p->data){
min=abs(f-p->data);
r=p;
s=q;
}
}
num+=abs(f-r->data);
f=r->data;
s->next=r->next;
r->next=NULL;
m->next=r;
m=r;
q=head;
p=head->next;
s=head;
r=head->next;
}
num=num/c;
printf("\t\t******最短寻道时间优先顺序是:
\n");
print(l);
printf("\t\t*********平均寻道长度:
%f\n",num);
}
/*********************************************************/
voidprint(Node*head)//输出链表
{
Node*p;
p=head->next;
cout<<"单链表显示:
";
if(p==NULL)
{
printf("单链表为空:
\n");
}
elseif(p->next==NULL)
{printf("%d\t",p->data);
printf("\n");
}
else
{
while(p->next!
=NULL)
{
printf("%d\t",p->data);
p=p->next;
}
printf("%d\t",p->data);
printf("\n");
}
}
/*********************************************************/
voidCreate_Linklist(Node*head)//创建链表
{
Node*p,*q;
inti;
scanf("%d",&i);
q=head;
while(i!
=0)
{
p=(Node*)malloc(sizeof(Node));
p->next=NULL;
p->data=i;
q->next=p;
q=p;
cin>>i;
}
/*c++;*/
}
/**************************************************/
intLength_Linklist(Node*head)//计算链表长
{
intl;
Node*p;
p=head->next;
l=1;
while(p->next)
{
p=p->next;
l++;
}
returnl;
}
五、总结
通过此次课程设计,我对操作系统的基础知识了解得更透彻了,同时对磁盘调度的四种算法——先来先服务算法(FCFS)、最短寻道时间优先算法(SSTF)、有了更深刻的理解和掌握,使我能够为磁盘调度选择适当的算法,提高CPU工作效率。
设计过程中遇到的困难在老师和同学的帮助下顺利解决并通过了验收,我深刻认识到算法的逻辑性对程序的重要影响,算法的准确度对程序运行结果的重要影响,这对我以后在操作系统的学习中有极大帮助。