磁盘调度算法课程设计

2024-04-13

磁盘调度算法课程设计(共6篇)

篇1:磁盘调度算法课程设计

1.实验题目:

磁盘调度算法。

建立相应的数据结构;

在屏幕上显示磁盘请求的服务状况;

将一批磁盘请求的情况存磁盘文件,以后可以读出并重放; 计算磁头移动的总距离及平均移动距离; 支持算法:FIFO、SSTF、SCAN、CSCAN;

2.设计目的:

调度磁盘I/O请求服务,采用好的方式能提高访问时间和带宽。本实验通过编程对磁盘调度算法的实现,加深对算法的理解,同时通过用C++语言编写程序实现这些算法,并在windos平台上实现,更好的掌握操作系统的原理以及实现方法,提高综合运用专业课知识的能力。

3.任务及要求

3.1 设计任务

编程实现下述磁盘调度算法,并求出每种算法的平均寻道长度:

1、先来先服务算法(FCFS)

2、最短寻道时间算法(SSTF)

3、扫描算法(SCAN)

4、循环扫描算法(CSCAN)

3.2 设计要求

对用户指定的磁盘调度请求序列,基于以上四种算法,实现各自的调度顺序并输出,同时计算出各种算法下的平均寻道长度。

4.算法及数据结构

4.1算法的总体思想

queue[n] 为请求调度序列,diskrode为磁盘磁道数,headstarts为正在调度的磁道

①先来先服务算法(FCFS)按queue[n]数组的顺序进行磁盘调度,将前一个调度磁道与下一个调度磁道的差值累加起来,得到总的寻道长度,再除以n得到平均寻道长度。

②最短寻道时间优先算法(SSTF)将queue[n]进行由小到大的排序,首先定位当前调度磁headstarts在queue[n]的位置,通过循环语句找出离起始磁头最短的位置。

③扫描算法(SCAN)

将queue[n]进行由小到大的排序,首先定位当前调度磁headstarts在queue[n]的位置,然后在此位置按给定的方向遍历queue[n],当道端点(queue[0]或queue[n-1])时,再在定位处反向遍历到另一端。当调度磁道不在queue端点时,总的寻道长度为为前一个磁道与后一个磁

道差值的累加,当到达端点且queue[n]未全调度时,总寻道长度加上端点值再加上下一个调度磁道的值,再按前面的算法进行,直到磁道全部都调度完毕,得到总的寻道长度,除以n得到平均寻道长度。

④循环扫描算法(CSCAN)将queue[n]进行由小到大的排序,首先定位当前调度磁headstarts在queue[n]的位置,然后在此位置按给定的方向遍历queue[n],当道端点(queue[0]或queue[n-1])时,反向到另一端点再以此方向进行遍历,直到queue[n]中所有都调度完。当调度磁道不在queue端点时,总的寻道长度为为前一个磁道与后一个磁道差值的累加,当到达端点且queue[n]未全调度时,总寻道长度加上端点值再加上磁盘磁道总长度,再加上下一个调度磁道的值,再按前面的算法进行,直到磁道全部都调度完毕,得到总的寻道长度,除以n得到平均寻道长度。

5、源代码:

#include #include #include void menu(){ cout<<“*********************菜单*********************”<

1、先来先服务算法(FCFS)**********”<

cout<<“******

2、最短寻道时间优先算法(SSTF)**********”<

cout<<“******

3、扫描算法(SCAN)**********”<

cout<<“******

4、循环扫描算法(CSCAN)**********”<

cout<<“******

5、退出 **********”<

