天津理工大学操作系统实验3:磁盘调度算法的实现

合集下载

操作系统磁盘调度算法实验报告

操作系统磁盘调度算法实验报告
p=head->next;
while(p)
{
sum=sum+p->time;
p->averageTime=sum;
p=p->next;
SUM+=sum;
} return 0;
}
void print(linknode *head)
{
linknode *p;
p=head->next;
printf("各进程处理时间为:");
#include <stdlib.h>
int SUM=0,K=0;
typedef struct link
{
int time;
int averageTime;
int priority;
struct link *next;
}linknode;
linknode *creat()
{
int n,m;
linknode *head,*r,*s;
return 0;
}
2、最短寻道时间优先算法后的磁盘调度序列
源代码
#include<stdio.h>
void main()
{
int m=0,n,Seek[100],Flag[100],SCurrent,t,i=0,j,k,i0,j0;
printf("请输入当前的磁道号:");
scanf("%d",&SCurrent);
{
for(i=i0;i>=0;i--)
printf("%5d",Seek[i]);
k=-1;
}
// 3.当前磁道号在已排序的磁道序列的中间//

操作系统磁盘调度算法实验报告及代码

操作系统磁盘调度算法实验报告及代码

操作系统磁盘调度算法实验报告及代码一、实验目的通过实验掌握磁盘调度算法的实现过程,了解各种不同磁盘调度算法的特点和优缺点,并比较它们的性能差异。

二、实验原理磁盘调度是操作系统中的重要内容,其主要目的是提高磁盘的利用率和系统的响应速度。

常见的磁盘调度算法有:FCFS(先来先服务)、SSTF (最短寻道时间)、SCAN(扫描)、C-SCAN(循环扫描)等。

三、实验过程1.编写代码实现磁盘调度算法首先,我们需要定义一个磁盘请求队列,其中存放所有的IO请求。

然后,根据所选的磁盘调度算法,实现对磁盘请求队列的处理和IO请求的调度。

最后,展示运行结果。

以FCFS算法为例,伪代码如下所示:```diskQueue = new DiskQueue(; // 创建磁盘请求队列while (!diskQueue.isEmpty()request = diskQueue.dequeue(; // 取出队列头的IO请求//处理IO请求displayResult(; // 展示运行结果```2.运行实验并记录数据为了验证各种磁盘调度算法的性能差异,我们可以模拟不同的场景,例如,随机生成一批磁盘IO请求,并使用不同的磁盘调度算法进行处理。

记录每种算法的平均响应时间、平均等待时间等指标。

3.撰写实验报告根据实验数据和结果,撰写实验报告。

实验报告通常包括以下内容:引言、实验目的、实验原理、实验步骤、实验结果、实验分析、结论等。

四、实验结果与分析使用不同的磁盘调度算法对磁盘IO请求进行处理,得到不同的实验结果。

通过对比这些结果,我们可以看出不同算法对磁盘IO性能的影响。

例如,FCFS算法对于请求队列中的请求没有排序,可能会导致一些请求等待时间过长。

而SSTF算法通过选择离当前磁道最近的请求进行处理,能够减少平均寻道时间,提高磁盘性能。

五、实验总结通过本次实验,我们学习了操作系统中磁盘调度算法的原理和实现过程。

不同的磁盘调度算法具有不同的优缺点,我们需要根据实际情况选择合适的算法。

操作系统实验报告—磁盘调度算法

操作系统实验报告—磁盘调度算法

操作系统实验报告—磁盘调度算法操作系统实验报告实验3磁盘调度算法报告日期:20XX-6-17姓名:学号:班级:任课教师:实验3磁盘调度算法一、实验内容模拟电梯调度算法,实现对磁盘的驱动调度。

二、实验目的磁盘是一种高速、大量旋转型、可直接存取的存储设备。

它作为计算机系统的辅助存储器,负担着繁重的输入输出任务,在多道程序设计系统中,往往同时会有若干个要求访问磁盘的输入输出请示等待处理。

系统可采用一种策略,尽可能按最佳次序执行要求访问磁盘的诸输入输出请求,这就叫驱动调度,使用的算法称驱动调度算法。

驱动调度能降低为若干个输入输出请求服务所须的总时间,从而提高系统效率。

本实验要求学生模拟设计一个驱动调度程序,观察驱动调度程序的动态运行过程。

三、实验原理模拟电梯调度算法,对磁盘调度。

磁盘是要供多个进程共享的存储设备,但一个磁盘每个时刻只能为一个进程服务。

当有进程在访问某个磁盘时,其他想访问该磁盘的进程必须等待,直到磁盘一次工作结束。

当有多个进程提出输入输出请求处于等待状态,可用电梯调度算法从若干个等待访问者中选择一个进程,让它访问磁盘。

当存取臂仅需移到一个方向最远的所请求的柱面后,如果没有访问请求了,存取臂就改变方向。

假设磁盘有200个磁道,用C语言随机函数随机生成一个磁道请求序列放入模拟的磁盘请求队列中,假定当前磁头在100号磁道上,并向磁道号增加的方向上移动。

请给出按电梯调度算法进行磁盘调度时满足请求的次序,并计算出它们的平均寻道长度。

四、实验过程1.画出算法流程图。

2.源代码#include #include #include int *Init(intarr) {int i = 0;srand((unsignedint)time(0)); for (i = 0; i = num) {a[j+1] = arr[i]; j++; } else {b[k+1] = arr[i]; k++; } }printf(\访问序列:\\n\); for (i = 1; i 0; i--) { printf(\, b[i]); }sum = ((a[j]-100)*2+(100- b[1]))/15;printf(\平均寻道长度:%d\, sum); }int main {int arr[15] = { 0 }; int *ret=Init(arr); two_part(ret); getchar ; return 0;}4运行结果:五、实验小结通过本次实验,我对scan算法更加深入理解,用C语言模拟电梯调度算法,实现对磁盘的驱动调度,这个相比前两个实验实现起来相对简单,理解了算法实现起来尤为简单,程序敲出来之后没有错误,可直接运行,结果验证也无误。

磁盘调度的实验报告(3篇)

磁盘调度的实验报告(3篇)

第1篇一、实验目的1. 理解磁盘调度算法的基本原理和重要性。

2. 掌握几种常见的磁盘调度算法,包括先来先服务(FCFS)、最短寻道时间优先(SSTF)、扫描(SCAN)和循环扫描(C-SCAN)算法。

3. 通过模拟实验,分析不同磁盘调度算法的性能差异。

4. 优化磁盘调度策略,提高磁盘访问效率。

二、实验环境1. 操作系统:Windows 102. 编程语言:Python3.83. 磁盘调度算法模拟库:PyDiskScheduling三、实验内容1. FCFS算法:模拟实现先来先服务算法,按照请求顺序访问磁盘。

2. SSTF算法:模拟实现最短寻道时间优先算法,优先访问距离当前磁头最近的请求。

3. SCAN算法:模拟实现扫描算法,磁头从0号磁道开始向0号磁道移动,访问所有请求,然后返回到0号磁道。

4. C-SCAN算法:模拟实现循环扫描算法,与SCAN算法类似,但磁头在到达末尾磁道后返回到0号磁道。

四、实验步骤1. 导入PyDiskScheduling库。

2. 创建一个磁盘调度对象,指定磁头初始位置、请求序列和调度算法。

3. 运行调度算法,获取磁头移动轨迹和访问时间。

4. 分析算法性能,包括磁头移动次数、平均访问时间和响应时间等。

五、实验结果与分析1. FCFS算法:在请求序列较短时,FCFS算法表现较好。

但随着请求序列长度增加,磁头移动次数和访问时间明显增加。

2. SSTF算法:SSTF算法在请求序列较短时表现最佳,平均访问时间和响应时间较低。

但当请求序列较长时,算法性能下降,磁头移动次数增加。

3. SCAN算法:SCAN算法在请求序列较短时性能较好,但随着请求序列长度增加,磁头移动次数和访问时间逐渐增加。

与SSTF算法相比,SCAN算法在请求序列较长时性能更稳定。

4. C-SCAN算法:C-SCAN算法在请求序列较短时表现较好,但随着请求序列长度增加,磁头移动次数和访问时间逐渐增加。

与SCAN算法相比,C-SCAN算法在请求序列较长时性能更稳定,且磁头移动次数更少。

磁盘调度操作系统实验报告

磁盘调度操作系统实验报告

实验一磁盘调度算法实现一、实验目的本课程设计的目的是通过磁盘调度算法设计一个磁盘调度模拟系统,从而使磁盘调度算法更加形象化,容易使人理解,使磁盘调度的特点更简单明了,能使使用者加深对先来先服务算法、最短寻道时间优先算法、扫描算法以及循环扫描算法等磁盘调度算法的理解。

二、实验内容系统主界面可以灵活选择某种算法,算法包括:先来先服务算法(FCFS)、最短寻道时间优先算法(SSTF)、扫描算法(SCAN)、循环扫描算法(CSCA)N。

2.1 先来先服务算法(FCFS )这是一种比较简单的磁盘调度算法。

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

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

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

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

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

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

2.3 扫描算法(SCAN)扫描算法不仅考虑到欲访问的磁道与当前磁道的距离,更优先考虑的是磁头的当前移动方向。

例如,当磁头正在自里向外移动时,扫描算法所选择的下一个访问对象应是其欲访问的磁道既在当前磁道之外,又是距离最近的。

这样自里向外地访问,直到再无更外的磁道需要访问才将磁臂换向,自外向里移动。

这时,同样也是每次选择这样的进程来调度,即其要访问的磁道,在当前磁道之内,从而避免了饥饿现象的出现。

由于这种算法中磁头移动的规律颇似电梯的运行,故又称为电梯调度算法。

操作系统磁盘调度算法实验报告

操作系统磁盘调度算法实验报告

目录一、课程设计目的 (3)二、课程设计要求 (3)三、课程设计原理 (3)四、程序代码 (5)五、流程图设计 (11)六、运行结果 (14)七、调试分析 (16)八、心得体会 (16)一、课程设计目的操作系统是最重要的计算机系统软件,同时也是最活跃的学科之一,发展极为迅速。

我们在本课程的实验过程中,要了解实际操作系统的工作过程,加深对操作系统基础理论和重要算法的理解,在实践过程中加深对操作系统原理的理解。

通过设计一个磁盘调度模拟系统,以加深对先来先服务、最短寻道时间、电梯算法以及循环扫描算法等磁盘调度算法的理解。

让我们更好地掌握操作系统中磁盘调度的原理及实现方法,增强动手能力。

本实验通过对磁盘调度算法的实现,加深对算法的理解,同时通过用C++语言编写程序实现这些算法,并在windows平台上实现,也再一次提高了自己编程的能力,提高了综合运用专业课知识的能力。

二、课程设计要求本设计的具体要求如下:1.模拟一个磁盘调度算法2.要求能够模拟FCFS、最短寻道时间、电梯算法等磁盘调度算法3.输入为一组作业的磁道请求4.输出为按选择的算法执行时的磁头移动轨迹三、课程设计原理1.各个算法分析(1)先来先服务算法(FCFS)这是一种最简单的磁盘调度算法。

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

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

但是此算法由于未对寻道进行优化,致使平均寻道时间可能较长。

当有进程先后提出磁盘I/O请求时,先按他们发出请求的先后次序排队。

然后依次给予服务。

其平均寻道距离较大,故先来先服务算法仅适用于请求磁盘I/O进程数目较少的场合。

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

但这种算法不能保证平均寻道时间最短。

有可能导致某个进程出现“饥饿”现象,因为只要不断有新进程请求到达,且其所要访问的磁道与磁头当前所在的磁道的距离较近,这种新进程的I/O请求必然优先满足。

磁盘调度算法的实现

磁盘调度算法的实现

实验五、磁盘调度算法的实现一、实验目的实验程序模拟先来先服务FCFS,最短寻道时间优先SSTF,SCAN和循环SCAN 算法的工作过程。

假设有n个磁道号所组成的磁道访问序列,给定开始磁道号m 和磁头移动的方向(正向或者反向),分别利用不同的磁盘调度算法访问磁道序列,给出每一次访问的磁头移动距离,计算每种算法的平均寻道长度,本程序采用随机数来产生磁道数。

二、实验要求算法所需的各种参数由输入产生(手工输入或者随机数产生)。

最后的结果要求是在运行四种算法的程序后,能够输出调度过程、平均寻道长度的正确结果。

三、实验说明(1) 先来先服务.(FCFS):这是一种简单的磁盘调度算法。

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

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

但此算法由于未对寻道进行优化,致使平均寻道时间可能较长。

(2) 最短寻道时间优先(SSTF):该算法选择这样的进程,其要求访问的磁道与当前磁头所在的磁道距离最近,以使每次的寻道时间最短,但这种调度算法却不能保证平均寻道时间最短。

(3) 扫描算法(SCAN):SCAN算法不仅考虑到欲访问的磁道与当前磁道的距离,更优先考虑的是磁头的当前移动方向。

例如,当磁头正在自里向外移动时,SCAN算法所选择的下一个访问对象应是其欲访问的磁道既在当前磁道之外,又是距离最近的。

这样自里向外地访问,直到再无更外的磁道需要访问才将磁臂换向,自外向里移动。

这时,同样也是每次选择这样的进程来调度,即其要访问的磁道,在当前磁道之内,从而避免了饥饿现象的出现。

由于这种算法中磁头移动的规律颇似电梯的运行,故又称为电梯调度算法。

(4)循环扫描算法(CSCAN)CSCAN算法是对扫描算法的改进。

如果对磁道的访问请求是均匀分布的,当磁头到达磁盘的一端,并反向运动时落在磁头之后的访问请求相对较少。

这是由于这些磁道刚被处理,而磁盘另一端的请求密度相当高,且这些访问请求等待的时间较长,为了解决这种情况,循环扫描算法规定磁头单向移动。

操作系统课程设计--磁盘调度算法实践

操作系统课程设计--磁盘调度算法实践

《操作系统》课程设计磁盘调度算法实践系院:信息工程学院学生姓名:耿万德学号:0934110135专业:计算机科学与技术年级:计科0901B完成日期:2011年12月指导教师:刘栓ave=(float)(sum)/(float)(m);5、实验运行图;算法首页1 先来先服务算法2最短寻道时间优先算法(1)当前磁道号大于磁道序列中的最大的磁道号时(2)当前磁道号小于磁道序列中的最小的磁道号时(3)当前磁道号大于磁道序列中的最小的磁道号且小于最大磁道号时3 扫描算法(1)当前磁道号大于磁道序列中的最大的磁道号时(2)当前磁道号小于磁道序列中的最小的磁道号时(3)当前磁道号大于磁道序列中的最小的磁道号且小于最大磁道号(磁头向外)时(4)当前磁道号大于磁道序列中的最小的磁道号且小于最大磁道号(磁头向内)时4 循环扫描算法(1)当前磁道号大于磁道序列中的最大的磁道号时(2)当前磁道号小于磁道序列中的最小的磁道号时(3)当前磁道号大于磁道序列中的最小的磁道号且小于最大磁道号时6、实验结果分析;本系统具有很强的健壮性,当输入错误数据类型时,系统提示用户输入的数据类型错误,让用户重新输入,保证系统的稳定性,不会因为用户的误操作而致使系统瘫痪;虽然是在dos状态下,但是本系统界面还是设计的比较漂亮的,具有比较好的交互性;对于软件中的重用代码,设计成一个函数,实现代码重用。

本系统是在dos状态下进行编译执行的,没有图形化界面,可以设计出一个图形化界面,使用户操作更加简单,明了。

用户使用时请注意:1、进入系统,用户根据提示依次输入磁道号,要结束时输入“0”,回车,输入磁盘号结束;2、系统输出你输入的磁道序列,用户核对输入数据3、系统显示系统算法菜单;4、用户选择相应算法,回车;5、系统要求输入当前磁道号,用户输入磁道号,回车;6、系统输出磁头的扫描序列和平均寻道长度;7、用户继续选择系统菜单中的算法;8、当用户选择扫描算法时,需要输入磁道的寻道方向(1表示扫描磁道号大的方向,0表示扫描磁道号小的方向);附:1、课程设计的填写请按格式要求做;2、文字内容宋体、五号、1.5倍行距;3、程序代码字体Times New Roman,五号、1.5倍行距;附表:源程序代码#include<stdio.h>#include<stdlib.h>#include<iostream.h>#include<math.h>#define maxsize 1000/*********************判断输入数据是否有效**************************/ int decide(char str[]) //判断输入数据是否有效{int i=0;while(str[i]!='\0'){if(str[i]<'0'||str[i]>'9'){return 0;break;}i++;}return i;}/******************将字符串转换成数字***********************/int trans(char str[],int a) //将字符串转换成数字{int i;int sum=0;for(i=0;i<a;i++){sum=sum+(int)((str[i]-'0')*pow(10,a-i-1));}return sum;}/*********************冒泡排序算法**************************/int *bubble(int cidao[],int m){int i,j;int temp;for(i=0;i<m;i++) //使用冒泡法按从小到大顺序排列for(j=i+1;j<m;j++){if(cidao[i]>cidao[j]){temp=cidao[i];cidao[i]=cidao[j];cidao[j]=temp;}}cout<<"排序后的磁盘序列为:";for( i=0;i<m;i++) //输出排序结果{cout<<cidao[i]<<" ";}cout<<endl;return cidao;}/*********************先来先服务调度算法**************************/ void FCFS(int cidao[],int m) //磁道号数组,个数为m{int now;//当前磁道号int sum=0; //总寻道长度int j,i;int a;char str[100];float ave; //平均寻道长度cout<<"磁盘请求序列为:";for( i=0;i<m;i++) //按先来先服务的策略输出磁盘请求序列{cout<<cidao[i]<<" ";}cout<<endl;cout<<"请输入当前的磁道号:";B: cin>>str; //对输入数据进行有效性判断a=decide(str);if(a==0){cout<<"输入数据的类型错误,请重新输入!"<<endl;goto B;}elsenow=trans(str,a); //输入当前磁道号sum+=abs(cidao[0]-now);cout<<"磁盘扫描序列为:";for( i=0;i<m;i++) //输出磁盘扫描序列{cout<<cidao[i]<<" ";}for(i=0,j=1;j<m;i++,j++) //求平均寻道长度{sum+=abs(cidao[j]-cidao[i]);ave=(float)(sum)/(float)(m);}cout<<endl;cout<<"平均寻道长度:"<<ave<<endl;}/**********************最短寻道时间优先调度算法********************/void SSTF(int cidao[],int m){int k=1;int now,l,r;int i,j,sum=0;int a;char str[100];float ave;cidao=bubble(cidao,m); //调用冒泡排序算法排序cout<<"请输入当前的磁道号:";C: cin>>str; //对输入数据进行有效性判断a=decide(str);if(a==0){cout<<"输入数据的类型错误,请重新输入!"<<endl;goto C;}elsenow=trans(str,a); //输入当前磁道号if(cidao[m-1]<=now) //若当前磁道号大于请求序列中最大者,则直接由外向内依次给予各请求服务{cout<<"磁盘扫描序列为:";for(i=m-1;i>=0;i--)cout<<cidao[i]<<" ";sum=now-cidao[0];}if(cidao[0]>=now) //若当前磁道号小于请求序列中最小者,则直接由内向外依次给予各请求服务{cout<<"磁盘扫描序列为:";for(i=0;i<m;i++)cout<<cidao[i]<<" ";sum=cidao[m-1]-now;}if(now>cidao[0]&&now<cidao[m-1]) //若当前磁道号大于请求序列中最小者且小于最大者{cout<<"磁盘扫描序列为:";while(cidao[k]<now) //确定当前磁道在已排的序列中的位置,后面的算法都用到了,可以直接复制后少量修改,节省时间。

磁盘调度算法实验报告

磁盘调度算法实验报告

磁盘调度算法实验报告磁盘调度算法实验报告引言:磁盘调度算法是操作系统中的重要组成部分,它负责决定磁盘上数据的访问顺序,以提高磁盘的访问效率。

在本次实验中,我们对比了三种常见的磁盘调度算法:先来先服务(FCFS)、最短寻道时间优先(SSTF)和扫描(SCAN)算法。

通过对比实验结果,我们将分析不同算法的优缺点,并对其适用场景进行探讨。

实验过程:为了模拟磁盘调度算法在实际应用中的情况,我们使用了一个包含100个磁道的磁盘模型。

我们随机生成了一组磁道请求序列,并以此作为实验数据。

首先,我们使用FCFS算法对数据进行访问,记录下访问每个磁道所需的时间。

然后,我们分别使用SSTF和SCAN算法进行同样的操作,并记录下相应的访问时间。

实验结果:经过实验,我们得到了不同调度算法的访问时间数据。

在FCFS算法中,由于它按照请求的先后顺序进行访问,所以磁头需要频繁地在磁道之间移动,导致访问时间较长。

SSTF算法则根据当前磁头位置选择最近的磁道进行访问,因此其访问时间相对较短。

而SCAN算法则将磁头从一端移动到另一端,期间访问所有请求的磁道,这样可以减少磁头的移动次数,从而提高访问效率。

讨论与分析:从实验结果可以看出,不同的磁盘调度算法在不同的场景下有着不同的优势。

FCFS算法适用于请求较少、请求之间没有明显关联的情况。

因为它简单易实现,不需要额外的计算和判断,但在高负载情况下容易导致磁头抖动,降低整体性能。

SSTF算法适用于请求之间有明显关联的情况,因为它能够选择最近的磁道进行访问,减少了磁头的移动次数。

但是,当请求分布不均匀时,SSTF算法可能会导致某些磁道长时间得不到访问。

SCAN算法则适用于对整个磁盘进行扫描的场景,因为它能够在一个方向上连续访问多个磁道,减少了磁头的移动次数。

但是,SCAN算法可能会导致某些磁道长时间得不到访问,因此在请求分布不均匀的情况下,其性能可能会受到影响。

结论:通过本次实验,我们对比了三种常见的磁盘调度算法,并分析了它们的优缺点及适用场景。

操作系统实验磁盘调度算法实验报告

操作系统实验磁盘调度算法实验报告
a=decide(str);
if(a==0)
{
cout<<"输入数据的类型错误,请重新输入!"<<endl;
goto F;//输入错误,跳转到F,重新输入
}
else
c=trans(str,a);
if(c==5)
break;
if(c>5)
{
cout<<"数据输入错误!请重新输入"<<endl;
goto G;
1、实验目的
通过这个实验,加深对磁盘调度算法的理解,进一步掌握先来先服务FCFS、最短寻道时间优先SSTF、SCAN、CSCAN算法。
2、实验内容
利用高级语言编写先来先服务FCFS、最短寻道时间优先SSTF、SCAN、CSCAN算法。
3、实验环境
1.PC微机。
2.Windows操作系统。
3.C/C++/VB开发集成环境。
cout<<"* 4. 循 环 扫 描 *"<<endl;
cout<<"* 5. 退 出 *"<<endl;
cout<<"* *"<<endl;
cout<<"********************************"<<endl;
G:cout<<"请选择算法:";
F:cin>>str; //对输入数据进行有效性判断
break;
}
}
}
5、实验结果
成绩评定:
1、根据实验情况和实验报告质量作出写事性评价

