当前位置:文档之家› 磁盘调度算法的模拟实现

磁盘调度算法的模拟实现

磁盘调度算法的模拟实现学院专业学号学生姓名指导教师姓名2014年3月19日目录一、课设简介 (2)1.1 课程设计题目 (2)1.2 课程设计目的 (2)1.3 课程设计要求 (2)二、设计内容 (3)2.1功能实现 (3)2.2流程图 (3)2.3具体内容 (3)三、测试数据 (4)3.3 测试用例及运行结果 (4)四、源代码 (5)五、总结 (12)5.1 总结............................................一、课设简介1.1课程设计题目磁盘调度算法的模拟实现11.2程序设计目的操作系统课程设计是计算机专业重要的教学环节,它为学生提供了一个既动手又动脑,将课本上的理论知识和实际有机的结合起来,独立分析和解决实际问题的机会。

1)进一步巩固和复习操作系统的基础知识。

2)培养学生结构化程序、模块化程序设计的方法和能力。

3)提高学生调试程序的技巧和软件设计的能力。

4)提高学生分析问题、解决问题以及综合利用C语言进行程序设计的能力。

1.3 设计要求1)磁头初始磁道号,序列长度,磁道号序列等数据可从键盘输入,也可从文件读入。

2)最好能实现磁道号序列中磁道号的动态增加。

3)磁道访问序列以链表的形式存储4)给出各磁盘调度算法的调度顺序和平均寻道长度二、设计内容2.1 功能实现设计并实现一个本别利用下列磁盘调度算法进行磁盘调度的模拟程序。

1) 先来先服务算法FCFS 2) 最短寻道时间优先算法SSTF 2.2流程图2.3具体内容1)先来先服务算法FCFS这是一种比较简单的磁盘调度算法。

它根据进程请求访问磁盘的先后次序进行调度。

此算法的优点是公平、简单,且每个进程的请求都能依次得到处理,不会出现某一进程的请求长期得不到满足的情况。

此算法由于未对寻道进行优化,在对磁盘的访问请求比较多的情开始 选择算法 F C F S S S T F 结束况下,此算法将降低设备服务的吞吐量,致使平均寻道时间可能较长,但各进程得到服务的响应时间的变化幅度较小。

2)最短寻道时间优先算法SSTF该算法选择这样的进程,其要求访问的磁道与当前磁头所在的磁道距离最近,以使每次的寻道时间最短,该算法可以得到比较好的吞吐量,但却不能保证平均寻道时间最短。

其缺点是对用户的服务请求的响应机会不是均等的,因而导致响应时间的变化幅度很大。

在服务请求很多的情况下,对内外边缘磁道的请求将会无限期的被延迟,有些请求的响应时间将不可预期。

三、测试数据3.1 先来先服务算法输入磁道序列:55 58 39 18 90 160 150 38 184当前磁道号:1003.2 最短寻道时间优先算法(1)当前磁道号大于磁道序列中的最大的磁道号时输入磁道序列:55 58 39 18 90 160 150 38 184当前磁道号:1003.3 测试结果四、源代码#include<iostream>#include<cmath>#include<stdio.h> using namespace std;typedef struct node {int data;struct node *next;}Node,*Linklist;void main(){void Create_Linklist(Node *);void fcfs();//声明先来先服务函数FCFSvoid sstf();//声明最短寻道时间优先函数SSTFvoid print(Node *); //输出链表函数int s; //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){case 1:printf("\t\t********你选择了:先来先服务算法FCFS\n");fcfs();break;case 2:printf("\t\t******你选择了:最短寻道时间优先算法SSTF\n");sstf();break;}printf("\t\t*******退出请选0,继续请选1,2,\n");scanf("%d",&s);}}/********************************************************** ********/void fcfs()//先来先服务算法{void Create_Linklist(Node *);void print(Node *);int Length_Linklist(Node *);Node *l,*head;//*m,*n;*/float num=0; //num为平均寻道长度int c,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(int i=0;i<c;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);}/********************************************************** *******/void sstf()//最短寻道时间优先算法{void Create_Linklist(Node *);void print(Node *);int Length_Linklist(Node *);Node *p,*q,*r,*s,*l,*m,*head;int c,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;float num=0;for(int i=0;i<c;i++){int min=abs(f-r->data);for(int j=0;j<c-i-1;j++){p=p->next;q=q->next;if(abs(f-p->data)<min){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);}/*********************************************************/ void print(Node *head) //输出链表{Node *p;p=head->next;cout<<"单链表显示:";if(p==NULL){printf("单链表为空:\n");}else if(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");}}/*********************************************************/ void Create_Linklist(Node *head)//创建链表{Node *p,*q;int i;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++;*/}/**************************************************/int Length_Linklist(Node *head)//计算链表长{int l;Node *p;p= head->next;l=1;while(p->next){p=p->next;l++;}return l;}五、总结通过此次课程设计,我对操作系统的基础知识了解得更透彻了,同时对磁盘调度的四种算法——先来先服务算法(FCFS)、最短寻道时间优先算法(SSTF)、有了更深刻的理解和掌握,使我能够为磁盘调度选择适当的算法,提高CPU工作效率。

相关主题