/*======================初始化序列=======================*/ void init(int queue[],int queue_copy[],int n){ int i;for(i=0;i

//对当前正在执行的磁道号进行定位,返回磁道号小于当前磁道中最大的一个 int fix(int queue[], int n, int headstarts){ int i =0;while(iqueue[i]){ i++;} if(i>n-1)return n-1;//当前磁道号大于磁盘请求序列中的所有磁道 if(i==0)return-1;//当前磁道号小于磁盘请求序列中的所有磁道 else return i-1;//返回小于当前磁道号中最大的一个 } /*=================使用冒泡算法从小到大排序==============*/ int *bubble(int queue[],int m){ int i,j;int temp;for(i=0;i queue[j]){ temp=queue[i];queue[i]=queue[j];queue[j]=temp;} } cout<<“排序后的磁盘序列为:”;for(i=0;i

/* ====================以下是FCFS算法==================*/ void FCFS(int queue[],int n,int diskrode,int headstarts)//queue是请求调度序列,n为其个数,diskroad为磁盘磁道数,headstarts为正在调度的磁道 { cout<<“************以下为FCFS调度算法***********”<queue[0])count +=headstarts-queue[0];else count+=queue[0]-headstarts;cout<<“调度序列为: ”;cout<queue[i+1])count +=queue[i]-queue[i+1];else count +=queue[i+1]-queue[i];} cout<

/*=====================SSTF算法====================*/ void SSTF(int queue[], int n, int diskrode, int headstarts){ int k=1;int l,r;int i,j,count=0;queue =bubble(queue,n);cout<<“************以下为SSTF调度算法***********”<=0;i--)cout<=headstarts)//若当前磁道号小于请求序列中最小者,则直接由内向外依次给予各请求服务 { cout<<“磁盘扫描序列为: ”;cout<queue[0] && headstarts =0)&&(r

-headstarts)){ cout<=0;j--){ cout<

/*======================以下是SCAN算法====================*/ void SCAN(int queue[], int n, int diskrode, int headstarts){ int direction, i, fixi;cout<<“***********以下是SCAN调度算法*************”<>direction;double count=0;*bubble(queue,n);fixi = fix(queue,n,headstarts);cout<=0;i--){ cout<=0;i--)//从大到小 { cout<-1;i--){ cout<-1;i--)//从大到小 { cout<

/*======================以下是CSCAN算法====================*/ void CSCAN(int queue[],int n,int diskrode,int headstarts){ int direction,i,fixi;cout<<“***********以下是CSCAN调度算法*************”<>direction;int count=0;//count表示磁道移动的长度 *bubble(queue,n);fixi=fix(queue,n,headstarts);cout<<“调度序列为: ”<-1;--i){ cout<-1;--i){ cout<-1;i--){ cout<fixi;i--){ cout<

void main(){ int n, i, diskrode, headstarts;//n表示调度磁盘请求序列queue的长度,diskrode表示磁盘磁道的个数,headstarts表示目前正在调度的磁道; cout<<“请输入磁盘的总磁道数:”<> diskrode;cout<<“请输入磁盘调度请求序列个数:”<>n;int *queue;queue =(int*)malloc(n*sizeof(int));//给quneue数组分配空间...int *queue_copy;queue_copy =(int*)malloc(n*sizeof(int));cout<<“请依次输入该序列的值:”<>queue[i];for(i=0;i>headstarts;int menux;menu();cout<<“请按菜单选择,输入相应的数字: ”;cin>>menux;while(menux!=0){ if(menux ==1)FCFS(queue,n,diskrode,headstarts);

if(menux ==2)SSTF(queue,n,diskrode,headstarts);

if(menux ==3)SCAN(queue,n,diskrode,headstarts);if(menux ==4)CSCAN(queue,n,diskrode,headstarts);if(menux ==5)cout<<“程序结束,谢谢使用!”<>menux;cout<

篇2:磁盘调度算法课程设计

目 录 1 课程设计目的及要求……………………………………………………错误!未定义书签。2 相关知识…………………………………………………………………错误!未定义书签。3 题目分析…………………………………………………………………2 4 概要设计…………………………………………………………………2 4.1 先来先服务(FCFS)的设计思想……………………………….2 4.2 最短寻道时间优先调度(SSTF)的设计思想…………………..2 4.3 扫描算法(SCAN)的设计思想…………………………………2 4.4 循环扫描(CSCAN)的设计思想………………………………..2 5 代码及流程………………………………………………………………3 5.1 流程图……………………………………………………………...3 5.2 源代码……………………………………………………………...8 6 运行结果…………………………………………………………………16 7 设计心得…………………………………………………………………19 参考文献…………………………………………………………………………19

沈阳理工大学 沈阳理工大学课程设计专用纸 No1 1 课程设计目的及要求

设计目的:加深对操作系统原理的进一步认识,加强实践动手能力和程序开发能力的培养,提高分析问题解决问题的能力,培养合作精神,以巩固和加深磁盘调度的概念。操作系统是一门工程性很强的课程,它不仅要求学生掌握操作系统的工作原理和理论知识,也要求学生的实际动手能力,以加深对所学习内容的理解,使学生熟练地掌握计算机的操作方法,使用各种软件工具,加强对课程内容的理解。这次课程设计,就是通过模拟磁臂调度来加深对操作系统中磁臂调度概念的理解。使学生熟悉磁盘管理系统的设计方法;加深对所学各种磁盘调度算法的了解及其算法的特点。

设计要求:编程序实现下述磁盘调度算法,并求出每种算法的平均寻道长度;要求设计主界面可以灵活选择某算法,且以下算法都要实现

1、先来先服务算法(FCFS)

2、最短寻道时间优先算法(SSTF)

3、扫描算法(SCAN)

4、循环扫描算法(CSCAN)相关知识

数据结构:数组 now:当前磁道号;

array[]:放置磁道号的数组;

void FCFS(int array[],int m)先来先服务算法(FCFS)void SSTF(int array[],int m)最短寻道时间优先算法(SSTF)void SCAN(int array[],int m)扫描算法(SCAN)void CSCAN(int array[],int m)循环扫描算法(CSCAN)磁盘调度:当有多个进程都请求访问磁盘时,采用一种适当的驱动调度算法,使各进程对磁盘的平均访问(主要是寻道)时间最小。目前常用的磁盘调度算法有:1)闲来先服务2)最短寻道时间优先3)扫描算法4)循环扫描算法等

沈阳理工大学 沈阳理工大学课程设计专用纸 No2 3 题目分析

选择一个自己熟悉的计算机系统和程序设计语言模拟操作系统基本功能的设计方法及其实现过程

完成各分项功能。在算法的实现过程中,要求可决定变量应是动态可变的;同时模块应该有一个合理的输出结果。具体可参照实验的程序模拟.各功能程序要求自行编写程序实现,不得调用现有操作系统提供的模块或功能函数。磁盘调度程序模拟。先来先服务调度算法.最短寻道时间优先调度,循环(SCAN)调度算法。程序设计语言自选,最终以软件(含源代码以及执行程序)和设计报告的形式提交课程设计结果.。磁盘调度让有限的资源发挥更大的作用。在多道程序设计的计算机系统中,各个进程可能会不断提出不同的对磁盘进行读/写操作的请求。由于有时候这些进程的发送请求的速度比磁盘响应的还要快,因此我们有必要为每个磁盘设备建立一个等待队列。概要设计