磁盘调度算法的设计实验报告

磁盘调度算法的设计实验报告

磁盘调度算法的设计实验报告一、实验背景磁盘调度算法是操作系统中的重要内容之一,它的主要作用是优化磁盘的读写效率,提高系统的性能。

本次实验旨在通过设计不同的磁盘调度算法,比较它们在不同情况下的性能表现。

二、实验环境本次实验使用了Linux操作系统和C语言编程语言。

硬件环境为Intel Core i5处理器、4GB内存和500GB硬盘。

三、实验过程1. 先来看看什么是磁盘调度算法。

磁盘调度算法是指操作系统中用于管理磁盘I/O请求队列的算法。

常见的磁盘调度算法有FCFS(先来先服务)、SSTF(最短寻道时间优先)、SCAN(扫描)、LOOK(往返扫描)等。

2. 接下来我们分别对这些算法进行设计和实现,并进行性能测试。

3. 首先是FCFS算法。

FCFS算法就是按照请求到达时间的顺序进行服务,即先来先服务。

我们通过模拟生成一组随机数作为请求队列,然后计算出每个请求需要移动的距离,并计算出平均寻道长度。

4. 然后是SSTF算法。

SSTF算法是指选择距离当前磁头位置最近的请求进行服务。

我们同样使用模拟生成一组随机数作为请求队列,然后计算出每个请求与当前磁头位置的距离,并按照距离从小到大进行排序,然后依次服务每个请求,并计算出平均寻道长度。

