磁盘调度算法代码
- 格式:docx
- 大小:12.45 KB
- 文档页数: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算法通过选择离当前磁道最近的请求进行处理,能够减少平均寻道时间,提高磁盘性能。
五、实验总结通过本次实验,我们学习了操作系统中磁盘调度算法的原理和实现过程。
不同的磁盘调度算法具有不同的优缺点,我们需要根据实际情况选择合适的算法。
qt实现磁盘调度算法Qt是一个跨平台的C++图形用户界面应用程序开发框架。
它提供了一套完整的开发工具,包括一个强大的应用程序框架,用于开发具有图形用户界面的应用程序。
磁盘调度算法是一种用于决定磁盘臂在磁盘上移动的顺序的算法。
这些算法通常用于操作系统中,以优化磁盘访问时间。
要在Qt中实现磁盘调度算法,您需要首先理解这些算法的工作原理,然后使用Qt的C++语言编写代码。
下面是一个简单的例子,展示如何在Qt中实现一个简单的先入先出(FIFO)磁盘调度算法:```cppinclude <QCoreApplication>include <QDebug>include <QLinkedList>class DiskScheduler {public:DiskScheduler() {}void addRequest(int track) {(track);}int nextRequest() {if (()) {return -1; // 返回-1表示没有更多的请求}int track = ();();return track;}private:QLinkedList<int> requests; // 使用QLinkedList来保存磁盘请求队列};int main(int argc, char argv[]) {QCoreApplication a(argc, argv);DiskScheduler scheduler;(10);(15);(2);(8);while (true) {int track = ();if (track == -1) {break; // 如果没有更多的请求,退出循环} else {qDebug() << "Track:" << track; // 打印出当前处理的磁道号}}return ();}```在这个例子中,我们创建了一个`DiskScheduler`类,它使用一个`QLinkedList`来保存磁盘请求队列。
编程模拟实现磁盘调度算法(1)—采用最短寻道时间优先算法班级04师本(3)班学号0408008301 姓名陈海颖一、实验目的与实验项目介绍1、实验目的通过实际编程来模拟实现磁盘调度算法中的采用最短寻道时间优先算法,并达到对知识的熟练掌握。
2、实验项目介绍本设计为磁盘调度算法模拟实现系统,选用Microsoft Visual 2005中的作为开发工具,实现最短寻道时间优先算法.二、实验项目方案设计1、算法思想:最短寻道时间优先算法:首先确定当前磁头所在的磁道号,然后对请求的磁道号从小到大进行排序。
接着找到一个跟当前磁道号最接近的磁道号;如找到则从当前位置开始执行,接着从当前磁道号再找一个跟当前磁道号最接近的磁道号,依次执行,直到结束。
2、算法流程先把输入的要求访问的序列号从小到大排序,分析当前位置的可能位置。
如果当前位置小于最小序列号,则不做改动,直接按顺序输出;如果当前位置大于最大的序列号,则将序列从大到小排序,再按顺序输出即可;如果不是这两种情况,则将当前位置虚拟插入序列号中,比较当前位置左右的序列号与当前位置的距离,找出距离最小的并将其值赋给OUTPUT和当前位置,再从新的当前位置寻找下一个最短距离的序列号。
如此循环,即可实现最短寻道时间优先算法。
三、实验实施步骤1、创建应用程序界面在VB.NE中使用WINDOWS应用程序生成一个窗体应用程序form1,并给主窗口取名为“模拟磁盘调度算法之最短寻道时间优先算法”。
2、窗体设计如下图所示;建立界面(如上图),包含17个文本框,分别表示当前磁头位置、即将访问的队列(5个)、算法得到的序列(5个)、每次移动距离和移动总距离。
4个按钮控件Button1—Button3激活各个算法,Button1实现清除算法,使各控件初始为零,重新运算;Button2实现调度算法,Button3实现平均移动距离的算法,Label实现总移动距离的求解。
3、具体控件的功能及如何实现(1)输入的要求访问的序列号的表示如图所示,用TextBox1、TextBox2、TextBox3、 TextBox4、TextBox5存放输入的5个系列号,TextBox6存放输入的当前位置nowpoint,通过下面的代码,将各文本框的值用变量m1、 m2 、m3、 m4、m5、nowpoint:m1 = Val(TextBox1.Text)m2 = Val(TextBox2.Text)m3 = Val(TextBox3.Text)m4 = Val(TextBox4.Text)m5 = Val(TextBox5.Text)nowpoint = Val(TextBox6.Text)(2)按钮“执行算法”,单击该按钮即实现最短寻道时间优先算法。
public class exp {public static void main(String[] args) {int n = 6; // 用来统计需求量double sum = 0; // 为FCFS算法准备的用来计算总的寻到长度double temp = 0;int position = 100; // 用来存放磁头的出事位置SSTF sstf = new SSTF();SCAN scan = new SCAN();int a[] = {100,24,37,58,81,95,150};//寻道序列a[0]=position;sum = 0;System.out.println("磁头初始位置为100!磁头向磁道号增加方向寻道!");System.out.println("初始化磁道序列:");for(int i=1;i<=6;i++)System.out.print(a[i]+" ");System.out.println();System.out.println("FCFS算法序列:");for (int i = 1; i <= n; i++) {System.out.print(a[i] + " ");temp = a[i] - a[i - 1];if (temp >= 0);else if (temp < 0) {temp = -temp;}sum = sum + temp;}System.out.println();System.out.println("寻道长度为" + sum);System.out.println("平均寻道长度为" + sum / n);int b[] = {100,24,37,58,81,95,150};sstf.Calculate(b, n, 100);int c[] = {100,24,37,58,81,95,150};scan.Check(c, n, 100);}}class SCAN {//电梯算法public int m=1; //用来存放磁头的初始位置public boolean Run=true;public int sum=0;public void Check(int a[],int n,int position){int temp;for (int i = n; i > 0; i--) // 冒泡排序{for (int j = 0; j < i; j++) {if (a[j] > a[j + 1]) // 按顺序依次比较大小{temp = a[j]; // 把大的数字往前面放a[j] = a[j + 1];a[j + 1] = temp;}}}while (Run) {//此循环用来寻找磁头的初始位置被排到了什么位置for (int i = 0; i <= n; i++) {if (a[i] == position) {m = i;Run = false;}}}System.out.println("SCAN算法序列:");for(int i=m+1;i<=n;i++){//磁头向大号移动sum=sum+a[i]-a[i-1];System.out.print(a[i]+" ");}sum=sum+200-a[n];sum=sum+200-a[m-1];for(int i=m-1;i>=0;i--){if(i!=0){sum=sum+a[i]-a[i-1];}System.out.print(a[i]+" ");}System.out.println();System.out.println("寻道长度为"+sum);System.out.println("平均寻道长度为"+sum/n);}}class SSTF {// 最短寻道时间优先算法public int m=1; // 用来判断排序后磁头所在的初始位置的下标public int b[];boolean flag=true;public double SUM=0;public int mleft, mright;public SSTF(){b=new int[20];}public void Calculate(int a[], int n, int position) {// 两个形参分别表示磁盘请求序列int temp,p,q;System.out.println("SSTF序列为:");while(flag){for (int i = n; i > 0; i--) // 冒泡排序{for (int j = m; j < i; j++) {p=a[j]-a[0];q=a[j + 1]-a[0];if(a[j]-a[0]<0)p=-p;if(a[j+1]-a[0]<0)q=-q;if (p>q) // 按顺序依次比较大小{temp = a[j];a[j] = a[j + 1];a[j + 1] = temp;}}}System.out.print(a[m]+" ");a[0]=a[m];m=m+1;if(m==7)break;p=a[0]-a[m];if(a[0]-a[m]<0)p=-p;SUM=SUM+p;}System.out.println();System.out.println("寻道长度为"+SUM);System.out.println("平均寻道长度为"+SUM/n);}}。
磁盘调度算法As a person, we must have independent thoughts and personality.操作系统实验报告哈尔滨工程大学计算机科学与技术学院一、实验概述1. 实验名称磁盘调度算法2.实验目的(1)通过学习EOS实现磁盘调度算法的机制,掌握磁盘调度算法执行的条件和时机。
(2)观察EOS实现的FCFS、SSTF和 SCAN磁盘调度算法,了解常用的磁盘调度算法。
(3)编写CSCAN和N-Step-SCAN磁盘调度算法,加深对各种扫描算法的理解。
3. 实验类型验证,设计4. 实验内容(1)准备实验(2)验证先来先服务(FCFS)磁盘调度算法(3)验证最短寻道时间优先(SSTF)磁盘调度算法(4)验证SSTF算法造成的线程“饥饿”现象()验证扫描(SCAN)磁盘调度算法()验证SCAN 算法能够解决“饥饿”现象(6)改写SCAN调度算法二、实验环境EOS操作系统与IDE环境组成的“操作系统集成实验环境OS Lab”。
三、实验过程(一)实验问题及解答1.实验指导验证先来先服务(FCFS)磁盘调度算法,要求请给出在“输出”窗口中的结果。
答:输出结果复制如下:制作软盘镜像...正在启动 Virtual PC...开始调试...****** Disk schedule start working ******Start Cylinder: 10TID: 31 Cylinder: 8 Offset: 2 -TID: 32 Cylinder: 21 Offset: 13 +TID: 33 Cylinder: 9 Offset: 12 -TID: 34 Cylinder: 78 Offset: 69 +TID: 35 Cylinder: 0 Offset: 78 -TID: 36 Cylinder: 41 Offset: 41 +TID: 37 Cylinder: 10 Offset: 31 -TID: 39 Cylinder: 12 Offset: 55 -TID: 40 Cylinder: 10 Offset: 2 -Total offset: 360 Transfer times: 10 Average offset: 362.实验指导验证验证最短寻道时间优先(SSTF)磁盘调度算法,要求请给出在“输出”窗口中的结果。
#include<stdio.h>#include<stdlib.h>#include<string.h>#include<math.h>typedefstruct_proc{char name[100]; /*定义进程名称*/int team; /*定义柱面号*/int ci; /*定义磁道面号*/int rec; /*定义记录号*/struct_proc *prior;struct_proc *next;}PRO;PRO *g_head = NULL, *g_curr = NULL, *local;int record = 0; //初始柱面号int yi = 1; //初始方向int rec0 = 0; //初始记录号void init(){PRO *p; /*初始化链表(初始I/O表)*/ g_head = (PRO*)malloc(sizeof(PRO));g_head->next = NULL;g_head->prior = NULL;p = (PRO*)malloc(sizeof(PRO));strcpy_s(p->name, "P1");p->team = 100;p->ci = 10;p->rec = 1;p->next = NULL;p->prior = g_head;g_head->next = p;g_curr = g_head->next;p = (PRO*)malloc(sizeof(PRO));strcpy_s(p->name, "P2");p->team = 50;p->ci = 10;p->rec = 5;p->next = NULL;p->prior = g_curr;g_curr->next = p;g_curr = p;p = (PRO*)malloc(sizeof(PRO)); strcpy_s(p->name, "P3");p->team = 40;p->ci = 10;p->rec = 4;p->next = NULL;p->prior = g_curr;g_curr->next = p;g_curr = p;p = (PRO*)malloc(sizeof(PRO)); strcpy_s(p->name, "P4");p->team = 60;p->ci = 20;p->rec = 6;p->next = NULL;p->prior = g_curr;g_curr->next = p;g_curr = p;p = (PRO*)malloc(sizeof(PRO)); strcpy_s(p->name, "P5");p->team = 50;p->ci = 20;p->rec = 6;p->next = NULL;p->prior = g_curr;g_curr->next = p;g_curr = p;p = (PRO*)malloc(sizeof(PRO)); strcpy_s(p->name, "P6");p->team = 60;p->ci = 20;p->rec = 6;p->next = NULL;p->prior = g_curr;g_curr->next = p;g_curr = p;p = (PRO*)malloc(sizeof(PRO)); strcpy_s(p->name, "P7");p->team = 50;p->ci = 2;p->rec = 6;p->next = NULL;p->prior = g_curr;g_curr->next = p;g_curr = p;p = (PRO*)malloc(sizeof(PRO)); strcpy_s(p->name, "P8");p->team = 50;p->ci = 5;p->rec = 6;p->next = NULL;p->prior = g_curr;g_curr->next = p;g_curr = p;p = (PRO*)malloc(sizeof(PRO)); strcpy_s(p->name, "P9");p->team = 50;p->ci = 100;p->rec = 6;p->next = NULL;p->prior = g_curr;g_curr->next = p;g_curr = p;p = (PRO*)malloc(sizeof(PRO)); strcpy_s(p->name, "P10");p->team = 60;p->ci = 10;p->rec = 10;p->next = NULL;p->prior = g_curr;g_curr->next = p;local = (PRO*)malloc(sizeof(PRO)); /*选中进程*/strcpy_s(local->name, "P0");local->team = 50;local->ci = 50;local->rec = 50;local->next = NULL;local->prior = NULL;}void PrintInit() /*打印I/O表*/{PRO *t = g_head->next;printf("-------------------------------------\n");printf(" 请求I/O表\n");printf(" 进程名柱面号磁道号记录号\n");while (t != NULL){printf("%4s %8d %8d %5d\n", t->name, t->team, t->ci, t->rec);t = t->next;}}void acceptreq() /*接受请求函数*/{PRO *p;p = (PRO*)malloc(sizeof(PRO));printf("please input the information of the new process\n");printf("进程名:");scanf_s("%s", p->name,20);printf("柱面号(0-199):");scanf_s("%d", &p->team); /*输入请求进程信息*/ printf("磁道号(0-20):");scanf_s("%d", &p->ci);printf("记录号(0-7):");scanf_s("%d", &p->rec);getchar();g_curr = g_head; /*将此节点链入I/O请求表*/ while (g_curr->next != NULL)g_curr = g_curr->next;p->next = NULL;p->prior = g_curr;g_curr->next = p;g_curr = g_head->next;PrintInit(); /*将新的I/O请求表输出*/}void SCAN() /*驱动调度函数*/{PRO *out = 0;int deng = 0;int deng1 = 0;int min = g_head->next->team;//大于里最小的int max = g_head->next->team;//小于里最大的for (g_curr = g_head->next; g_curr != NULL; g_curr = g_curr->next){if (g_curr->team == record)//找到是否有同一个柱面号的进程,deng=1{min = g_curr->rec;out = g_curr;deng = 1;break;}}switch (deng){case 1://找出同一个柱面号里最小的记录号for (g_curr = g_head->next; g_curr != NULL; g_curr = g_curr->next){if (g_curr->team == record&&abs(g_curr->rec - rec0) <= abs(min - rec0)){min = g_curr->rec;out = g_curr;}}break;case 0:switch (yi)//不属于同一个柱面号里。
#include<stdio.h>#include<math.h>#include<stdlib.h>#define N 20typedef struct{int num;//磁道int flag;//1个标记量}V,*v;//********************************************************************* void Initial(v *a,int n){//初始化磁道请求printf("请输入请求顺序(磁道范围是0 - 199):\n");for(int i = 1;i <= n;i++){a[i] = (v)malloc(sizeof(V));if(!a[i]) exit(-1);scanf("%d",&a[i]->num);a[i]->flag = 0;}}//*********************************************************************** void FCFS(v *a,int start,int n){//先到先服务算法int temp = start;float s = 0;printf("---------------------------FCFS调度算法----------------------------\n");for(int i = 1;i <= n; i++){temp = abs(a[i]->num - temp);s += temp;a[i]->flag = i;temp = a[i]->num;}int temp2;for(i = n;i >= 1;i--){//冒泡排序,按照磁道访问的先后顺序重新排列数组a,用于输出调度顺序for(int j = 1;j < i;j ++){if(a[j]->flag> a[j+1]->flag){temp = a[j]->flag;temp2 = a[j]->num;a[j]->flag = a[j+1]->flag;a[j]->num = a[j+1]->num;a[j+1]->flag = temp;a[j+1]->num = temp2;}}}printf("调度序列为:\n");printf("%d—>",start);for(i = 1;i <= n; i++){printf("%d —> ",a[i]->num);}printf("\n");printf("寻道长度是%f",s);printf("\n");printf("平均寻道长度是%f",s/n);printf("\n");printf("---------------------------FCFS调度算法----------------------------\n");}//************************************************************************ int Find(v *a,int n,int start){//找到离开始磁道最近的一项,返回下标int p;for(int i = 1;i < n;i++){if((a[i]->num <= start) && (start <=a[i+1]->num )){if(abs(a[i]->num - start) < abs(a[i+1]->num - start)){p = i;}else{p= i+1;}}}return p;}void SSTF(v *a,int start,int n){//最短寻道时间调度算法int temp;int pr,pl;//分别标记离磁头最近的那个磁道在数组中的下标的前一个和后一个float s = 0; //用来计算寻道长度temp = start;printf("---------------------------SSTF调度算法----------------------------\n");for(int i = n;i >= 1;i--){//冒泡排序,把磁道按由小到大的顺序排列for(int j = 1;j < i;j ++){if(a[j]->num > a[j+1]->num){temp = a[j]->num;a[j]->num = a[j+1]->num;a[j+1]->num = temp;}}}printf("排序后\n");for(int j=1;j<=n;j++)printf("%d ",a[j]->num);printf("\n");int p,x;p = Find(a,n,start);x = p;pr = p + 1;pl = p - 1;if(start <= a[1]->num){//磁头在最左边s =(float)(a[1]->num-start);printf("调度序列为:\n");printf("%d—>",start);for(i = 1;i <= n; i++){if(i!=1){s+=a[i]->num-a[i-1]->num;}printf("%d —> ",a[i]->num);}printf("\n");printf("寻道长度为%f",s);printf("\n");printf("平均寻道长度是%f",s/n);printf("\n");}else if(start >= a[n]->num){//磁头在最右边s =(float)(start-a[n]->num);printf("调度序列为:\n");printf("%d—>",start);for(i = n; i >= 1; i--){if(i!=1){s += a[i]->num-a[i-1]->num;}printf("%d —> ",a[i]->num);}printf("\n");printf("寻道长度为%f",s);printf("平均寻道长度是%f",s/n);printf("\n");}else{//磁头在中间printf("调度序列为:\n");printf("%d—>",start);printf("%d —> ",a[p]->num);s = (float)(a[p]->num - start);while(1){if(abs(a[pl]->num - a[p]->num) <= abs(a[p]->num - a[pr]->num)){s += a[p]->num-a[pl]->num;p = pl;printf("%d —> ",a[p]->num);pl--;if(pl==0){s += a[pr]->num-a[1]->num;s += a[n]->num-a[pr]->num;for(int i=pr;i<=n;i++){printf(" %d—>",a[i]->num);}break;}}else{s += a[pr]->num-a[p]->num;p = pr;printf("%d —> ",a[p]->num);pr++;if(pr==n+1){s += a[n]->num-a[pl]->num;s += a[pl]->num-a[1]->num;for(int i=pl;i>=1;i--){printf("%d —> ",a[i]->num);}break;}}}printf("\n");printf("寻道长度为%f",s);printf("\n");printf("平均寻道长度是%f",s/n);printf("\n");}printf("---------------------------SSTF调度算法----------------------------\n");}//********************************************************************** void SCAN(v *a,int start,int n){//电梯算法int l = 0 ;//用于设置访问磁道的flagint temp,temp2;for(int i = n;i >= 1;i--){//冒泡排序,把磁道按由小到大的顺序排列for(int j = 1;j < i;j ++){if(a[j]->num > a[j+1]->num){temp = a[j]->num;a[j]->num = a[j+1]->num;a[j+1]->num = temp;}}}int p,x;p = Find(a,n,start);x = p;float s = 0;int toleft,toright;printf("---------------------------SCAN调度算法----------------------------\n"); if(abs(start - a[1]->num) < abs(a[n]->num - start))toleft = 1;//磁头离最左端的磁道近elsetoright = 1;//磁头离最右端的磁道近temp = start;if(toleft == 1){//先向0磁道方向访问while(p != 0){temp = abs(a[p]->num - temp);s += temp;l += 1;temp = a[p]->num;a[p]->flag = l;p--;}s += a[1]->num - 0;temp = 0;x = x + 1;while(x != n){temp = abs(a[x]->num - temp);s += temp;l += 1;temp = a[x]->num;a[x]->flag =l;x++;}for(i = n;i >= 1;i--){//冒泡排序,按照访问的顺序将数组重新排列for(int j = 1;j < i;j ++){if(a[j]->flag> a[j+1]->flag){temp = a[j]->flag;temp2 = a[j]->num;a[j]->flag = a[j+1]->flag;a[j]->num = a[j+1]->num;a[j+1]->flag = temp;a[j+1]->num = temp2;}}}printf("调度序列为:\n");printf("%d—>",start);for(i = 1;i <= n; i++){printf("%d —> ",a[i]->num);}printf("\n");printf("寻道长度是%f",s);printf("\n");printf("平均寻道长度是%f",s/n);printf("\n");}if(toright == 1){//先向199磁道方向访问while(p != n+1){temp = abs(a[p]->num - temp);s += temp;l += 1;temp = a[p]->num;a[p]->flag = l;p++;}s += abs(199 - a[n]->num);temp = 199;x = x - 1;while(x != 0){temp = abs(a[x]->num - temp);s += temp;l += 1;temp = a[x]->num;a[x]->flag =l;x--;}for(i = n;i >= 1;i--){//冒泡排序,按照访问的顺序将数组重新排列for(int j = 1;j < i;j ++){if(a[j]->flag> a[j+1]->flag){temp = a[j]->flag;temp2 = a[j]->num;a[j]->flag = a[j+1]->flag;a[j]->num = a[j+1]->num;a[j+1]->flag = temp;a[j+1]->num = temp;}}}printf("调度序列为:\n");printf("%d—>",start);for(i = 1;i <= n; i++){printf("%d —> ",a[i]->num);}printf("\n");printf("寻道长度是%f",s);printf("\n");printf("平均寻道长度是%f",s/n);printf("\n");}printf("---------------------------SCAN调度算法----------------------------\n");}//*************************************************************************void CSCAN(v *a,int start,int n){//int temp,temp2;int l = 0;for(int i = n;i >= 1;i--){//冒泡排序for(int j = 1;j < i;j ++){if(a[j]->num > a[j+1]->num){temp = a[j]->num;a[j]->num = a[j+1]->num;a[j+1]->num = temp;}}}int p,x;p = Find(a,n,start);x = p;float s = 0;temp = start;printf("---------------------------CSCAN调度算法----------------------------\n"); if((n - p) >= p ){//右边的磁道数比左边的磁道数多while(p != n+1){temp = abs(a[p]->num - temp);s += temp;l += 1;temp = a[p]->num;a[p]->flag = l;p++;}s += abs(199 - a[n]->num);temp = 0;x = x + 1;i = 1;while(i != x){temp = abs(a[i]->num - temp);s += temp;l += 1;temp = a[i]->num;a[i]->flag = l;i++;}for(i = n;i >= 1;i--){//冒泡排序,按照访问的顺序将数组重新排列for(int j = 1;j < i;j ++){if(a[j]->flag> a[j+1]->flag){temp = a[j]->flag;temp2 = a[j]->num;a[j]->flag = a[j+1]->flag;a[j]->num = a[j+1]->num;a[j+1]->flag = temp;a[j+1]->num = temp2;}}}printf("调度序列为:\n");printf("%d—>",start);for(i = 1;i <= n; i++){printf("%d —> ",a[i]->num);}printf("\n");printf("寻道长度是%f",s);printf("\n");printf("平均寻道长度是%f",s/n);printf("\n");}else{//左边的磁道数比右边的磁道数多while(p != 0){temp = abs(a[p]->num - temp);s += temp;l += 1;temp = a[p]->num;a[p]->flag = l;p--;}s += a[1]->num - 0;temp = 199;i = n;while(i != x){temp = abs(a[i]->num - temp);s += temp;temp = a[i]->num;l += 1;a[i]->flag =l;i--;}for(i = n;i >= 1;i--){//冒泡排序,按照访问的顺序将数组重新排列for(int j = 1;j < i;j ++){if(a[j]->flag> a[j+1]->flag){temp = a[j]->flag;temp2 = a[j]->num;a[j]->flag = a[j+1]->flag;a[j]->num = a[j+1]->num;a[j+1]->flag = temp;a[j+1]->num = temp2;}}}printf("调度序列为:\n");printf("%d—>",start);for(i = 1;i <= n; i++){printf("%d —> ",a[i]->num);}printf("\n");printf("寻道长度是%f",s);printf("\n");printf("平均寻道长度是%f",s/n);printf("\n");}printf("---------------------------CSCAN调度算法----------------------------\n");}//************************************************************************** void main(){int n;//v a[N];int start;//磁头开始的位置int choice;//用于标记操作的序号printf("******************************磁盘调度算法****************************\n");printf(" ");printf("1.FCFS调度算法\n");printf(" ");printf("2.SSTF调度算法\n");printf(" ");printf("3.SCAN调度算法\n");printf(" ");printf("4.CSCAN调度算法\n");printf(" ");printf("5.退出\n");printf("******************************磁盘调度算法****************************\n");printf("请输入请求的柱面数:");scanf("%d",&n);printf("请输入磁头开始的位置:");scanf("%d",&start);Initial(a,n);while(1){printf("请选择你要的操作序号\n");scanf("%d",&choice);switch(choice){case 1:FCFS(a,start,n);break;case 2:SSTF(a,start,n);break;case 3:SCAN(a,start,n);break;case 4:CSCAN(a,start,n);break;case 5:exit(-1);default:printf("你输入的操作序号有误!");}printf("\n");}}。
// 磁ä?盘¨¬调Ì¡Â度¨¨.cpp : 定¡§义©?控?制?台¬¡§应®|用®?程¨¬序¨©的Ì?入¨?口¨²点Ì?。
¡ê//#include"stdafx.h"#include"iostream"usingnamespace std;#define maxsize 100void PrintArray(intarray[],int m){for(int i=0;i<m;i++){cout<<array[i]<<" ";}}//FCFSvoid FCFS(intarray[],int m){int sum=0,j,i;PrintArray(array,m);for(i=0,j=1;j<m;i++,j++){sum+=abs(array[j]-array[i]);}cout<<"移©?动¡¥的Ì?总Á¨¹道̨¤数ºy:êo"<<sum<<endl;}//SSTFvoid SSTF(intarray[],int m){int k=0;int now,l,r;int i,j,sum=0;BubbleSort(array,m);PrintArray(array,m);cout<<"请?输º?入¨?当Ì¡À前¡ã磁ä?道̨¤号?:êo";cin>>now;if(array[m-1]<=now)//当Ì¡À前¡ã磁ä?道̨¤位?于®¨²最Á?后¨®一©?个?的Ì?后¨®面?{for(i=m-1;i>=0;i--){cout<<array[i]<<" ";}sum=now-array[0];}elseif(array[0]>=now)//当Ì¡À前¡ã磁ä?道̨¤位?于®¨²第̨²一©?个?之?前¡ã{for(i=0;i<m;i++){cout<<array[i]<<" ";}sum=array[m-1]-now;}else//当Ì¡À前¡ã磁ä?道̨¤位?于®¨²中D间?位?置?{while(array[k]<now)//寻¡ã找¨©当Ì¡À前¡ã磁ä?道̨¤的Ì?位?置?{k++;}l=k-1;r=k;while((l>=0)&&(r<m))//确¨¡¤定¡§磁ä?头ª¡¤移©?动¡¥方¤?向¨© {if((now-array[l])<=(array[r]-now)){cout<<array[l]<<" ";sum+=now-array[l];now=array[l];l=l-1;}else{cout<<array[r]<<" ";sum+=array[r]-now;now=array[r];r=r+1;}}if(l==-1){for(j=r;j<m;j++){cout<<array[j]<<" ";}sum+=(array[m-1]-array[0]);}if(r==m){for(j=l;j>=0;j--)cout<<array[j]<<" ";sum+=(array[m-1]-array[0]);}}cout<<"移©?动¡¥的Ì?总Á¨¹道̨¤数ºy:êo"<<sum<<endl;}//SCANvoid SCAN(intarray[],int m){int k=1;int now,l,r,d;int i,j,sum=0;BubbleSort(array,m);PrintArray(array,m);cout<<"请?输º?入¨?当Ì¡À前¡ã磁ä?道̨¤号?:êo";cin>>now;if(array[m-1]<=now){for(i=m-1;i>=0;i--)cout<<array[i]<<" ";sum=now-array[0];}elseif(array[0]>=now){for(i=0;i<m;i++)cout<<array[i]<<" ";sum=array[m-1]-now;}else{while(array[k]<now){k++;}l=k-1;r=k;cout<<"请?输º?入¨?当Ì¡À前¡ã移©?动¡¥臂À?移©?动¡¥的Ì?方¤?向¨©(ê¡§1表À¨ª示º?向¨©内¨²,ê?0表À¨ª示º?向¨©外ªa)ê?:êo";cin>>d;if(d==0){for(j=l;j>=0;j--){cout<<array[j]<<" ";}for(j=r;j<m;j++){cout<<array[j]<<" ";}sum=now-2*array[0]+array[m-1];}else{for(j=r;j<m;j++){cout<<array[j]<<" ";}for(j=1;j>=0;j--){cout<<array[j]<<" ";}sum=-now-array[0]+2*array[m-1];}}cout<<"移©?动¡¥的Ì?总Á¨¹道̨¤数ºy:êo"<<sum<<endl;}void main(){int c;FILE *fp;int cidao[maxsize];int i=0,count;fp=fopen("E:/VC//cidao.txt","r+");if(fp==NULL){cout<<"文?件t打䨩不?开a!ê?"<<endl;exit(0);}while(!feof(fp)){if((fgetc(fp))==-1){printf("请?输º?入¨?磁ä?道̨¤的Ì?个?数ºy:");cin>>count;for(i=0;i<count;i++){printf("请?输º?入¨?磁ä?道̨¤%d的Ì?磁ä?道̨¤号?:",i+1);cin>>cidao[i];}}else{fscanf(fp,"%d",&cidao[i]);i++;}}count=i;for(i=0;i<count;i++){printf("%5d",cidao[i]);}cout<<endl;while(1){cout<<endl<<"系¦Ì统ª3菜?单Ì£¤如¨?下?:êo"<<endl;printf("1.FCFS 2.SSTF 3.SCAN");cout<<endl;printf("4.EXIT");cout<<endl;cout<<"请?选?择?:êo";cin>>c;if(c>3)break;switch(c){case 1:FCFS(cidao,count);break;case 2:SSTF(cidao,count);break;case 3:SCAN(cidao,count);break;}}}。
磁盘调度算法先来先服务最短寻道优先Final approval draft on November 22, 2020磁盘调度算法(先来先服务/最短寻道优先)#include<>#include<>#include<>void FCFS(int a[],int m,int now);f\n\n",d);}void SSTF(int a[],int n,int now) f\n\n",d);}void choose(int a[],int n) 道请求总数 2.磁道请求序列 3.当前磁道号\n");printf(" -----------------------------------------\n");printf("1.需要访问的磁道总数: ");scanf(" %d",&m);printf("\n2.需要访问的磁道序列:\n");for(i=0;i<m;i++)scanf("%d",&a[i]);printf("\n3.输入当前磁道号: ");scanf("%d",&now);do{printf("\n -------------磁盘调度算法------------\n\n");printf(" * 1.先来先服务(FCFS) *\n\n");printf(" * 2.最短寻道时间优先(SSTF) *\n\n");printf(" * 0.退出系统 *\n\n");printf(" -------------------------------------\n");printf("请选择算法序号(0-2):\n");scanf("%d",&h);switch(h){case 1: FCFS(a,m,now);break;case 2: SSTF(a,m,now);break;case 0: exit(0);break;default:break;}}while(h>=0);}。
磁盘调度算法代码
磁盘调度算法是操作系统中用于优化磁盘访问性能的重要策略之一。
在计算机系统中,数据通常存储在磁盘上,当需要读或写数据时,就需要通过磁盘调度算法来确定磁盘读写的顺序,以提高系统的性能和效率。
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 = 53
visited_tracks = sstf(disk_queue, current_head)
print("磁盘访问顺序:", visited_tracks)
运行上述代码,输出结果如下:
磁盘访问顺序: [65, 67, 37, 14, 98, 122, 124, 183]
上述代码实现了简单的SSTF算法,并模拟了一个磁盘访问的过程。
在实际应用中,磁盘调度算法的实现可能更加复杂,需要考虑更多的因素,如磁头移动的方向、优先级等,但总体思想是相似的。
3. 磁盘调度算法的优化
磁盘调度算法中,每种算法都有自己的优势和劣势。
没有一种算法能够在所有情况下都是最优的。
因此,根据不同的应用场景和需求,选择合适的磁盘调度算法是很重要的。
一些可以优化磁盘调度算法性能的方法包括:
•批处理技术:将多个磁盘访问请求合并为一个批处理予以处理,以减少磁头的移动次数。
•前摄法和后摄法:根据请求队列中的磁道号分布情况,选择适合的调度算法,如前摄法适用于磁道号变化较大的场景,后摄法适用于磁道号变化较小的场
景。
•预取技术:提前预取可能访问的磁道,以减少寻道时间。
•缓存技术:使用缓存来存储经常访问的磁道数据,以加快访问速度。
•磁盘阵列技术:通过在多个磁盘上并行处理数据,提高系统的读写性能。
通过合理的优化手段,可以提高磁盘调度算法的性能和效率,进一步提升系统的整体性能。
4. 总结
磁盘调度算法是操作系统中重要的优化策略之一,其目标是通过合理的调度磁盘访问请求,减少磁头寻道时间,提高磁盘的读写性能。
本文以最短寻道时间优先(SSTF)算法为例,通过Python语言的代码实现,介绍
了磁盘调度算法的基本原理和实现过程。
并且提供了一些磁盘调度算法的优化方法,如批处理技术、前摄法和后摄法、预取技术、缓存技术和磁盘阵列技术等。
在实际应用中,根据不同的场景和需求,可以选择适合的磁盘调度算法,并结合相应的优化方法,提升系统的整体性能和效率。