1.先来先服务(FCFS)的设计思想

即先来的请求先被响应。FCFS策略看起来似乎是相当“公平”的,但是当请求的频率过高的时候FCFS策略的响应时间就会大大延长。FCFS策略为我们建立起一个随机访问机制的模型,但是假如用这个策略反复响应从里到外的请求,那么将会消耗大量的时间。为了尽量降低寻道时间,看来我们需要对等待着的请求进行适当的排序,而不是简单的使用FCFS策略。这个过程就叫做磁盘调度管理。有时候fcfs也被看作是最简单的磁盘调度算法。

2.最短寻道时间优先调度(SSTF)的设计思想

最短时间优先算法选择这样的进程。要求访问的磁道,与当前磁头所在的磁道距离最近,以使每次的寻道时间最短。

3.扫描算法(SCAN)的设计思想

扫描(SCAN)调度算法:该算法不仅考虑到欲访问 的磁道与当前磁道间的距离,更优先考虑的是磁头当前的移动方向。例如,当磁头正在自里向外移动时,SCAN算法所考虑的下一个访问对象,应是其欲访问的磁道,既在当前磁道之外,又是距离最近的。这样自里向外的访问,直至再无更外的磁道需要访问时,才将磁道换向自外向里移动。这时,同样也是每次选择这样的进程来调度,也就是要访问的当前位置内距离最近者,这样,磁头又逐步地从外向里移动,直至再无更里面的磁道要访问,从而避免了出现“饥饿”现像。

4.循环扫描(CSACN)的设计思想

循环扫描(CSCAN)算法:当磁头刚从里向外移动而越过了某一磁道时,恰好又有一进程请求访问此磁道,这时,该里程就必须等待,为了减少这种延迟,CSCAN算法规定磁头单向移动,而本实验过程中我们所设计的是磁头从里向外移动,而从外向里移动时只须改方向而已,本实验未实现。但本实验已完全能演示循环扫描的全过程。

沈阳理工大学 沈阳理工大学课程设计专用纸 No3 5 代码及流程

1.先来先服务(FCFS)

图 1—1 FCFS的流程图

沈阳理工大学 沈阳理工大学课程设计专用纸 No4 2.最短寻道时间优先调度(SSTF)

图1—2 SSTF的流程图

沈阳理工大学 沈阳理工大学课程设计专用纸 No5 3.扫描算法(SCAN)

图1—3 SCAN的流程图

沈阳理工大学 沈阳理工大学课程设计专用纸 No6 4.循环扫描(CSCAN)

图1—4 CSCAN的流程图

沈阳理工大学 沈阳理工大学课程设计专用纸 No7

图1—5 主函数的流程图

沈阳理工大学 沈阳理工大学课程设计专用纸 No8 源代码:

#include“stdio.h” #include“stdlib.h” //#include“iostream.h” #define maxsize 100 //定义最大数组域

//先来先服务调度算法 void FCFS(int array[],int m){ int sum=0,j,i;int avg;printf(“n FCFS调度结果: ”);for(i=0;i

} avg=sum/(m-1);//计算平均寻道长度 printf(“n 移动的总道数: %d n”,sum);printf(“平均寻道长度: %d n”,avg);}

//最短寻道时间优先调度算法 void SSTF(int array[],int m){ int temp;int k=1;int now,l,r;int i,j,sum=0;int avg;for(i=0;iarray[j])//两磁道号之间比较 { temp=array[i];