5. 接下来是SCAN算法。

SCAN算法是指磁头从一端开始移动,直到到达另一端,然后返回原点继续移动。

我们同样使用模拟生成一组随机数作为请求队列,并将其按照磁头当前位置的左右分成两部分,分别从左往右和从右往左进行服务,并计算出平均寻道长度。

6. 最后是LOOK算法。

LOOK算法和SCAN类似,不同之处在于当服务完最远的请求时不会返回原点,而是直接返回最近的请求。

我们同样使用模拟生成一组随机数作为请求队列,并将其按照磁头当前位置的左右分成两部分,分别从左往右和从右往左进行服务,并计算出平均寻道长度。

四、实验结果通过对以上四种磁盘调度算法进行测试,得到以下结果:1. FCFS平均寻道长度:1622. SSTF平均寻道长度:783. SCAN平均寻道长度:984. LOOK平均寻道长度:87五、实验结论从实验结果可以看出,SSTF算法的性能最优,平均寻道长度最短。

磁盘调度实验报告

磁盘调度实验报告

磁盘调度实验报告一、实验目的1.掌握磁盘调度算法的基本原理和思想;2.理解磁盘调度算法的性能指标及其关系;3.利用实验验证各种磁盘调度算法的性能差异。

二、实验原理磁盘调度算法是操作系统中用来调度磁盘的读写操作的一种方法。

