操作系统实验六磁盘调度算法正确C代码
操作系统磁盘调度算法实验报告
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.当前磁道号在已排序的磁道序列的中间//
操作系统磁盘调度算法试验报告及代码
华南农业大学信息(软件)学院《操作系统分析与设讣实习》成绩单开设时间:2014学年笫一学期•程序设计水平优口良口中口差口语•程序运行效果及正确性优口良口中口差口•课程设计报告结构清晰优口良口中口差口•报告中总结和分析详尽优口良口中口差口教师签名111、需求分析:(1)输入的形式和输入值的范围:在文本框输入序列长度,输入值为int类型(2)输出的形式:输出每种磁盘调度算法的服务序列(3)程序所能达到的功能:模拟实现FCFS、SSTF、电梯LOOK、C-SCAN算法,并计算及比较磁头移动道数。
测试数据:包括正确的输入及其输出结果和含有错误的输入及其输出结果。
输入磁道范围(Tiooo输入所选磁道个数0^1000选择算法广42、概要设计:主程序流程图:3、详细设计:先来先服务算法(FCFS):按先来后到次序服务,未作优化。
最简单的移臂调度算法是“先来先服务”调度算法,这个算法实际上不考虑访问者要求访问的物理位置,而只是考虑访问者提出访问请求的先后次序。
采用先来先服务算法决定等待访问者执行输入输出操作的次序时,移动臂来回地移动。
先来先服务算法花费的寻找时间较长,所以执行输入输出操作的总时间也很长。
最短寻道时间优先算法(SSTF):最短寻找时间优先调度算法总是从等待访问者中挑选寻找时间最短的那个请求先执行的,而不管访问者到来的先后次序。
与先来先服务、算法比较,大幅度地减少了寻找时间,因而缩短了为各访问者请求服务的平均时间,也就提高了系统效率。
但最短查找时间优先(SSTF)调度,FCFS会引起读写头在盘面上的大范围移动,SSTF查找距离磁头最短(也就是查找时间最短)的请求作为下一次服务的对象。
SSTF查找模式有高度局部化的倾向,会推迟一些请求的服务,其至引起无限拖延(又称饥饿)。
扫描算法(SCAN):SCAN算法乂称电梯调度算法。
SCAN算法是磁头前进方向上的最短查找时间优先算法,它排除了磁头在盘面局部位置上的往复移动,SCAN算法在很大程度上消除了SSTF 算法的不公平性,但仍有利于对中间磁道的请求。
linux磁盘调度算法c语言 -回复
linux磁盘调度算法c语言-回复什么是磁盘调度算法?磁盘调度算法是操作系统中的一种重要算法,用于管理磁盘访问请求的顺序,以提高磁盘IO的效率。
在现代计算机系统中,磁盘是一种常用的存储设备,用于存储大量的数据。
然而,磁盘的读写速度相对较慢,而且磁盘上的数据是按照物理位置存储的,因此需要一种调度算法来决定磁盘访问请求的执行顺序,以减少磁头的移动,提高数据的读写效率。
磁盘调度算法的基本原理磁盘调度算法的基本原理是通过优化磁盘访问请求的顺序,减少寻道和旋转延迟,提高磁盘IO的效率。
以下是一些常见的磁盘调度算法:1. 先来先服务(FCFS)先来先服务是最简单的磁盘调度算法之一。
它按照磁盘访问请求的到达顺序来执行IO操作。
当一个请求完成后,才会执行下一个请求。
尽管这种算法简单,但由于没有考虑磁头的位置及磁盘的旋转延迟,可能导致磁头频繁移动,降低IO效率。
2. 最短寻道时间优先(SSTF)最短寻道时间优先是一种以最小化寻道时间为目标的磁盘调度算法。
它选择离当前磁头位置最近的请求进行执行。
这种算法可以减少寻道时间,提高磁盘IO效率。
然而,由于总是选择最短寻道时间的请求,可能导致某些请求长时间等待,造成请求的不公平性。
3. 扫描算法(SCAN)扫描算法又称电梯算法,模拟了磁头在磁盘上移动的方式。
它从一个方向开始,按磁道的顺序执行访问请求,当达到磁盘的边界时,改变方向并继续执行请求。
这种算法可以减少磁头的移动距离,提高IO效率。
但是,如果某些请求集中在边界附近,可能导致某些请求长时间等待。
4. 循环扫描算法(C-SCAN)循环扫描算法是扫描算法的一种变体,它避免了某些请求长时间等待的问题。
当磁头达到磁盘的边界时,不返回原来的方向,而是直接返回到磁盘的另一侧继续执行请求。
这样可以确保所有的请求都能被处理到,减少等待时间,提高IO效率。
编写一个简单的磁盘调度算法(SSTF)的C语言实现下面是一个简单的SSTF磁盘调度算法的C语言实现:include<stdio.h>include<stdlib.h>int main(){int n, head, sum = 0;printf("Enter the number of disk requests: ");scanf("d", &n);printf("Enter the initial position of head: ");scanf("d", &head);int *requests = (int *)malloc(sizeof(int) * n);printf("Enter the disk requests: ");for (int i = 0; i < n; i++){scanf("d", &requests[i]);}for (int i = 0; i < n; i++){int min = abs(head - requests[i]);int index = i;for (int j = i + 1; j < n; j++){if (abs(head - requests[j]) < min){min = abs(head - requests[j]);index = j;}}sum += abs(head - requests[index]);head = requests[index];int temp = requests[i];requests[i] = requests[index];requests[index] = temp;}printf("Total head movement: d\n", sum);free(requests);return 0;}以上C语言程序实现了SSTF磁盘调度算法。
操作系统磁盘调度算法实验报告及代码
操作系统磁盘调度算法实验报告及代码一、实验目的通过实验掌握磁盘调度算法的实现过程,了解各种不同磁盘调度算法的特点和优缺点,并比较它们的性能差异。
二、实验原理磁盘调度是操作系统中的重要内容,其主要目的是提高磁盘的利用率和系统的响应速度。
常见的磁盘调度算法有: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语言模拟电梯调度算法,实现对磁盘的驱动调度,这个相比前两个实验实现起来相对简单,理解了算法实现起来尤为简单,程序敲出来之后没有错误,可直接运行,结果验证也无误。
C语言 磁盘调度算法 (FCFS SSTF SCAN CSCAN)
1.FCFS算法实现
2.SSTF算法实现
3.SCAN算法实现
4.CSCAN算法
5.显示对比表
=================================
【实验要求】可选编程语言:C/C++/Java/C#/Python;
实现在同一个程序文件中(C/C++);
请适当注释;
报告正文(运行屏幕截图及源代码)
{
sum += abs(track[i] - adress);
adress = track[i];
}
return sum;
}
int Get_SSTF_index(int t, int *flag)
{
int i, f = 0, min = 10000, juli = 0, l;
for(i = 0; i < 9; i++)
{
juli = abs(track[i] - t);
if(juli > 0 && juli < min && flag[i] ==0)
{
min = juli;
f = i;
}
}
return f;
}
bool IsEmpty(int *flag)
{
int i = 0;
for(i = 0; i < 9; i++)
一.截屏。
2.附录。
#include<stdio.h>
#include<Math.h>
static int track[9] = {55, 58, 39, 18, 90, 160, 150, 38, 184};
操作系统磁盘调度算法源代码
1.主界面void display(){cout<<"\n\n\n\n Operating Systems Curriculum Design\n";cout<<"\n ╔———————————————————————————————╗";cout<<"\n ││";cout<<"\n │名称: 磁盘调度│";cout<<"\n ││";cout<<"\n │工具: Visual Studio 2010 │";cout<<"\n ││";cout<<"\n │班级:1205 │";cout<<"\n ││";cout<<"\n │作者:xxxx │";cout<<"\n ││";cout<<"\n │学号:1324256688 │";cout<<"\n ││";cout<<"\n ╚———————————————————————————————╝\n";system("pause");system("cls");2.前言提示用户此程序实现的算法cout<<"【载入完成】"<<endl<<endl;cout<<" 前言"<<endl<<endl;cout<<" 欢迎使用『磁盘调度算法系统』,本程序实现了常用的磁盘调度算法如下所示:\n\n";cout<<" ①最短寻道时间优先(SSTF):最短寻道时间优先算法要求访问的磁盘与当前磁头所在的\n";cout<<" 磁盘距离最近,以使每次的寻道时间最短。
磁盘调度的实验报告(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算法在请求序列较长时性能更稳定,且磁头移动次数更少。
操作系统磁盘调度算法实验报告
目录一、课程设计目的 (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请求必然优先满足。
磁盘调度算法代码
磁盘调度算法代码磁盘调度算法是操作系统中用于优化磁盘访问性能的重要策略之一。
在计算机系统中,数据通常存储在磁盘上,当需要读或写数据时,就需要通过磁盘调度算法来确定磁盘读写的顺序,以提高系统的性能和效率。
1. 磁盘调度算法的背景在了解磁盘调度算法之前,我们先了解一下磁盘的工作原理。
磁盘由一个或多个盘片组成,每个盘片上包含若干磁道,每个磁道又被分为若干扇区。
磁头在读写数据时需要移动到目标扇区所在的磁道上,而磁头的移动会导致一定的寻道时间。
磁盘调度算法的目标就是通过合理的调度磁盘的访问请求,使得磁头的移动距离最短,从而减少磁盘的寻道时间,提高系统的读写性能。
常见的磁盘调度算法有以下几种:•先来先服务(FCFS):按照磁盘请求的到达顺序进行调度。
•最短寻道时间优先(SSTF):选择离当前磁头位置最近的磁道进行访问。
•扫描算法(SCAN):磁头从一端开始扫描磁道,直到扫描到达磁头上方的最后一个磁道,然后返回起始位置继续扫描。
•循环扫描算法(C-SCAN):类似于SCAN算法,但是磁头在扫描到磁头上方的最后一个磁道后,直接返回起始位置继续扫描。
•电梯算法(LOOK):磁头按磁道号的递增或递减顺序移动,直到当前方向上没有更多的磁道请求时改变方向。
2. 磁盘调度算法的代码实现下面以Python语言为例,给出一个简单的磁盘调度算法的代码实现。
这里以最短寻道时间优先(SSTF)算法为例。
首先,需要定义一个函数来计算当前磁头位置到目标磁道的距离:def calculate_distance(current, target):return abs(current - target)然后,我们可以编写一个磁盘调度函数来实现SSTF算法:def sstf(disk_queue, current_head):# 存储按磁道号排序的请求队列sorted_queue = sorted(disk_queue)# 存储已访问的磁道visited = []while sorted_queue:# 存储每个请求到当前磁头的距离distances = []for track in sorted_queue:distance = calculate_distance(current_head, track)distances.append((distance, track))# 根据距离进行排序distances.sort(key=lambda x: x[0])# 获取距离最小的磁道next_track = distances[0][1]# 移动磁头到下一个磁道current_head = next_track# 将访问过的磁道添加到已访问列表中visited.append(next_track)# 从请求队列中移除已访问的磁道sorted_queue.remove(next_track)return visited最后,我们可以使用上述代码来模拟一个磁盘调度的过程:if __name__ == '__main__':disk_queue = [98, 183, 37, 122, 14, 124, 65, 67]current_head = 53visited_tracks = sstf(disk_queue, current_head)print("磁盘访问顺序:", visited_tracks)运行上述代码,输出结果如下:磁盘访问顺序: [65, 67, 37, 14, 98, 122, 124, 183]上述代码实现了简单的SSTF算法,并模拟了一个磁盘访问的过程。
磁盘调度算法的设计实验报告
磁盘调度算法的设计实验报告一、实验背景磁盘调度算法是操作系统中的重要内容之一,它的主要作用是优化磁盘的读写效率,提高系统的性能。
本次实验旨在通过设计不同的磁盘调度算法,比较它们在不同情况下的性能表现。
二、实验环境本次实验使用了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算法的性能最优,平均寻道长度最短。
磁盘调度算法代码 (2)
磁盘调度算法一.需求分析编译程序运用磁盘的四种调度算法实现对磁盘的调度,四种算法分别为先来先服务(FCFS)算法,最短寻道时间优先(SSTF)算法,扫描调度(SCAN)算法,循环扫描(C-SCAN)算法。
二.总体设计及分类简介磁盘调度中常用的有四种算法,功能分别如下:1.先来先服务(FCFS)算法。
即先来的请求先被响应。
FCFS策略看起来似乎是相当"公平"的,但是当请求的频率过高的时候FCFS策略的响应时间就会大大延长。
FCFS策略为我们建立起一个随机访问机制的模型,但是假如用这个策略反复响应从里到外的请求,那么将会消耗大量的时间。
为了尽量降低寻道时间,看来我们需要对等待着的请求进行适当的排序,而不是简单的使用FCFS策略。
这个过程就叫做磁盘调度管理。
有时候FCFS也被看作是最简单的磁盘调度算法。
2. 最短寻道时间优先(SSTF)算法。
要求访问的磁道,与当前磁头所在的磁道距离最近,以使每次的寻道时间最短。
3.扫描调度(SCAN)算法。
该算法不仅考虑到欲访问的磁道与当前磁道间的距离,更优先考虑的是磁头当前的移动方向。
例如,当磁头正在自里向外移动时,SCAN算法所考虑的下一个访问对象,应是其欲访问的磁道,既在当前磁道之外,又是距离最近的。
这样自里向外的访问,直至再无更外的磁道需要访问时,才将磁道换向自外向里移动。
这时,同样也是每次选择这样的进程来调度,也就是要访问的当前位置内距离最近者,这样,磁头又逐步地从外向里移动,直至再无更里面的磁道要访问,从而避免了出现“饥饿”现像。
4.循环扫描(C-SCAN)算法。
当磁头刚从里向外移动而越过了某一磁道时,恰好又有一进程请求访问此磁道,这时,该里程就必须等待,为了减少这种延迟,CSCAN算法规定磁头单向移动,而本实验过程中我们所设计的是磁头从里向外移动,而从外向里移动时只须改方向而已,本实验未实现。
但本实验已完全能演示循环扫描的全过程。
三.目的1.熟悉并掌握磁盘管理系统的设计方法,加深对所学各种磁盘调度算法及其算法的特点的了解。
C语言磁盘调度算法
C语言磁盘调度算法1.FCFS(先来先服务)算法:FCFS算法按照磁盘请求的顺序进行调度,即按照先来先服务的原则,先处理先到达磁盘的请求。
它的实现非常简单,只需要按照请求的顺序进行访问即可。
C代码示例:```c#include <stdio.h>#include <stdlib.h>int fcfs(int start, int *requests, int n)int i;int total = abs(start - requests[0]);for (i = 1; i < n; i++)total += abs(requests[i] - requests[i - 1]);}return total;int maiint start = 50;int requests[] = { 82,170, 43, 140, 24, 16, 190};int n = sizeof(requests) / sizeof(requests[0]);int total = fcfs(start, requests, n);printf("Total head movement: %d\n", total);return 0;```2.SSTF(最短寻道时间优先)算法:SSTF算法每次都选择离当前磁道最近的请求进行处理,以减少寻道时间。
具体实现时,需要计算每个请求到当前磁道的距离,并选择最小的距离进行处理。
C代码示例:```c#include <stdio.h>#include <stdlib.h>int sstf(int start, int *requests, int n)int i, j;int total = 0;int visited[n];for (i = 0; i < n; i++)visited[i] = 0;}int cur = start;for (i = 0; i < n; i++)int minDist = __INT_MAX__;int index = -1;for (j = 0; j < n; j++)if (!visited[j])int dist = abs(cur - requests[j]); if (dist < minDist)minDist = dist;index = j;}}}total += minDist;visited[index] = 1;cur = requests[index];}return total;int maiint start = 50;int requests[] = { 82,170, 43, 140, 24, 16, 190};int n = sizeof(requests) / sizeof(requests[0]);int total = sstf(start, requests, n);printf("Total head movement: %d\n", total);return 0;```3.SCAN(电梯算法)算法:SCAN算法模拟电梯的运行方式,先向一个方向扫描直到末尾,然后再改变方向向另一个方向扫描,以此往复。
操作系统实验磁盘调度算法实验报告
操作系统实验磁盘调度算法实验报告一.实验目的本实验旨在通过磁盘调度算法的模拟,探究不同调度算法对磁盘访问性能的影响,了解各种算法的特点和适用场景。
二.实验方法本实验通过编写磁盘调度模拟程序,实现了三种常见的磁盘调度算法:FCFS(先来先服务)、SSTF(最短寻找时间优先)和SCAN(扫描算法)。
实验中使用C语言编程语言,并通过随机生成的队列模拟磁盘访问请求序列。
三.实验过程1.FCFS(先来先服务)算法FCFS算法是一种非常简单的调度算法,它按照请求到达的顺序进行调度。
在实验中,我们按照生成的请求队列顺序进行磁盘调度,记录每次磁头移动的距离。
2.SSTF(最短寻找时间优先)算法SSTF算法是一种动态选择离当前磁头位置最近的磁道进行调度的算法。
在实验中,我们根据当前磁头位置和请求队列中的磁道位置,选择距离最近的磁道进行调度。
然后将该磁道从请求队列中移除,并记录磁头移动的距离。
3.SCAN(扫描算法)算法SCAN算法是一种按照一个方向进行扫描的算法,它在每个方向上按照磁道号的顺序进行调度,直到扫描到最边缘磁道再折返。
在实验中,我们模拟磁头从一个端点开始,按照磁道号从小到大的顺序进行调度,然后再折返。
记录磁头移动的距离。
四.实验结果与分析我们通过生成不同数量的请求队列进行实验,记录每种算法的磁头移动距离,并进行比较。
实验结果显示,当请求队列长度较小时,FCFS算法的磁头移动距离较短,因为它按照请求到达的顺序进行调度,无需寻找最短的磁道。
然而,当请求队列长度较大时,FCFS算法的磁头移动距离会显著增加,因为它不能根据距离进行调度。
SSTF算法相对于FCFS算法在磁头移动距离上有了明显改进。
SSTF算法通过选择最短的寻找时间来决定下一个访问的磁道,因此可以减少磁头的移动距离。
然而,在请求队列中存在少量分散的请求时,SSTF算法可能会产生扇区的服务死锁现象,导致一些磁道无法及时访问。
SCAN算法通过扫描整个磁盘来进行调度,有效解决了FCFS算法有可能导致的服务死锁问题。
C语言磁盘调度算法
C语言磁盘调度算法
一、磁盘调度算法
磁盘调度算法是指在磁盘读写期间,将磁头移动的方式。
磁盘调度算法是操作系统和磁盘控制器的重要部分,它决定了磁头移动的顺序,最后影响磁盘读写的速度和效率。
先来先服务算法是一种比较基础的磁盘调度算法,它根据任务的先后顺序,按照FIFO(First-In-First-Out)的原则,先处理先提交的任务,后提交的任务后处理。
这种算法简单易实现,而且给出的结果是最长的寻道时间,但是其在分布较为不均匀的情况下容易导致较长的寻道时间。
2、最短寻道时间优先(Shortest Seek Time First,SSTF)
最短寻道时间优先算法是最新的一种磁盘调度算法,它把磁头移动的次数和磁头移动时间两个因素考虑在内,每次把最短寻道时间的任务优先处理,从而尽量减少磁头移动的次数,减少磁头的停顿次数,提高磁盘读写效率。
3、扫描算法(SCAN)
扫描算法称作电梯调度算法,也称作时钟调度算法,原理是先从其中一侧开始扫描。
操作系统磁盘调度算法实验报告
该算法选择这样的进程,其要求访问的磁道与当前磁头所在的磁道距离最近,以使每次的寻道时间最短,该算法可以得到比较好的吞吐量,但却不能保证平均寻道时间最短。其缺点是对用户的服务请求的响应机会不是均等的,因而导致响应时间的变化幅度很大。在服务请求很多的情况下,对内外边缘磁道的请求将会无限期的被延迟,有些请求的响应时间将不可预期。
3.模块流程图
3.
3.2模块程序流程图
FCFS算法(先来先服务)流程图:
SSTF(最短寻道时间优先算法)
算法流程图:
SCAN算法(扫描算法)流程图:
CSCAN算法(循环扫描算法)流程图:
4.
输入磁道序列号:25 160 78 65 100 62 16 53 45
选择算法1,平均寻道长度46.4444;
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++) //按先来先服务的策略输出磁盘请求序列
sum=now-cidao[0];
}
if(cidao[0]>=now) //若当前磁道号小于请求序列中最小者,则直接由内向外依次给予各请求服务,此情况同最短寻道优先
{
cout<<"磁盘扫描序列为:";
for(i=0;i<m;i++)
操作系统实验第六次磁盘调度
操作系统实验报告哈尔滨工程大学计算机科学与技术学院第六讲磁盘调度算法一、实验概述1. 实验名称磁盘调度算法2. 实验目的(1)通过学习EOS 实现磁盘调度算法的机制,掌握磁盘调度算法执行的条件和时机;(2)观察EOS 实现的FCFS、SSTF和SCAN磁盘调度算法,了解常用的磁盘调度算法;(3)编写CSCAN和N-Step-SCAN磁盘调度算法,加深对各种扫描算法的理解。
3. 实验类型验证性和设计性实验4. 实验内容(1)验证先来先服务(FCFS)磁盘调度算法;(2)验证最短寻道时间优先(SSTF)磁盘调度算法;(3)验证SSTF算法造成的线程“饥饿”现象;(4)验证扫描(SCAN)磁盘调度算法;(5)改写SCAN算法。
二、实验环境在OS Lab实验环境的基础上,利用EOS操作系统,由汇编语言及C语言编写代码,对需要的项目进行生成、调试、查看和修改,并通过EOS应用程序使内核从源代码变为可以在虚拟机上使用。
三、实验过程1. 设计思路和流程图(1)改写SCAN算法在已有SCAN 算法源代码的基础上进行改写,要求不再使用双重循环,而是只遍历一次请求队列中的请求,就可以选中下一个要处理的请求。
算法流程图如下图所示。
图 3.1.1 SCAN算法IopDiskSchedule函数流程图(2)编写循环扫描(CSCAN)磁盘调度算法在已经完成的SCAN算法源代码的基础上进行改写,不再使用全局变量ScanInside确定磁头移动的方向,而是规定磁头只能从外向内移动。
当磁头移动到最内的被访问磁道时,磁头立即移动到最外的被访问磁道,即将最大磁道号紧接着最小磁道号构成循环,进行扫描。
算法流程图如下图所示。
图 3.1.2 CSCAN算法IopDiskSchedule函数流程图(3)编写N-Step-SCAN磁盘调度算法在已经完成的SCAN 算法源代码的基础上进行改写,将请求队列分成若干个长度为N 的子队列,调度程序按照FCFS原则依次处理这些子队列,而每处图 3.1.3 N-Step-SCAN算法IopDiskSchedule函数流程图2.算法实现(1)改写SCAN算法在一次遍历中,不再关心当前磁头移动的方向,而是同时找到两个方向上移动距离最短的线程所对应的请求,这样就不再需要遍历两次。
磁盘调度实验C++源代码
操作系统实验:首先在文件目录下建立hard.txt C++源代码:#include<stdio.h>#include<iostream.h>#include<string.h>#include<math.h>//读入磁道号流const int MAXQUEUE=200;typedef struct node{int go;int visited;}qu;qu queue[MAXQUEUE];int quantity;int start;void initial(){int i;for(i=0;i<MAXQUEUE;i++){queue[i].go=-1;queue[i].visited=0;}start=53;//磁头的初始位置}void readData(){FILE *fp;char fname[20];int temp,i;cout<<"请输入磁道号流文件名:"; strcpy(fname,"hard.txt");cin>>fname;if((fp=fopen(fname,"r"))==NULL){cout<<"错误,文件打不开,请检查文件名:)"<<endl;}else{while(!feof(fp)){fscanf(fp,"%d ",&temp);queue[quantity].go=temp;quantity++;}cout<<endl<<"---------------------------------------------"<<endl; cout<<"所读入的磁道号流:";for(i=0;i<quantity;i++){cout<<queue[i].go<<" ";}cout<<endl<<"请求数为:"<<quantity<<endl;}}//FIFO算法void FIFO(){int i;int total=0;int current;cout<<endl<<"---------------------------------------------"<<endl; cout<<"FIFO算法的访问磁道号顺序流:";current=start;for(i=0;i<quantity;i++){cout<<queue[i].go<<" ";total+=abs(queue[i].go-current);current=queue[i].go;}cout<<endl<<"磁头移过的柱面数:"<<total;}//最短寻道优先调度算法void shortest(){int i,j,p;int total=0;int current;cout<<endl<<"---------------------------------------------"<<endl;cout<<"最短寻道优先调度算法的访问磁道号顺序流:";current=start;for(i=0;i<quantity;i++){p=0;while(queue[p].visited!=0){p++;}for(j=p;j<quantity;j++){if((queue[j].visited==0)&&(abs(current-queue[p].go)>abs(current-queue[j].go))){ p=j;}}cout<<queue[p].go<<" ";total+=abs(queue[p].go-current);queue[p].visited=1;current=queue[p].go;}cout<<endl<<"磁头移过的柱面数:"<<total;}//电梯算法void elevator(){int i,j,p,flag;int total=0;int current;cout<<endl<<"---------------------------------------------"<<endl;cout<<"电梯调度算法"<<endl;//磁头初始向里cout<<"磁头初始向里的访问磁道号顺序流:";current=start;for(i=0;i<quantity;i++){flag=1000;p=-1;for(j=0;j<quantity;j++){if((queue[j].visited==0)&&(queue[j].go>=current)){if(abs(queue[j].go-current)<flag){p=j;flag=abs(queue[j].go-current);}}}if(p!=-1){cout<<queue[p].go<<" ";total+=abs(queue[p].go-current);current=queue[p].go;queue[p].visited=1;}else{for(j=0;j<quantity;j++){if((queue[j].visited==0)&&(queue[j].go<current)){ if(abs(queue[j].go-current)<flag){p=j;flag=abs(queue[j].go-current);}}}cout<<queue[p].go<<" ";total+=abs(queue[p].go-current);current=queue[p].go;queue[p].visited=1;}}cout<<endl<<"磁头移过的柱面数:"<<total<<endl;//磁头初始向外for(i=0;i<quantity;i++){queue[i].visited=0;}total=0;cout<<"磁头初始向外的访问磁道号顺序流:";current=start;for(i=0;i<quantity;i++){flag=1000;p=-1;for(j=0;j<quantity;j++){if((queue[j].visited==0)&&(queue[j].go<=current)){ if(abs(queue[j].go-current)<flag){p=j;flag=abs(queue[j].go-current);}}if(p!=-1){cout<<queue[p].go<<" ";total+=abs(queue[p].go-current);current=queue[p].go;queue[p].visited=1;}else{for(j=0;j<quantity;j++){if((queue[j].visited==0)&&(queue[j].go>current)){if(abs(queue[j].go-current)<flag){p=j;flag=abs(queue[j].go-current);}}}cout<<queue[p].go<<" ";total+=abs(queue[p].go-current);current=queue[p].go;queue[p].visited=1;}}cout<<endl<<"磁头移过的柱面数:"<<total;}//显示版权信息函数void version(){cout<<endl<<endl;cout<<" ┏━━━━━━━━━━━━━━━━━━━━━━━┓"<<endl; cout<<" ┃磁盘调度算法系统┃"<<endl;cout<<" ┠───────────────────────┨"<<endl; cout<<" ┃(c)All Right Reserved Neo┃"<<endl;cout<<" ┃sony006@┃"<<endl; cout<<" ┃version 2004 build 1122┃"<<endl;cout<<" ┗━━━━━━━━━━━━━━━━━━━━━━━┛"<<endl;cout<<endl<<endl;}void main(){int i;version();initial();readData();FIFO();shortest();for(i=0;i<quantity;i++){ queue[i].visited=0;}elevator();}。
磁盘调度算法代码
#include<stdlib.h>#include<iostream.h>#include<cmath>typedef struct node{int data;struct node *next;}Node;void main(){void fcfs(Node *,int,int);//声明先来先服务函数FCFSvoid sstf(Node *,int,int);//声明最短寻道时间优先函数SSTFvoid scan(Node *,int,int);//声明扫描函数SC ANvoid 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<<" /**************磁盘调度算法***************/"<<endl;cout<<endl;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;print(head);cout<<"链表长度为:"<<c<<endl;cout<<"1、先来先服务算法FCFS"<<endl;cout<<"2、最短寻道时间优先算法SSTF"<<endl;cout<<"3、电梯调度算法(扫描算法SC AN)"<<endl;cout<<"0、退出"<<endl;cout<<"请选择:";cin>>s;while(s!=0){switch(s){case 1:cout<<"你选择了:先来先服务算法FCFS"<<endl;fcfs( head,c,f);break;case 2:cout<<"你选择了:最短寻道时间优先算法SSTF"<<endl;sstf( head,c,f);break;case 3:cout<<"你选择了:电梯调度算法(扫描算法SC AN)"<<endl;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;l=head->next;for(int i=0;i<c;i++){num+=abs(l->data-f);f=l->data;l=l->next;}num=num/c;cout<<"先来先服务的寻道顺序是:"<<endl;print(head);cout<<"平均寻道长度:"<<num<<endl;}/*****************************************************************/ 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<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;cout<<"最短寻道时间优先顺序是:"<<endl;print(l);cout<<"平均寻道长度:"<<num<<endl;}/***************************************************************/ void scan(Node *head,int c,int f)//扫描算法(电梯调度算法){void print(Node *);int min,max,i=0,j=0;float num=0;Node *p,*q,*r,*s,*m,*n,*x,*y;r=(Node *)malloc(sizeof(Node));//存放比开始磁道小的磁道r->next=NULL;s=r;m=(Node *)malloc(sizeof(Node));//存放比开始磁道大的磁道m->next=NULL;n=m;x=(Node *)malloc(sizeof(Node));x->next=NULL;y=x;q=head;p=head->next;while(p->next!=NULL){if(p->data-f>0){q->next=p->next;p->next=NULL;n->next=p;n=p;p=q->next;i++;}else{q->next=p->next;p->next=NULL;s->next=p;s=p;p=q->next;j++;}}if(p->data>=f){n->next=p;n=p;i++;}else{s->next=p;s=p;j++;}q=r; //对比开始磁道小的磁道排序p=r->next;while(q->next->next!=NULL){q=q->next;p=q->next;max=q->data;while(p->next!=NULL){if(p->data>max){max=p->data;p->data=q->data;q->data=max;max=q->data;}p=p->next;}if(p->data>max){max=p->data;p->data=q->data;q->data=max;max=q->data;}}//print(r);q=m;p=m->next;while(q->next->next!=NULL){q=q->next;p=q->next;min=q->data;while(p->next!=NULL){if(p->data<min){min=p->data;p->data=q->data;q->data=min;min=q->data;}p=p->next;}if(p->data<min){min=p->data;p->data=q->data;q->data=min;min=q->data;}}//print(m);x=m;p->next=r->next;y=x->next;while(y->next!=NULL){num+=abs(f-y->data);f=y->data;y=y->next;}num+=abs(f-y->data);num=num/c;cout<<"扫描算法的顺序是:"<<endl;print(x);cout<<"平均寻道长度为:"<<num<<endl;}/*****************************************************/ void print(Node *head) //输出链表{Node *p;p=head->next;cout<<"单链表显示:";if(p==NULL){cout<<"单链表为空:";}else if(p->next==NULL){cout<<p->data;}else{while(p->next!=NULL){cout<<p->data<<"->";p=p->next;}cout<<p->data<<endl;}}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
操作系统实验六磁盘调度算法正确C代码文档编制序号:[KKIDT-LLE0828-LLETD298-POI08]《操作系统》实验报告【实验题目】:磁盘调度算法【实验目的】通过这次实验,加深对磁盘调度算法的理解,进一步掌握先来先服务FCFS,最短寻道时间优先SSTF,SCAN和循环SCAN算法的实现方法。
【实验内容】问题描述:设计程序模拟先来先服务FCFS,最短寻道时间优先SSTF,SCAN和循环SCAN算法的工作过程。
假设有n个磁道号所组成的磁道访问序列,给定开始磁道号m和磁头移动的方向(正向或者反向),分别利用不同的磁盘调度算法访问磁道序列,给出每一次访问的磁头移动距离,计算每种算法的平均寻道长度。
程序要求如下:1)利用先来先服务FCFS,最短寻道时间优先SSTF,SCAN和循环SCAN算法模拟磁道访问过程。
2)模拟四种算法的磁道访问过程,给出每个磁道访问的磁头移动距离。
3)输入:磁道个数n和磁道访问序列,开始磁道号m和磁头移动方向(对SCAN和循环SCAN算法有效),算法选择1-FCFS,2-SSTF,3-SCAN,4-循环SCAN。
4)输出:每种算法的平均寻道长度。
实验要求:1) 上机前认真复习磁盘调度算法,熟悉FCFS,SSTF,SCAN和循环SCAN算法的过程;2) 上机时独立编程、调试程序;3) 根据具体实验要求,完成好实验报告(包括实验的目的、内容、要求、源程序、实例运行结果截图)。
实验代码:#include<iostream>#include<iomanip>#include<>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=500;//磁道数int N;//提出磁盘I/O申请的进程数int SortOrder[MaxNumber];//排序后的序列bool Finished[MaxNumber];void Inith(){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;for(int i=0;i<N;i++){MoveDistance[i]=abs(TrackOrder[i]-temp);temp=TrackOrder[i];FindOrder[i]=TrackOrder[i];}}//========SSTF,最短寻道法=============================void SSTF(){int temp,n;int A=M;temp=BeginNum;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;FindOrder[i]=TrackOrder[n];}}//=====================SCAN,扫描算法========================== 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];}}}//=================CSCAN,循环扫描算法======================= 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<<setw(20)<<"被访问的下一个磁道号"<<setw(20)<<"移动距离(磁道数)"<<endl;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;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--是;0--否: ";int p;cin>>p;y=p;}exit;return 0;}结果截图:。