沈阳理工大学 沈阳理工大学课程设计专用纸 No9 array[i]=array[j];array[j]=temp;} } } for(i=0;i

for(i=m-1;i>=0;i--)//将数组磁道号从大到小输出 printf(“%d ”,array[i]);sum=now-array[0];//计算移动距离 } else if(array[0]>=now)//判断整个数组里的数是否都大于当前磁道号 {

for(i=0;i=0)&&(r

printf(“%d ”,array[l]);sum+=now-array[l];//计算移动距离 now=array[l];l=l-1;} else

沈阳理工大学 沈阳理工大学课程设计专用纸 No10 {

printf(“%d ”,array[r]);sum+=array[r]-now;//计算移动距离 now=array[r];r=r+1;} } if(l=-1){

for(j=r;j

printf(“%d ”,array[j]);} sum+=array[m-1]-array[0];//计算移动距离 } else {

for(j=l;j>=0;j--){

printf(“%d ”,array[j]);} sum+=array[m-1]-array[0];//计算移动距离 } } avg=sum/m;printf(“n 移动的总道数: %d n”,sum);printf(“平均寻道长度: %d n”,avg);} //扫描算法

void SCAN(int array[],int m)//先要给出当前磁道号和移动臂的移动方向 { int temp;int k=1;int now,l,r,d;int i,j,sum=0;int avg;for(i=0;iarray[j])//对磁道号进行从小到大排列

沈阳理工大学 沈阳理工大学课程设计专用纸 No11 { temp=array[i];array[i]=array[j];array[j]=temp;} } } for(i=0;i

printf(“n SCAN调度结果: ”);for(i=m-1;i>=0;i--){ printf(“%d ”,array[i]);//将数组磁道号从大到小输出 } sum=now-array[0];//计算移动距离 } else if(array[0]>=now)//判断整个数组里的数是否都大于当前磁道号 {

printf(“n SCAN调度结果: ”);for(i=0;i

沈阳理工大学 沈阳理工大学课程设计专用纸 No12 { for(j=l;j>=0;j--){ printf(“%d ”,array[j]);} for(j=r;j=0;j--){ printf(“%d ”,array[j]);} sum=-now-array[0]+2*array[m-1];//计算移动距离 }//磁道号增加方向 } avg=sum/m;printf(“n 移动的总道数: %d n”,sum);printf(“平均寻道长度: %d n”,avg);}

//循环扫描算法

void CSCAN(int array[],int m){ int temp;int k=1;int now,l,r,d;int i,j,sum=0;int avg;for(i=0;iarray[j])//对磁道号进行从小到大排列

沈阳理工大学 沈阳理工大学课程设计专用纸 No13 { temp=array[i];array[i]=array[j];array[j]=temp;} } } for(i=0;i

printf(“n CSCAN调度结果: ”);for(i=0;i

printf(“%d ”,array[i]);//将磁道号从小到大输出 } sum=now-array[0]+array[m-1];//计算移动距离 } else if(array[0]>=now)//判断整个数组里的数是否都大于当前磁道号 {

printf(“n CSCAN调度结果: ”);for(i=0;i

printf(“%d ”,array[i]);//将磁道号从小到大输出 } sum=array[m-1]-now;//计算移动距离 } else { while(array[k]

沈阳理工大学 沈阳理工大学课程设计专用纸 No14 { for(j=l;j>=0;j--){ printf(“%d ”,array[j]);} for(j=m-1;j>=r;j--){ printf(“%d ”,array[j]);} sum=2*(array[m-1]-array[0])-array[r]+now;//计算移动距离 }//磁道号减小方向 else { for(j=r;j

// 操作界面 int main(){ int c;FILE *fp;//定义指针文件

int cidao[maxsize];//定义磁道号数组 int i=0,count;fp=fopen(“cidao.txt”,“r+”);//读取cidao.txt文件 if(fp==NULL)//判断文件是否存在 { printf(“n 请 先 设 置 磁 道!n”);exit(0);} while(!feof(fp))//如果磁道文件存在

沈阳理工大学 沈阳理工大学课程设计专用纸 No15 { fscanf(fp,“%d”,&cidao[i]);//调入磁道号 i++;} count=i-1;printf(“n-------------------n”);printf(“ 10-11OS课程设计--磁盘调度算法系统n”);printf(“

计算机科学与技术二班n”);printf(“

姓名:宋思扬n”);printf(“

学号:0803050203n”);printf(“

电话:************n”);printf(“

2010年12月29日n”);printf(“n-------------------n”);printf(“n 磁道读取结果:n”);for(i=0;i

1、先来先服务算法(FCFS)n”);printf(“

2、最短寻道时间优先算法(SSTF)n”);printf(“

3、扫描算法(SCAN)n”);printf(“

4、循环扫描算法(CSCAN)n”);printf(“ 5.退出n”);printf(“n”);printf(“请选择:”);scanf(“%d”,&c);if(c>5)break;switch(c)//算法选择 { case 1: FCFS(cidao,count);//先来先服务算法 printf(“n”);break;case 2: SSTF(cidao,count);//最短寻道时间优先算法 printf(“n”);break;case 3:

沈阳理工大学 沈阳理工大学课程设计专用纸 No16 SCAN(cidao,count);//扫描算法 printf(“n”);break;case 4: CSCAN(cidao,count);//循环扫描算法 printf(“n”);break;case 5: exit(0);} } return 0;} 6 运行结果

图2—1 运行界面

沈阳理工大学 沈阳理工大学课程设计专用纸 No17

图2—2 运行FCFS的界面

图2—3 运行SSTF的界面

图2—4 运行SCAN的界面

沈阳理工大学 沈阳理工大学课程设计专用纸 No18

图2—5 运行SCAN的界面

图2—6 运行CSCAN的界面

图2—7 运行CSCAN的界面

沈阳理工大学 沈阳理工大学课程设计专用纸 No19 运行结果: 四种磁盘调度运行结果正确,与预期的相符。设计心得

此次操作系统的课程设计,从理论到实践,在两个星期的日子里,可以说是苦多于甜,但是可以学到很多很多的的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。

本次实验首先要了解磁盘调度的工作原理及四种调度方法的工作原理。在课程设计前的准备工作时,先把这部分工作做完了。在设计总的程序框架的时候,要注意各功能模块的位置,尽量做到简洁、有序;各功能模块与主程序要正确衔接。

在设计的过程中遇到许多问题,我设计的是四种调度算法中的后两种。例如:在最初程序设计时主要有两种构思:1)选用数据结构是链表的。2)选用数组。我最初尝试了用链表,觉得方便易懂,但是在循环扫描处出现了些问题,后来又转变了设计思路,选用了数组,直接进行排序,然后再联系到各功能模块。

同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,自身知识的很多漏洞,看到了自己的实践经验还是比较缺乏,理论联系实际的能力还急需提高。比如说编语言掌握得不好,应用程序编写不太会……通过这次课程设计之后,一定把以前所学过的知识重新温故。在此,也感谢在课程设计过程中帮我解惑的老师和同学。参考文献

[1] 《操作系统》

人民邮电出版社

宗大华 宗涛 陈吉人 编著

[2] 《C语言程序设计》

清华大学出版社

马秀丽 刘志妩 李筠 编著 [3] 《操作系统实验指导书》 沈阳理工大学

唐巍 菀勋 编著

篇3:磁盘调度算法课程设计

常用的磁盘调度方法是磁盘轮巡法。即以循环链表的形式组织磁盘,按链表中磁盘的先后顺序存储信息,即第一个磁盘存储满后在将信息存储到下一个磁盘,直到所有磁盘存储满后再将信息覆盖存储到第一个磁盘,如此循环,直到链表中最后一个磁盘存满。该方法容易实现,在存储路数比较少的情况其性能良好。但如果存储路数比较多时会造成多图同时访问一个磁盘而其他磁盘长时间空闲的情况,会大大降低磁盘访问效率,严重时会造成系统瓶颈和存储数据丢失,系统的可靠性和稳定性收到严重威胁。基于此本文提出了一种基于磁盘剩余空间和被访问频度的多磁盘存储调度算法。

1 基于磁盘剩余空间和被访问频度的多磁盘存储调度算法

该算法实现的基本思想是将多路存储分到多个磁盘上。这样可以有效不让多路存储都访问一个磁盘上,达到解决I/0访问瓶颈问题的目的。即将存储路数除以磁盘数得到每个磁盘分配的平均存储路数。考虑到磁盘存储空间大小不等,多路存储时会出现大容量磁盘被集中访问的情况,从而降低磁盘访问效率,基于上述问题,本文提出了一种多磁盘存储调度算法,该算法综合考虑磁盘剩余空间大小和被访问的频度。该算法的思想是尽可能让各个磁盘均分存储路数,避免大容量磁盘被集中访问从而造成I/O访问的困难问题。

1.1 数据结构实现算法

实现算法的目的是当前被访问频度以及各磁盘的剩余存储空间大小的综合考虑,采用一种策略能够选择下一路存储访问那一个磁盘。因此该算法建立一个描述磁盘使用情况的数据结构如下:

基于该数据结构的数组各元素组成了当前磁盘信息表,某一个时刻该表的内容可能如表1所示。

表1为监控系统的某一个计算机中所有磁盘的情况描述,各磁盘剩余空间比例是每个磁盘的剩余空间占所有磁盘空间之和的比例;当前访问线程数目是当前每个磁盘正在被访问的线程数;最大访问线程数目为该磁盘在指定条件下所允许被访问的最大线程数目,其计算公式为:最大访问线程数目=该磁盘剩余空间比例×该磁盘当前被访问的路数。

1.2 算法过程描述

该存储调度算法主要步骤如下:

Step1:利用磁盘接口函数,计算出各磁盘剩余空间大小。

Step2:由Step1,计算整个剩余空间,并由此计算出各磁盘剩余空间占整个剩余空间的比例。

Step3:计算各磁盘最大访问线程数目,计算方法为:最大访问线程数目=该磁盘剩余空间比例×该磁盘当前被访问的路数。作为该磁盘所能容纳的访问线程的最大数和1/2最大数。

Step4:排序,按剩余空间的升序对磁盘信息结构数组各元素排列顺序。

Step5:对该数组中排过序的各数组元素即各个磁盘的情况进行判断,第一次将访问请求分配剩余空间比最大而且线程访问数目没有达到1/2最大访问线程数目的磁盘。若该磁盘线程访问数目超过1/2最大访问线程数目时,则选择第二个较大且满足条件的磁盘来分配最新线程访问请求。

Step6:若所有磁盘的访问线程数目都达到1/2最大访问线程数目,则将最新的访问请求分配给剩余空间最大且当前访问线程数目没有达到最大访问线程数据的磁盘。

Step7:若所有磁盘的访问线程数目均已达到最大访问线程数目,则无磁盘可用,返回信息给系统。

1.3 存储调度算法过程分析

从以上算法步骤可以看出,该算法始终以各磁盘剩余空间和磁盘当前访问线程数目最为调度算法的重要参数。根据磁盘剩余空间比参数可以避免小磁盘很快被存满及多路存储同时访问同一个磁盘的情况。优先考虑大容量磁盘的存储,在各个磁盘中分配容量大小比较平均数据,按比例减少各个磁盘的存储空间。

在该算法中构造了1/2最大访问线程数目作为中间标准对磁盘存储按照存储空间大小进行两次分配,第一次当所有磁盘的访问线程数目低于这个标准时,分配剩余空间最大的磁盘,若该磁盘已无剩余存储空间则选择次大的磁盘。当所有磁盘当前访问线程数目达到这个标准时,再按磁盘剩余容量大小进行二次分配,这样设计的优点是在算法的开始执行阶段能够降低同时访问剩余空间最大磁盘的线程的数目,平均分配多路访问线程,提高了磁盘的访问效率。

2 一种定时检测增加磁盘剩余空间算法的提出

视频监控系统基于多磁盘存储数据,通常采用简单的磁盘轮巡存储算法,该算法在磁盘存储空间快满,造成存储空间不够的时候,则停止存储,根据旧文件优先删除的算法来删除一部分旧文件释放存储空间。但该算法的致命缺点是很容易造成数据正常存储时中断,导致监控系统数据丢失。为解决上述问题,提出了一种定时检测增加磁盘当前剩余空间的算法。

2.1 定时检测增加磁盘剩余控件算法思想及其描述

该算法的主要思想为:为了保证监控系统视频存储的稳定、持续进行,为每一个磁盘的剩余空间设置一个阈值bSpace,系统后台中设置一个定期检测磁盘剩余空间的线程,按照预先设定的频率,周期性地检测磁盘剩余空间,若发现磁盘剩余空间rSpace低于预先设定的阈值bSpace,则对磁盘运行旧文件循环删除算法,删除磁盘中的旧文件,直到磁盘的剩余空间达到阈值为止。

阈值的选择非常重要也比较困难,大小必须合适,如果阈值过大,则监控系统会频繁的访问磁盘,删除旧文件以释放存储空间,使监控系统的性能下降;过小则达不到确保监控系统视频存储的稳定和持续运行,不丢失数据的目的。必须根据监控系统硬件实际情况和各种不同存储的要求,对比实验数据,得出大小适合的阈值,此外,检测的频率(检测的时间间隔iTime)过快和过慢也会造成同样的问题出现,也需要根据对比实验和监控系统实际情况来确定该参数。

存储调度决定将哪个磁盘分配给当前路存储时,该路存储即占用了磁盘的一个存储资源,以保证该路存储能够在单位时间内有足够的存储空间来利用。如果当前系统没有可利用的存储资源,释放一部分存储空间以空出一个存储资源,如果该路存储实际占用的空间(SPr)小于存储资源所占用的存储空间<SPa>,则将存储结束后剩余的这部分空间<SPa-SPr>回收,用于以后分配(存储资源:单位时间内、单路存储所需占用的存储空间大小)。

每个磁盘都需要为存储分配、释放资源,可以定义Si为第I个磁盘可利用的资源数目, FreeSource Num为系统要释放的资源数目:分配资源、释放资源可以描述为:

(1)分配资源

(2)释放资源

从上述算法执行过程可知,该算法能确保磁盘剩余空间始终稳定的保持在一个比较理想的值,这样就可以比较好的确保了存储的稳定,防止发生存储抖动的现象。磁盘剩余空间阈值bSpace与检测时间间隔iTime值的设定也非常重要,两者过高会使得系统资源被大量占用,造成系统整体性能下降。过低又不能确保磁盘剩余控件不能满足存储要求,造成存储出现错误而异常中断,严重的会造成数据丢失等。

在实际系统开发中,经过大量试验,选取bSpace取值为800MB,iTime取2ms取得了较好效果。

2.2 基于定时检测增加剩余空间算法存储子系统的实现

基于该算法的存储子系统的结构如图1所示,主要功能模块包括:存储初始化模块、视频存储模块和存储过程异常检测与修复模块等部分组成。

存储初始化:该部分主要为启动存储进程及后续动作设置相关参数,为其操作做好准备。主要包括:为存储进程设置设备参数及后续动作所需的其他参数等。

视频存储线程:该部分主要存储经过压缩输出的视频流数据。

异常检测与修复:该部分主要检测一些不可预见的异常文件数据存储情况,并对发生的数据存储错误进行修复。

存储空间监测与释放:该部分完成对磁盘剩余空间的检测,如果磁盘剩余控件小于预先设定的阈值,根据一定的策略计算出需要释放的空间或警报,提示用户手动删除旧文件释放磁盘空间。

存储调度模块:该模块主要负责利用系统主线程去调度子线程。当程序启动时,主线程负责完成与存储相关的一些初始化以及根据需要切换子线程的状态(包括档开始、档切换、档结束、线程结束)的切换等,而子线程负责各个状态的处理。

3 结束语

视频监控存储过程中,海量数据轻松和解决冲突的存储空间,一直是研究的问题,视频信息的存储解决方案的选择,仍然是现场监测的重点之一,如果大量存储的所有废物绑定到一个存储空间上,形成很大的存储容量,如何设置存储策略,采用什么样的存储解决方案,将直接影响系统的使用性能。

参考文献

[1]魏轶伟,熊剑平.基于IP的存储网络技术[J].计算机工程与应用,2002,38(13):156-157.

[2]肖庆华.几种典型网络存储系统的存储管理技术研究[D].武汉:华中科技大学图书馆,2005.

[3]李桂,苏一丹.基于NAS的存储技术探讨与应用[J].信息网络安全,2003,5:44-46.

[4]Mark F.IP SANS FOR VIDEO STORAGE[J].Emedia.Wilton,Jan.2003,16(1):14.

[5]视频监控应用中的存储解决之道[J].中国现代教育装备,2005(8):100-101.

篇4:算法设计与分析课程教学改革

关键词 算法设计与分析 算法 教学内容 教学方法 实践教学

中图分类号:G64 文献标识码:A

算法是计算机的“灵魂”,它决定了计算机软件性能的优劣,因此,《算法设计与分析》是计算机科学与技术、软件工程等信息类相关专业重要的基础课程和核心课程。通过该课程的学习,让学生掌握算法设计的基本策略,理解和掌握算法设计的主要方法,培养学生对算法的复杂性进行正确分析的能力、独立分析和解决问题的能力,为将来从事软件设计与开发或相关领域科学研究工作奠定坚实的基础。

1算法设计与分析课程教学存在的问题

在多年的课程教学过程中,笔者发现有相当一部分学生对该课程的认识不够,学习热情不高,缺乏学习的主动性,甚至对该课程在计算机人才培养中的地位产生怀疑,由于这些问题的存在,从而导致课程教学效果不佳,课程的教学很难达到预期的目标。经过调查和分析,我们发现造成这一状况的原因主要表现为以下几点:

(1)课程对先修课程的要求高:该课程需要学生具有较好的c/c++程序设计、离散数学、计算数学、数据结构等先修课程的基础。学生必须扎实掌握这些课程的基础知识后,才能更好的进行算法的设计及实现。

(2)课程知识点多,内容抽象,难度大: 本课程涉及大量的算法设计技术和方法,例如递归技术与分治法、贪心法、动态规划法、回溯法、分支限界法等,而且都比较抽象,同时灵活性强,因此学生很难掌握。

2改革措施

为了让学生更好的掌握算法设计方法,并且灵活运用这些方法解决实际问题,结合笔者多年的教学实践经验,在教学内容的选择、教学方法的改进、实践教学内容的组织等方面进行了一些探索和改革,并取得了较好的效果。

2.1针对学生的实际情况,合理的选择教学内容

由于受生源质量和前期基础课程学习情况的影响,我校计算机专业学生离《算法设计与分析》课程对理论知识和编程能力的要求有一定的距离,因此选择合适的教学内容对提高教学效果就起着决定性的作用。我们的整体思路是“宁缺勿滥,精讲细讲,举一反三”。

2.2采用多种教学方法,提高教学质量

(1)采用案例教学法,让抽象地算法具体化,激发学生学习兴趣。

从实际的案例出发引入算法问题,通过抽象与总结,使得抽象的算法变得具体,拉近课程与现实的距离,激发学生的学习兴趣。例如在讲解时间复杂度和空间复杂度时,我们以百度之星的嘟嘟熊数列为实例进行讲解。看到这道题时,学生最容易想到的是常规的穷举法,其时间复杂度O(n)。此时可以提问学生该方法有何缺陷有学生提出当n为109时存储空间过大,于是进一步启发学生应该如何去解决。通过引导,最后发现数列只会出现2种循环节:1123581347和1459,序列的非循环字符最多20位,开辟的存储空间30个足够,算法的复杂度为0。通过此例的讲解学生对时间复杂度就有了深刻的理解,显然比纯粹的介绍概念要生动得多。

(2)利用知识的相互联系,为新知识的讲解寻找一个切入点。

在讲解知识点时,先从学生熟悉的内容出发,引入课程的知识要点,让学生既了解课程间的相互联系,又找到了知识的应用领域,通过知识的相互联系,降低学习难度,培养学习兴趣。例如在讲解大整数乘法前,可以先引入RSA加密算法,既拓宽了知识面,又让学生知道了大整数乘法的实际应用领域,从而激发了学生的学习兴趣,让学生变被动学习为主动学习,改善学习效果。

2.3实践教学的改革

实践教学环节可以强化学生对知识的理解,让学生应用所学的知识解决具体问题,培养学生的实践动手能力。通过实验学生可以更好地掌握算法理论,并灵活应用算法思想来解决实际问题。在教学中,我们借助ACM程序设计平台,把ACM竞赛题目作教学内容,充实了实验教学的内涵。ACM竞赛题目趣味性强,知识覆盖度高,非常适合作为课程实验的补充和提高。为了提高学生的综合应用能力,除完成课内实验外,学生还可以参与教师的各类研究课题,帮助教师完成科研任务,随着项目开展, 学生有机会参与项目的分析、设计和实现,在项目中发现问题,解决问题,培养了各方面的能力。

3结语

在《算法设计与分析》的教学实践中,通过将算法理论与实际应用相结合,合理组织教学内容,丰富教学方法和手段,采用项目驱动方式对实践教学环节进行改革,增强了教学效果。

基金项目:

吉首大学教改项目 (2013JSUJGB15);

吉首大学重点实验教改项目(2013SYJG015)。

参考文献

[1] 王晓东.计算机算法设计与分析(第4版) [M].北京:电子工业出版社,2013.

[2] 刘振章.《算法设计与分析》课程教学探讨[J].电脑知识与技术,2014,10(9):1995-1996.

[3] 林 劼,戴 波.项目驱动型算法设计与分析课程教学方法[J].计算机教育,2014,9:69-71.

[4] 张海藩.软件工程导论(第5版)[M].北京: 清华大学出版社,2013.

篇5:磁盘调度算法

磁盘服务的请求受文件分配方式的影响很大。读连续文件的程度将产生大量的在盘上挤在一起的请求,磁头的移动有限。而对于串连或索引文件来说,可能涉及在盘上广泛分配的盘块,要靠减少磁头移动来获取较好的磁盘使用效率。

目录和索引块的位置对I/O请求的队列有很重要的影响。如果文件的数据和它的目录项在盘上的位置相距很远,则磁头移动距离很长。如果把目录和索引块放在缓存中,则可明显减少磁头的移动,尤其对读请求更是如此。

篇6:磁盘调度[推荐]

磁 盘 调 度 实 践 报 告

姓名: 董宇超 班级:计算机一班 学号:0906010124

目录:

 实践内容  实践目的及意义  功能设计及数据结构  调试运行及测设分析  存在的问题及改进设想  实践体会  总结  参考文献

正文:

1.实践内容:

 假设磁盘只有一个盘面,并且磁盘是可移动头磁盘。 磁盘是可供多个进程共 享的存储设备,但一个磁盘每个时刻只能为一个进程服务。当有进程在访问 某个磁盘时,其它想访问该磁盘的进程必须等待,直到磁盘一次工作结束。当有多个进程提出输入输出请求而处于等待状态时,可用电梯调度算法从若 干个等待访问者中选择一个进程,让它访问磁盘。为此设置“驱动调度”进 程。

 由于磁盘与处理器是并行工作的,所以当磁盘在为一个进程服务时,占有处理器的其它进程可以提出使用磁盘(这里我们只要求访问磁道),即动 态申请访问磁道,为此设置“接受请求”进程。

要求模拟电梯调度算法,对磁盘进行移臂操作,编程实现。

2.实践目的:

磁盘是高速、大容量、旋转型、可直接存取的存储设备。它作为计算机 系统的辅助存储器,担负着繁重的输入输出工作,在现代计算机系统中往往 同时会有若干个要求访问磁盘的输入输出要求。

系统可采用一种策略,尽可能按最佳次序执行访问磁盘的请求。由于磁 盘访问时间主要受寻道时间T的影响,为此需要采用合适的寻道算法,以降 低寻道时间。

本实验要求模拟设计一个磁盘调度程序,观察调度程序的动态运 行过程。通过实验理解和掌握磁盘调度的职能。

3.功能设计:

由于程序简单,没有设计结构体,只定义了一下变量:

int m=0;//记录磁道数目

int n;//接受输入的磁道号

int disk[1000];//保存磁道序列

int currenttrack;//当前磁道号

int t;

int i=0,j=0,k=0;//循环参数

int option;//记录寻到方向

int sum=0;//统计寻道长度

源代码: #include void main(){ int m=0;//记录磁道数目

int n;//接受输入的磁道号

int disk[1000];//保存磁道序列

int currenttrack;//当前磁道号

int t;int i=0,j=0,k=0;//循环参数

int option;//记录寻到方向

int sum=0;//统计寻道长度

printf(“请输入当前的磁道号:”);scanf(“%d”,¤ttrack);

printf(“n--------------------1.向磁道号增加的方向访问--------------------”);printf(“n--------------------2.向磁道号减少的方向访问--------------------”);printf(“n请选择的当前磁头移动方向(1/2):”);scanf(“%d”,&option);

printf(“n请输入磁道请求序列(0~999并以<-1>结束):n”);scanf(“%d”,&n);while(n!=-1){

disk[i]=n;

m++;i++;

scanf(“%d”,&n);}

/* 冒泡排序 使磁道请求序列从小到大排序 */ for(j=0;j

for(i=0;i

{

if(disk[i]>disk[i+1])

{

t=disk[i];

disk[i]=disk[i+1];

disk[i+1]=t;

}

} }

/* 找到当前磁道号在磁道请求序列中的排序位置 */

k=0;for(i=0;i

k++;else

break;} printf(“n--------------电梯算法调度后的磁盘调度序列-------------n”);/* 第一种: 当前磁道号先向外再向里读 */ if(option==1){ for(i=k;i

printf(“%5d”,disk[i]);} for(i=k-1;i>=0;i--){

printf(“%5d”,disk[i]);} sum=2*(disk[m-1]-disk[k])+disk[k]-disk[0];printf(“n寻道长度为:%5d”,sum);} /* 第二种: 当前磁道号先向里再向外读 */ if(option==2){

for(i=k-1;i>=0;i--){

printf(“%d ”,disk[i]);

sum+=disk[i];}

for(i=k;i

printf(“%5d”,disk[i]);

sum+=disk[i];} sum=disk[m-1]-disk[k]+2*(disk[k]-disk[0]);printf(“n寻道长度为:%5d”,sum);

} printf(“n”);}

4.调试运行:

运行开始后出现如下界面,举例输入5:

然后出现:

1.先选择1(按按磁道号增加的方向寻道):

接着输入磁道序列,若要结束输入,输入-1即可:

然后出现如下寻道结果:

2.再选择2(按按磁道号减少的方向寻道):

接着输入磁道序列,若要结束输入,输入-1即可:

然后出现如下寻道结果:

5.存在的问题:

由于初次做操作系统模拟实验,所以程序设计中存在很多问题,例如:由于电梯算法是从当前的磁道号开始沿着预定的方向寻道,当本方向上的请求全部满足时,再反向寻道,但是程序模拟过程中,进程不能随着寻道的同时添加新的进程,使得电梯调度算法不能更好的体现。只能预先输入一串请求,然后只对这一段请求寻道。

改进之处:添加更高级的算法,使得请求能在寻道的同时加进来。

还有一些简单的已解决的问题,不一一列举了。

6.实践心得体会:

通过这次实践学会了不少内容,更深的理解了磁道调度的几种算法,而且学 会了系统的编写程序。在编程过程中,需要 查阅各种资料,并且学习前人的 编写方法,找出优劣,然后形成自己的思想,最终完成程序的编写。

通过模拟磁盘调度的电梯调度算法,并比较与其他调度算法的不同,懂得了 各种算法在不同情况下的作用。选择一个好的调度算法可以节约很多时间。

在模拟过程中出现过好多问题,有的解决了,有的还未解决,不管如何都是 一种收获。

在最初的时候,由于程序编写隐藏的错误,编译没有发现,却执行不下 去,然后改正错误,修复漏洞,最终满足实验要求。

7.总结:

为期一周的操作系统实践课结束了,编写了电梯调度算法的磁盘调度模 拟程序。电梯调度寻道方式就像电梯运行一样,就是沿一个方向寻道,直到 满足这一方向的所有请求,便反向寻道。在程序中添加了寻道长度的显示,以便将电梯调度的效率与其他磁盘调度算法比较。

8.参考文献:

1.操作系统教程(第4版)„„„„孙钟秀 主编 高等教育出版社;

上一篇:丰达矿调度室工作职责下一篇:水循环和洋流演讲稿