磁盘访问的时间主要包括寻道时间、旋转延迟和数据传输时间。

磁盘调度算法的目标是尽可能减少磁头的移动和等待时间,提高磁盘的访问效率。

常用的磁盘调度算法有先来先服务(FCFS)、最短寻找时间优先(SSTF)、电梯扫描(SCAN)和循环扫描(CSCAN)等。

FCFS算法就是按照请求的先后顺序进行访问,即先来的请求先执行。

SSTF算法每次选择最短寻找时间的磁道进行访问,减少了寻道时间。

SCAN算法则是磁头按照一个方向进行扫描,直到扫描到磁盘的一侧,然后改变方向继续扫描。

CSCAN算法是类似于SCAN算法,只是当扫描到磁盘的一侧时,直接跳到另一侧进行扫描。

这些算法各有优缺点,适用于不同的场景和需求。

三、实验过程1.实验环境搭建:选择一台计算机作为实验机器,安装操作系统和相应的磁盘调度算法软件;2.实验数据准备:生成一组磁道访问的请求序列,包括请求的磁道号和读写操作;3.实验数据输入:将生成的请求序列输入到磁盘调度软件中,选择不同的调度算法进行模拟;4.实验结果记录:记录各种调度算法的磁头移动次数和平均访问时间;5.实验数据分析:根据实验结果进行数据分析,比较各种算法的性能差异。

