操作系统实验六磁盘调度算法正确C代码

合集下载

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

操作系统磁盘调度算法实验报告
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.当前磁道号在已排序的磁道序列的中间//

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

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

华南农业大学信息(软件)学院《操作系统分析与设讣实习》成绩单开设时间: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语言 -回复

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)

C语言 磁盘调度算法 (FCFS SSTF SCAN CSCAN)
0.退出
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篇)

磁盘调度的实验报告(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算法在请求序列较长时性能更稳定,且磁头移动次数更少。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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;}结果截图:。

相关文档
最新文档