四、实验结果分析根据实验数据进行结果分析,比较不同调度算法的性能差异。

以磁头移动次数和平均访问时间为评价指标,可以看出不同算法对磁盘访问的影响。

在一些情况下,可能一些算法的磁头移动次数更少,但平均访问时间可能并不是最低的,需要综合考虑多个因素。

根据实验结果可以发现,FCFS算法的磁头移动次数和平均访问时间相对较高,因为它只按照请求的先后顺序进行访问,没有考虑磁道之间的距离。

SSTF算法在减少磁头移动次数和平均访问时间方面有一定的优势,因为它每次选择最短寻找时间的磁道进行访问。

天津理工大学操作系统实验报告实验一

天津理工大学操作系统实验报告实验一

实验报告学院(系)名称:计算机与通信工程学院【实验过程记录(源程序、测试用例、测试结果及心得体会等)】设计思想:1.模拟单CPU系统时间片切换、进程切换。

2.使用优先队列,让优先级高的进程位于队列顶端。

在每次时钟周期时,从优先队列队首取出优先级最高的进程,并使其运行一个时钟周期,然后将其优先级减1,已运行时间加1。

然后判断程序是否完成,如果未完成,则重新加入优先队列,参与时钟周期。

数据结构:使用优先队列,以获得优先级最高程序。

源代码:#include<cstdio>#include<queue>using namespace std;// 进程控制块PCBstruct PCB {unsigned int pid; //进程idunsigned int priority; //进程优先级unsigned int claimTime; //需要运行时间unsigned int runTime; //已经运行时间//构造函数PCB(unsigned int id, unsigned int p, unsigned int ct) { pid=id;priority=p;claimTime=ct;runTime=0;}//运行当前进程一个时钟周期,并使进程优先级减1,已运行时间加1 void run() {runTime++;if(priority>0)priority--;}//判断进程是否完成bool isFinished() {if(claimTime==runTime)return true;else return false;}//重载<运算符,以使用STL中的priority_queuebool operator <(const PCB& p)const {if(priority!=return priority<; //比较优先级else//优先级相同的话快完成的任务先执行return claimTime-runTime<}};int main(int argc, char **argv) {int clock=0;priority_queue<PCB> q; //优先队列for(int i=0; i<5; i++) {int p, t;printf("请输入pid=%u的进程的优先级(非负数):\n", i);scanf("%u", &p);printf("请输入pid=%u的进程的要求运行时间(非负数):\n", i);scanf("%u", &t);printf("pid = %u, 优先级 = %u, 要求运行时间 = %u\n\n", i, p, t);(PCB(i, p, t));}while(!()) { //模拟单CPUprintf("当前时钟%2d\t", clock++);PCB t = ();();printf("pid = %u进程运行, 优先级 = %u, 已运行时间 = %u\n", , , ;();printf("执行过后:\tpid = %u, 优先级 = %u, 已运行时间 = %u\n", , , ;if(!())(t);elseprintf("pid=%d进程结束\n", ;}printf("程序结束\n");return 0;}测试用例:执行结果:实验问题:1.在进程优先级相同时,调度结果不确定。

操作系统实验磁盘调度算法实验报告

操作系统实验磁盘调度算法实验报告

操作系统实验磁盘调度算法实验报告一.实验目的本实验旨在通过磁盘调度算法的模拟,探究不同调度算法对磁盘访问性能的影响,了解各种算法的特点和适用场景。

二.实验方法本实验通过编写磁盘调度模拟程序,实现了三种常见的磁盘调度算法:FCFS(先来先服务)、SSTF(最短寻找时间优先)和SCAN(扫描算法)。

实验中使用C语言编程语言,并通过随机生成的队列模拟磁盘访问请求序列。

三.实验过程1.FCFS(先来先服务)算法FCFS算法是一种非常简单的调度算法,它按照请求到达的顺序进行调度。

在实验中,我们按照生成的请求队列顺序进行磁盘调度,记录每次磁头移动的距离。

2.SSTF(最短寻找时间优先)算法SSTF算法是一种动态选择离当前磁头位置最近的磁道进行调度的算法。

在实验中,我们根据当前磁头位置和请求队列中的磁道位置,选择距离最近的磁道进行调度。

然后将该磁道从请求队列中移除,并记录磁头移动的距离。

3.SCAN(扫描算法)算法SCAN算法是一种按照一个方向进行扫描的算法,它在每个方向上按照磁道号的顺序进行调度,直到扫描到最边缘磁道再折返。

在实验中,我们模拟磁头从一个端点开始,按照磁道号从小到大的顺序进行调度,然后再折返。

记录磁头移动的距离。

四.实验结果与分析我们通过生成不同数量的请求队列进行实验,记录每种算法的磁头移动距离,并进行比较。

实验结果显示,当请求队列长度较小时,FCFS算法的磁头移动距离较短,因为它按照请求到达的顺序进行调度,无需寻找最短的磁道。

然而,当请求队列长度较大时,FCFS算法的磁头移动距离会显著增加,因为它不能根据距离进行调度。

SSTF算法相对于FCFS算法在磁头移动距离上有了明显改进。

SSTF算法通过选择最短的寻找时间来决定下一个访问的磁道,因此可以减少磁头的移动距离。

然而,在请求队列中存在少量分散的请求时,SSTF算法可能会产生扇区的服务死锁现象,导致一些磁道无法及时访问。

SCAN算法通过扫描整个磁盘来进行调度,有效解决了FCFS算法有可能导致的服务死锁问题。

天津理工大学 操作系统实验3:磁盘调度算法的实现

天津理工大学 操作系统实验3:磁盘调度算法的实现

实验报告学院(系)名称:计算机与通信工程学院【实验过程记录(源程序、测试用例、测试结果及心得体会等)】#include<iostream>#include<iomanip>#include<math.h>using namespace std;const int MaxNumber=100;int TrackOrder[MaxNumber];int MoveDistance[MaxNumber]; //----移动距离;int FindOrder[MaxNumber]; //-----寻好序列。

double AverageDistance; //-----平均寻道长度bool direction; //-----方向 true时为向外,false为向里int BeginNum; //----开始磁道号。

int M; //----磁道数。

int N; //-----提出磁盘I/O申请的进程数int SortOrder[MaxNumber]; //----排序后的序列bool Finished[MaxNumber];void Inith(){cout<<"请输入磁道数:";cin>>M;cout<<"请输入提出磁盘I/O申请的进程数:";cin>>N;cout<<"请依次输入要访问的磁道号:";for(int i=0;i<N;i++)cin>>TrackOrder[i];for(int j=0;j<N;j++)MoveDistance[j]=0;cout<<"请输入开始磁道号:";cin>>BeginNum;for(int k=0;k<N;k++)Finished[k]=false;for(int l=0;l<N;l++)SortOrder[l]=TrackOrder[l];}//=====================排序函数,将各进程申请的磁道按从小到大排列================= void Sort(){ //------冒泡排序int temp;for(int i=N-1;i>=0;i--)for(int j=0;j<i;j++){if(SortOrder[j]>SortOrder[j+1]){temp=SortOrder[j];SortOrder[j]=SortOrder[j+1];SortOrder[j+1]=temp;}}}//============FCFS,先来先服务=================================void FCFS(){int temp;temp=BeginNum; //--------将BeginNum赋给temp作为寻道时的当前所在磁道号for(int i=0;i<N;i++){MoveDistance[i]=abs(TrackOrder[i]-temp); //-------计算移动磁道数temp=TrackOrder[i]; //-------寻到后,将此道作为当前所在磁道号,赋给tempFindOrder[i]=TrackOrder[i]; //-----寻好的赋给寻好序列}}//========SSTF,最短寻道法=============================void SSTF(){int temp,n;int A=M;temp=BeginNum; //--------将BeginNum赋给temp作为寻道时的当前所在磁道号for(int i=0;i<N;i++){for(int j=0;j<N;j++) //-------寻找最短的寻道长度{if(abs(TrackOrder[j]-temp)<A&&Finished[j]==false){A=abs(TrackOrder[j]-temp);n=j;}else continue;}Finished[n]=true; //-------将已经寻找到的Finished赋值为trueMoveDistance[i]=A; //-------寻道长度temp=TrackOrder[n]; //-------当前寻道号。

操作系统实验三 磁盘调度算法的实现

操作系统实验三 磁盘调度算法的实现

天津理工大学计算机与通信工程学院实验报告2013 至2014 学年第一学期课程名称操作系统学号学生姓名年级专业教学班号实验地点实验时间2013年月日第节至月日第节主讲教师辅导教师实验(三)实验名称磁盘调度算法的实现软件环境VC++6.0硬件环境PC机实验目的《操作系统》是计算机科学与技术专业和信息与计算科学专业本科教学计划中的一门重要的专业基础课程,是对计算机系统硬﹑软件资源进行管理的系统软件,是计算机系统的管理和指挥中心。

通过本课程实验,使学生综合运用程序设计基础与语言、数据结构、计算机原理与接口等先行课程的知识以及操作系统课程的知识在各种资源管理调度策略下,设计操作系统资源管理的模拟程序,使学生加深了解操作系统的工作机理,对操作系统的功能及结构设计有更加深入的实践,为开发系统软件和应用软件打下基础。

实验内容(应包括实验题目、实验要求、实验任务等)实验内容:1、本实验是模拟操作系统的磁盘寻道方式,运用磁盘访问顺序的不同来设计磁盘的调度算法。

2、实现的磁盘调度算法有FCFS,SSTF,SCAN,CSCAN和NStepSCAN算法。

3、设定开始磁道号寻道范围,依据起始扫描磁道号和最大磁道号数,随机产生要进行寻道的磁道号序列。

4、选择磁盘调度算法,显示该算法的磁道访问顺序,计算出移动的磁道总数和平均寻道总数。

5、按算法的寻道效率进行排序,并对各算法的性能进行分析比较。

实验要求:学生应正确地设计有关的数据结构与各个功能模块,画出程序的流程图,编写程序,程序执行结果应正确实验过程与实验结果(可包括实验实施的步骤、算法描述、流程、结论等)在VC++6.0编写如下代码#include<iostream>#include<ctime>using namespace std;void FCFS(int a[],int n);void SSTF(int a[],int n);void SCAN(int a[],int n);void CSCAN(int a[],int n);int main(){int n;//磁道的个数int s;//功能号cout<<"请输入磁道的个数:"<<endl;cin>>n;int *a=new int[n];cout<<"生成随机磁道号..."<<endl;srand((unsigned)time(NULL));for(int i=0;i<n;i++){a[i]=(rand()%100)+1;cout<<a[i]<<" "; }cout<<endl;while(1) {cout<<endl;cout<<"1、先来先服务算法(FCFS)"<<endl;cout<<"2、最短寻道时间算法(SSTF)"<<endl; cout<<"3、扫描算法(SCAN)"<<endl;cout<<"4、循环扫描算法(CSCAN)"<<endl;cout<<"0、退出"<<endl;cout<<endl;cout<<"请选择功能号:";cin>>s;if(s>4){cout<<"输入有误!"<<endl;}else{switch(s){ case 0: exit(0);break ; case 1:FCFS(a,n); break;case 2:SSTF(a, n);break;case 3:SCAN(a, n);break;case 4:CSCAN(a,n);break; } }} return 0; }//先来先服务调度算法(FCFS)void FCFS(int a[],int n){int sum=0,j,i,first=0,now;cout<<"请输入当前磁道号:";cin>>now;//确定当前磁头所在位置cout<<"磁盘调度顺序为:"<<endl;for( i=0;i<n;i++)//按访问顺序输出磁道号{cout<<a[i]<<" ";}//计算sumfor(i=0,j=1;j<n;i++,j++){first+=abs(a[j]-a[i]);//外围磁道与最里面磁道的距离}sum+=first+abs(now-a[0]);cout<<endl;cout<<"移动的总磁道数: "<<sum<<endl;}//最短寻道时间算法(SSTF)void SSTF(int a[],int n){int temp;int k=1;int now,l,r;int i,j,sum=0;//将磁道号按递增排序for(i=0;i<n;i++)for(j=i+1;j<n;j++){if(a[i]>a[j]){temp=a[i];a[i]=a[j];a[j]=temp; }}cout<<"按递增顺序排好的磁道:"<<endl;for( i=0;i<n;i++){cout<<a[i]<<" ";//输出排好的磁道顺序}cout<<endl;cout<<"请输入当前的磁道号:";cin>>now;//确定当前磁头所在位置cout<<"磁盘调度顺序为:"<<endl;if(a[n-1]<=now)//当前磁头位置大于最外围欲访问磁道{for(i=n-1;i>=0;i--)cout<<a[i]<<" ";sum=now-a[0];}elseif(a[0]>=now)//当前磁头位置小于最里欲访问磁道{for(i=0;i<n;i++)cout<<a[i]<<" ";sum=a[n-1]-now;}else{while(a[k]<now)//确定当前磁道在已排的序列中的位置{k++;}l=k-1;//在磁头位置的前一个欲访问磁道r=k;//磁头欲访问磁道while((l>=0)&&(r<n)){if((now-a[l])<=(a[r]-now))//选择离磁头近的磁道 {cout<<a[l]<<" ";sum+=now-a[l];now=a[l];l=l-1; }else{cout<<a[r]<<" ";sum+=a[r]-now;now=a[r];r=r+1;} }if(l=-1)//磁头位置里侧的磁道已访问完{for(j=r;j<n;j++)//访问磁头位置外侧的磁道{cout<<a[j]<<" ";}sum+=a[n-1]-a[0];}if(r==n)//磁头位置外侧的磁道已访问完{for(j=k-1;j>-1;j--) //访问磁头位置里侧的磁道{cout<<a[j]<<" ";}sum+=a[n-1]-a[0];} }cout<<endl;cout<<"移动的总道数:"<<sum<<endl;}//扫描算法(SCAN)void SCAN(int a[],int n){int temp;int k=1;int now,l,r;int i,j,sum=0;for(i=0;i<n;i++)//对访问磁道按由小到大顺序排列输出for(j=i+1;j<n;j++){if(a[i]>a[j]){temp=a[i];a[i]=a[j];a[j]=temp;}}cout<<"按递增顺序排好的磁道:"<<endl;for( i=0;i<n;i++){cout<<a[i]<<" ";}cout<<endl;cout<<"请输入当前的磁道号:";cin>>now;//以下算法确定磁道访问顺序if(a[n-1]<=now) //磁头位置大于最外围欲访问磁道{for(i=n-1;i>=0;i--)cout<<a[i]<<" ";sum=now-a[0];}elseif(a[0]>=now) //磁头位置小于最里欲访问磁道{for(i=0;i<n;i++)cout<<a[i]<<" ";sum=a[n-1]-now;}else //磁头位置在最里侧磁道与最外侧磁道之间{ int d;while(a[k]<now){ //确定当前磁道在已排的序列中的位置k++;}l=k-1;//在磁头位置的前一个欲访问磁道r=k; //磁头欲访问磁道cout<<"请输入当前磁头移动的方向 (0 表示向内,1表示向外) : "; cin>>d; //确定磁头访问的方向cout<<"磁盘调度顺序为:";if(d==0||d==1){if(d==0) //磁头向内{for(j=l;j>=0;j--){cout<<a[j]<<" ";}for(j=r;j<n;j++){cout<<a[j]<<" ";}sum=now-2*a[0]+a[n-1];}if(d==1) //磁头向外{for(j=r;j<n;j++){cout<<a[j]<<" ";}for(j=l;j>=0;j--){cout<<a[j]<<" ";}sum=2*a[n-1]-now-a[0];}}elsecout<<"请输入0或1!"<<endl;}cout<<endl;cout<<"移动的总道数: "<<sum<<endl;}//循环扫描算法(CSCAN)void CSCAN(int a[],int n){int temp;int now,l,r;int i,j,sum=0;int k=1;for(i=0;i<n;i++)//对访问磁道按由小到大顺序排列输出for(j=i+1;j<n;j++){if(a[i]>a[j]){temp=a[i];a[i]=a[j];a[j]=temp;}}cout<<"按递增顺序排好的磁道:"<<endl;for( i=0;i<n;i++){cout<<a[i]<<" ";}cout<<endl;cout<<"请输入当前的磁道号:";cin>>now;//确定当前磁道号if(a[n-1]<=now)//磁头位置大于最外围欲访问磁道{for(i=0;i<n;i++)cout<<a[i]<<" ";sum=now-2*a[0]+a[n-1];}elseif(a[0]>=now)//磁头位置小于最里欲访问磁道{for(i=0;i<n;i++)cout<<a[i]<<" ";sum=a[n-1]-now;}else //磁头位置在最里侧磁道与最外侧磁道之间{ int d;while(a[k]<now){k++;}l=k-1;//在磁头位置的前一个欲访问磁道r=k; //磁头欲访问磁道cout<<"请输入当前磁头移动的方向 (0 表示向内,1表示向外) : "; cin>>d; //确定磁头访问的方向cout<<"磁盘调度顺序为:";if(d==0||d==1){if(d==1) //磁头向外侧访问{for(j=r;j<n;j++)//先访问外侧磁道再转向最里欲访问磁道{cout<<a[j]<<" ";}for(j=0;j<r;j++){cout<<a[j]<<" ";}sum=2*a[n-1]-now-2*a[0]+a[l];}if(d==0) //磁头向内侧访问 {for(j=r-1;j>=0;j--){cout<<a[j]<<" ";}for(j=n-1;j>=r;j--)//{cout<<a[j]<<" ";}sum=2*a[n-1]-2*a[0]+now-a[r];}}elsecout<<"请输入0或1!";}cout<<endl;cout<<"移动的总道数: "<<sum<<endl;}实验结果:1.先来先服务算法(FCFS)测试结果2.最短寻道时间算法(SSTF)测试结果3.循环扫描算法(SCAN)测试结果4.循环扫描算法(CSCAN)测试结果由以上测试结果可知,在相同的实验前提下,SSTF移动的总道数最少,性能最优。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

人和以吟实验报告学院(系)名称:计算机与通信工程学院【实验过程记录(源程序、测试用例、测试结果及心得体会等) 】#include<iostream> #include<iomanip> #include<math.h> using namespace std;void Inith(){cout<<" 请输入磁道数: "; cin>>M;cout<<" 请输入提出磁盘 I/O 申请的进程数 cin>>N;cout<<" 请依次输入要访问的磁道号: "; for(int i=0;i<N;i++)cin>>TrackOrder[i]; for(int j=0;j<N;j++)MoveDistance[j]=0;cout<<" 请输入开始磁道号: "; cin>>BeginNum; for(int k=0;k<N;k++)Finished[k]=false; for(int l=0;l<N;l++)SortOrder[l]=TrackOrder[l];}//=====================排序函数,将各进程申请的磁道按从小到大排列 void Sort() { // ---------- 冒泡排序int temp;for(int i=N-1;i>=0;i--) for(intj=0;j<i;j++) {if(SortOrder[j]>SortOrder[j+1])const int MaxNumber=100; int TrackOrder[MaxNumber];int MoveDistance[MaxNumber]; // ------- int FindOrder[MaxNumber]; // ---------- double AverageDistance; // ----------- bool direction; // int BeginNum; //int M; // int N;//int SortOrder[MaxNumber]; // ------ bool Finished[MaxNumber];移动距离 ; 寻好序列。

平均寻道长度方向 true 时为向外, false 开始磁道号。

磁道数。

提出磁盘 I/O 申请的进程数 排序后的序列为向里temp=SortOrder[j];SortOrder[j]=SortOrder[j+1];SortOrder[j+1]=temp;//============FCFS, 先来先服务 =================================void FCFS(){int temp;temp=BeginNum; // ---- 将BeginNum赋给temp作为寻道时的当前所在磁道号for(int i=0;i<N;i++){MoveDistance[i]=abs(TrackOrder[i]-temp); // ---- 计算移动磁道数temp=TrackOrder[i]; // --- 寻到后,将此道作为当前所在磁道号,赋给 tempFindOrder[i]=TrackOrder[i]; // - 寻好的赋给寻好序列}}//========SSTF, 最短寻道法 =============================void SSTF(){int temp,n;int A=M;temp=BeginNum; // ---- 将BeginNum赋给temp作为寻道时的当前所在磁道号for(int i=0;i<N;i++){for(int j=0;j<N;j++) // --- 寻找最短的寻道长度{ if(abs(TrackOrder[j]-temp)<A&&Finished[j]==false) {A=abs(TrackOrder[j]-temp);n=j;}else continue;}Finished[n]=true; // ---- MoveDistance[i]=A; //- temp=TrackOrder[n]; // A=M; //将已经寻找到的Finished 赋值为true 寻道长度当前寻道号。

重置A值}〃=====================SCA N 扫描算法========== void SCAN(){int m,n,temp; temp=BeginNum;Sort(); // --cout<<" 请选择开始方向: 1-- 向外 ;0--- 向里"; // cin>>m;if(m==1)direction=true;else if(m==0)direction=false;elsecout<<" 输入错误 ";for(int i=0;i<N;i++){if(SortOrder[i]<BeginNum) continue;else{n=i; break;}排序选择扫描方向}if(direction==true) // --{for(int i=n;i<N;i++){MoveDistance[i-n]=abs(SortOrder[i]-temp);temp=SortOrder[i];FindOrder[i-n]=SortOrder[i];}for(int j=n-1;j>=0;j--){MoveDistance[N-1-j]=abs(SortOrder[j]-temp);temp=SortOrder[j];FindOrder[N-1-j]=SortOrder[j];}}else // -------------------- 选择向外选择向里for(int i=n-1;i>=0;i--){MoveDistance[N-i-4]=abs(SortOrder[i]-temp);temp=SortOrder[i];FindOrder[N-i-4]=SortOrder[i];}for(int j=n;j<N;j++){MoveDistance[j]=abs(SortOrder[j]-temp); temp=TrackOrder[j];FindOrder[j]=SortOrder[j];}}}〃=================CSCA N 循环扫描算法======================= void CSCAN() {int m,n,temp;temp=BeginNum;Sort();cout<<" 请选择开始方向: 1-- 向外 ;0--- 向里";cin>>m;if(m==1)direction=true;else if(m==0)direction=false;elsecout<<" 输入错误 ";for(int i=0;i<N;i++){if(SortOrder[i]<BeginNum)continue;else{n=i;break;}}if(direction==true){for(int i=n;i<N;i++){MoveDistance[i-n]=abs(SortOrder[i]-temp); temp=SortOrder[i];FindOrder[i-n]=SortOrder[i];}for(int j=0;j<n;j++){MoveDistance[N-n+j]=abs(SortOrder[j]-temp); temp=SortOrder[j];FindOrder[N-n+j]=SortOrder[j];}}else{for(int i=n-1;i>=0;i--){MoveDistance[n-1-i]=abs(SortOrder[i]-temp); temp=SortOrder[i];FindOrder[n-1-i]=SortOrder[i];}for(int j=N-1;j>=n;j--){MoveDistance[N-j+n-1]=abs(SortOrder[j]-temp); temp=SortOrder[j];FindOrder[N-j+n-1]=SortOrder[j];}}}//======== 计算平均寻道时间 ============== void Count(){int Total=0; for(int i=0;i<N;i++){Total+=MoveDistance[i];}AverageDistance=((double)Total)/((double)N); }void Show(){cout<<"================从"<<BeginNum<<"号磁道开始: cout<<setw(20)<<" 被访问的下一个磁道号 "<<setw(20)<<" for(int i=0;i<N;i++){cout<<setw(15)<<FindOrder[i]<<setw(15)<<MoveDistance[i]<<endl;}cout<<setw(20)<<" 平均寻道长度 :"<<AverageDistance<<endl; cout<<endl;}int main(){int y=1; int s;==================="<<endl; 移动距离 ( 磁道数 )"<<endl;Inith();while(y){cout<<" 请选择寻道方式: 1--FCFS; 2--SSTF; 3--SCAN;4--CSCSN;"; cin>>s;switch(s){case 1:FCFS();Count();Show();break;case 2:SSTF();Count();Show();break;case 3:SCAN();Count();Show();break;case 4:CSCAN();Count();Show();break;} cout<<" 是否继续选择寻道算法? 1-- 是; 2-- 否"; int p; cin>>p; y=p;}return 0;}实验结果 :FCFS方式:Sstf 方式:是否继绒选採寻道算法? 1—是;2-^1请选择寻道方武’ 1—FCFS; 2—SSTF : 3 —SCAJI : 4—CSCSN; 2 ========丛*号磁逍开始 被访冋的下一个磁道号322727 27 27 6 276平均寻适长度5 83333SCAN 方 式:移动距离(诫道数) 6 5 6 6请选择寻道方式:一 1—FCFS ; 2—関 TF ; 3—ECAM 4--CECSN ; 3 *青选拯弁菇芳向.1--向拆;2——向里1 ================^40 号硯道幵 i4== =================== 被访问的下一个磁道号606569 86 32 27平均寻道长度:17.5否继续选择寻道算法? P->; A 召1情选择寻道方式;1-FCFS; 2-SSTP; 3-SCAN; 4—CSCSN; 3 卜青选摻弃始方向I 1 一向外;0---向里0X™™"™ 工从 40 号磁道开始―================ = 險访问的下一个磁道号6032 60 65 &9 86平均寻道长度:毙.83334.CSCSN移动距离(磁道数) 20 5 4 17 54 5穆动距离(磁道数) 20 8 33 38 17 21。

相关文档
最新文档