操作系统实验第五讲磁盘调度算法

合集下载

操作系统 -磁盘调度

操作系统 -磁盘调度

磁盘调度算法一、实验目的1、对磁盘调度的相关知识作进一步的了解,明确磁盘调度的原理。

2、加深理解磁盘调度的主要任务。

3、通过编程,掌握磁盘调度的主要算法。

二、实验内容和要求1、对于如下给定的一组磁盘访问进行调度:3、要求给出每种算法中磁盘访问的顺序,计算出平均移动道数。

4、假定当前读写头在90号,向磁道号增加的方向移动。

三、实验报告1、程序中使用的数据结构及符号说明。

2、给出主要算法的流程图。

3、给出程序清单并附上注释。

4、给出测试数据和运行结果。

#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;}}}//============先来先服务=================================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]; //-----寻好的赋给寻好序列}}//========最短寻道法=============================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]; //-------当前寻道号。

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

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

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

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

常见的磁盘调度算法有: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语言模拟电梯调度算法,实现对磁盘的驱动调度,这个相比前两个实验实现起来相对简单,理解了算法实现起来尤为简单,程序敲出来之后没有错误,可直接运行,结果验证也无误。

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

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

实验五磁盘调度算法班级: xxxxxxxxxxxx姓名:xxxxxxxx学号:xxxxxxxxxxxxxxxxxxxxx上级日期:2018年11月成绩:___________________________一、实验目的:通过磁盘调度算法设计一个磁盘调度模拟系统,从而使磁盘调度算法更加形象化,容易理解,使磁盘调度的特点更简单明了,加深对先来先服务算法、最短寻道时间优先算法、扫描算法以及循环扫描算法等磁盘调度算法的理解二、实验内容1、程序流程图模块调用关系图模块程序流程图FCFS算法(先来先服务)流程图SSTF(最短寻道时间优先算法)流程图SCAN算法(扫描算法)流程图CSCAN算法(循环扫描算法)流程图2、程序源码1.#include<stdio.h>2.#include<stdlib.h>3.#include<iostream>4.#include<math.h>ing namespace std;6.#define maxsize 10007./*********************判断输入数据是否有效**************************/8.int decide(char str[]) //判断输入数据是否有效9.{10.int i = 0;11.while (str[i] != '\0')12. {13.if (str[i]<'0' || str[i]>'9')14. {15.return 0;16.break;17. }18. i++;19. }20.return i;21.}22./******************将字符串转换成数字***********************/23.int trans(char str[], int a) //将字符串转换成数字24.{25.int i;26.int sum = 0;27.for (i = 0; i<a; i++)28. {29. sum = sum + (int)((str[i] - '0')*pow(10, a - i - 1));30. }31.return sum;32.}33./*********************冒泡排序算法**************************/34.int *bubble(int cidao[], int m)35.{36.int i, j;37.int temp;38.for (i = 0; i<m; i++) //使用冒泡法按从小到大顺序排列39.for (j = i + 1; j<m; j++)40. {41.if (cidao[i]>cidao[j])42. {43. temp = cidao[i];44. cidao[i] = cidao[j];45. cidao[j] = temp;46. }47. }48. cout << "排序后的磁盘序列为:";49.for (i = 0; i<m; i++) //输出排序结果50. {51. cout << cidao[i] << " ";52. }53. cout << endl;54.return cidao;55.}56./*********************先来先服务调度算法************************/57.void FCFS(int cidao[], int m) //磁道号数组,个数为m58.{59.int now;//当前磁道号60.int sum = 0; //总寻道长度61.int j, i;62.int a;63.char str[100];64.float ave; //平均寻道长度65. cout << "磁盘请求序列为:";66.for (i = 0; i<m; i++) //按先来先服务的策略输出磁盘请求序列67. {68. cout << cidao[i] << " ";69. }70. cout << endl;71. cout << "请输入当前的磁道号:";72.B: cin >> str; //对输入数据进行有效性判断73. a = decide(str);74.if (a == 0)75. {76. cout << "输入数据的类型错误,请重新输入!" << endl;77.goto B;78. }79.else80. now = trans(str, a); //输入当前磁道号81. sum += abs(cidao[0] - now);82. cout << "磁盘扫描序列为:";83.for (i = 0; i<m; i++) //输出磁盘扫描序列84. {85. cout << cidao[i] << " ";86. }87.for (i = 0, j = 1; j<m; i++, j++) //求平均寻道长度88. {89. sum += abs(cidao[j] - cidao[i]);90. ave = (float)(sum) / (float)(m);91. }92. cout << endl;93. cout << "平均寻道长度:" << ave << endl;94.}95./**********************最短寻道时间优先调度算法********************/96.void SSTF(int cidao[], int m)97.{98.int k = 1;99.int now, l, r;100.int i, j, sum = 0;101.int a;102.char str[100];103.float ave;104. cidao = bubble(cidao, m); //调用冒泡排序算法排序105. cout << "请输入当前的磁道号:";106.C: cin >> str; //对输入数据进行有效性判断107. a = decide(str);108.if (a == 0)109. {110. cout << "输入数据的类型错误,请重新输入!" << endl;111.goto C;112. }113.else114. now = trans(str, a); //输入当前磁道号115.if (cidao[m - 1] <= now) //若当前磁道号大于请求序列中最大者,则直接由外向内依次给予各请求服务116. {117. cout << "磁盘扫描序列为:";118.for (i = m - 1; i >= 0; i--)119. cout << cidao[i] << " ";120. sum = now - cidao[0];121. }122.if (cidao[0] >= now) //若当前磁道号小于请求序列中最小者,则直接由内向外依次给予各请求服务123. {124. cout << "磁盘扫描序列为:";125.for (i = 0; i<m; i++)126. cout << cidao[i] << " ";127. sum = cidao[m - 1] - now;128. }129.if (now>cidao[0] && now<cidao[m - 1]) //若当前磁道号大于请求序列中最小者且小于最大者130. {131. cout << "磁盘扫描序列为:";132.while (cidao[k]<now) //确定当前磁道在已排的序列中的位置,后面的算法都用到了,可以直接复制后少量修改,节省时间。

操作系统课设 磁盘调度算法程序设计

操作系统课设 磁盘调度算法程序设计

操作系统课设磁盘调度算法程序设计操作系统课设——磁盘调度算法程序设计1:引言1.1 背景1.2 目的和范围1.3 参考文献2:磁盘调度算法概述2.1 磁盘调度的目标2.2 磁盘调度的分类2.3 磁盘调度算法的评价指标3:磁盘调度算法实现3.1 先来先服务(FCFS)算法3.1.1 算法描述3.1.2 算法优缺点3.1.3 算法实现代码示例3.2 最短寻找时间优先(SSTF)算法3.2.1 算法描述3.2.2 算法优缺点3.2.3 算法实现代码示例 3.3 扫描(SCAN)算法3.3.1 算法描述3.3.2 算法优缺点3.3.3 算法实现代码示例 3.4 循环扫描(C-SCAN)算法 3.4.1 算法描述3.4.2 算法优缺点3.4.3 算法实现代码示例 3.5 LOOK算法3.5.1 算法描述3.5.2 算法优缺点3.5.3 算法实现代码示例4:测试与性能评估4.1 测试环境4.2 测试用例设计4.3 对比磁盘调度算法的性能5:结论5.1 结果分析5.2 局限性和未来工作6:附件本文档附带了以下附件:- 磁盘调度算法实现的源代码- 测试用例和数据- 测试结果统计表格7:法律名词及注释7.1 磁盘调度算法:针对磁盘上的存储数据进行调度和访问的算法。

7.2 先来先服务(FCFS)算法:根据请求的到达顺序,依次服务每个请求。

7.3 最短寻找时间优先(SSTF)算法:根据当前磁头位置来寻找最近的请求进行服务。

7.4 扫描(SCAN)算法:磁头从一端开始,向一侧移动并服务请求,直到到达边界,然后返回另一侧。

7.5 循环扫描(C-SCAN)算法:磁头从一端开始,扫描到达边界后回到另一端,重新开始扫描。

7.6 LOOK算法:磁头在服务请求的过程中,只在磁盘上实际存在请求的区域内移动。

操作系统实验 第五讲 磁盘调度算法讲课讲稿

操作系统实验  第五讲 磁盘调度算法讲课讲稿

操作系统实验第五讲磁盘调度算法操作系统实验报告哈尔滨工程大学计算机科学与技术学院第六讲磁盘调度算法一、实验概述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原则依次处理这些子队列,而每处理一个子队列时,又是按照SCAN算法。

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

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

操作系统磁盘调度实验报告一、实验目的:1.了解磁盘调度算法的基本原理;2.熟悉磁盘I/O的实验操作;3.掌握C语言程序编写的磁盘调度算法实现。

二、实验原理:磁盘调度是指操作系统为了提高磁盘I/O的效率而对磁盘请求进行排序和调度的过程。

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

本次实验中,我们将选择SSTF算法来对磁盘请求进行调度。

SSTF算法的基本思想是选择离当前磁头最近的磁道先进行访问。

三、实验环境:1. 操作系统:Windows 10;2. 开发工具:Visual Studio 2024四、实验步骤:1.创建C语言项目并添加源代码文件;2.实现磁盘调度算法的主要函数,包括判断方向函数、SSTF算法函数;3.在主函数中读取磁道请求,调用SSTF算法函数进行磁道调度;4.运行程序,观察磁道调度结果。

五、实验代码:```c#include<stdio.h>#include<stdlib.h>#include<limits.h>//定义磁盘请求的最大数量#define MAX_REQUEST 100//定义磁盘请求结构体typedef struct diskRequestint track; //磁道号int visited; //记录当前请求是否被访问过(0表示未访问,1表示已访问)} DiskRequest;//全局变量,用来记录磁盘请求的数量int n;//方向判断函数,若当前头部位置比目标位置小,则返回1;否则返回-1int determineDirection(int current, int target)if (current < target)return 1;elsereturn -1;//SSTF算法函数,使用SSTF算法将未被访问的磁道号按顺序调度//current: 当前磁头所在磁道号//requests: 磁盘请求数组void SSTF(int current, DiskRequest* requests)int visited = 0; //记录已访问的磁道数量int totalSeekTime = 0; //记录总寻道时间int direction = determineDirection(current,requests[0].track); //记录当前移动方向int next = current; //记录下一个要访问的磁道号//循环调度直到所有磁道访问完毕while (visited < n)int minSeekTime = INT_MAX; //记录最短寻道时间//遍历从当前位置开始的所有未被访问的磁道for (int i = 0; i < n; i++)if (!requests[i].visited)//计算当前未被访问的磁道与当前位置的距离int seekTime = abs(current - requests[i].track); if (seekTime < minSeekTime)minSeekTime = seekTime;next = requests[i].track;}}}//更新总寻道时间totalSeekTime += minSeekTime;//将当前访问的磁道标记为已访问for (int i = 0; i < n; i++)if (requests[i].track == next)requests[i].visited = 1;visited++;break;}}//更新当前位置current = next;}printf("SSTF Algorithm:\n");printf("Total Seek Time: %d\n", totalSeekTime);printf("Average Seek Time: %.2f\n", (float)totalSeekTime / n);int mainDiskRequest* requests; //磁盘请求数组int current; //当前磁头所在磁道号//读取输入,获取磁盘请求的数量和当前磁头所在的磁道号printf("Please enter the number of disk requests: ");scanf("%d", &n);printf("Please enter the current disk track: ");scanf("%d", &current);//动态分配内存给磁盘请求数组requests = (DiskRequest*)malloc(n * sizeof(DiskRequest));//读取磁盘请求的磁道号printf("Please enter the disk requests:\n");for (int i = 0; i < n; i++)scanf("%d", &requests[i].track);requests[i].visited = 0; //初始化磁道为未访问状态}//调用SSTF算法对磁盘请求进行调度SSTF(current, requests);//释放内存free(requests);return 0;```六、实验结果与分析:1.实验输入:```Please enter the number of disk requests: 5Please enter the current disk track: 50Please enter the disk requests:4560102030```2.实验输出:```SSTF Algorithm:Total Seek Time: 75Average Seek Time: 15.00```3.实验分析:根据实验输入,我们可以得知当前磁头的位置为50,磁盘请求的磁道号依次为45、60、10、20、30。

磁盘调度的算法

磁盘调度的算法

磁盘调度的算法
磁盘调度是计算机操作系统中的一个重要功能,用于决定磁盘驱动器上的磁盘访问请求的顺序。

磁盘调度算法的目标是尽可能地减少磁盘的寻道时间和旋转延迟,以提高磁盘的访问效率。

常见的磁盘调度算法包括以下几种:
1. 先来先服务(FCFS):磁盘访问请求按照它们的到达顺序进行处理。

这种算法简单且公平,但是可能导致磁盘的平均寻道时间较长。

2. 最短寻道时间优先(SSTF):选择距离当前磁头位置最近的磁道作为下一个要访问的磁道。

这种算法能够减少磁头的寻道时间,但是可能会导致某些磁道被连续访问,从而降低了磁盘的整体吞吐量。

3. 扫描算法(SCAN):磁头按照一个方向移动,处理磁盘上的请求,直到到达磁盘的边界,然后改变方向继续移动。

这种算法可以减少磁盘的平均寻道时间,并且确保所有的磁道都被访问到,但是可能导致某些磁道的访问延迟较长。

4. 循环扫描算法(C-SCAN):类似于扫描算法,但是在到达磁盘边界后,直接返回到起始位置,而不是改变方向。

这种算法可以进一步降低磁头的寻道时间,并且在某些情况下可以提高磁盘的整体性能。

5. 最佳扫描算法(LOOK):类似于扫描算法,但是在到达磁盘边界后,只改变方向,而不是反向移动。

这种算法可以根据实际的磁盘访问请求动态调整磁头的移动方向,以减少磁头的寻道时间。

需要注意的是,每种磁盘调度算法都有其适用的场景和优缺点,选择
合适的算法取决于具体的应用需求和性能要求。

磁盘调度算法的实现

磁盘调度算法的实现

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

第五章_磁盘移臂调度算法

第五章_磁盘移臂调度算法

思考:假设磁盘访问序列: 98, 183, 37, 122, 14, 124, 65, 67 读写头起始位置:53 试安排磁头服务序列,并计算磁头移动总距离(道数)
四、循环扫描算法CSAN(Circular SCAN)(不考) SCAN算法存在这样的问题:当磁头刚从里向外 移动过某一磁道时、恰有进程请求访问此磁道,这 时该进程必须等待,待磁头从里向外.然后再从外 向里扫描完所有要访问的磁道后、才处理该进程的 请求,致使该进程的请求被严重地推迟。为了减少 这种延迟, SSTF的另一个修改版本是循环扫描法 (CSAN)。 该算法规定磁头单向移动。例如,只自里 向外移动,当磁头移到最外的被访问磁道时,磁头 立即返回到最里的欲访磁道,即将最小磁道号紧接 着最大磁道号构成循环,进行扫描。即一个在磁道0 上的I/O请求,将在磁道400上请求之后马上可以得 到满足。
思考:假设磁盘访问序列: 98, 183, 37, 122, 14, 124, 65, 67 读写头起始位置:53 试安排磁头服务序列,并计算磁头移动总距离(道数)
三、扫描(SCAN)算法(电梯调度算法) 具体做法:当设备无访问请求时,磁头不动; 当有访问请求时,磁头按一个方向移动,在移动过 程中对遇到的访问请求进行服务,然后判断该方向 上是否还有访问请求,如果有则继续扫描;否则改 变移动方向,并为经过的访问请求服务,如此反复.
按按此策略完成这组I/O操作需移动磁头的总距 离为490磁道。。(如右下图所示) 当前磁道=100 移动方向=OUT(向0道) 该方法克服了最短 进程号 磁道号 移动距离(磁道数) 寻道优先的缺点,既考 22 56 44 虑了距离,同时又考虑 29 40 16 了方向。 32 29 11 4 19 10 但是,必须说明, 12 19 0 这种修改的SCAN调度 34 18 1 策略并不总是优于纯 17 3 15 7 134 131(移动方向=IN) SSTF调度算法。 14 192 58 由于这种算法中磁 23 205 13 头移动的规律颇似电梯 9 376 171 的运行,故又常称为电 3 396 20 磁头移动的总距离=490 (磁道) 梯调度算法

磁盘调度算法实验报告

磁盘调度算法实验报告

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

操作系统-磁盘调度算法

操作系统-磁盘调度算法

操作系统-磁盘调度算法1 一次磁盘读/写操作需要的时间寻找时间(寻道时间)T s:在读/写数据前,需要将磁头移动到指定磁道所花费的时间。

寻道时间分两步:(1) 启动磁头臂消耗的时间:s。

(2) 移动磁头消耗的时间:假设磁头匀速移动,每跨越一个磁道消耗时间为m,共跨越n条磁道。

则寻道时间T s= s + m * n。

磁头移动到指定的磁道,但是不一定正好在所需要读/写的扇区,所以需要通过磁盘旋转使磁头定位到目标扇区。

延迟时间T R:通过旋转磁盘,使磁头定位到目标扇区所需要的时间。

设磁盘转速为r(单位:转/秒,或转/分),则平均所需延迟时间T R=(1/2)*(1/r) = 1/2r。

1/r就是转一圈所需的时间。

找到目标扇区平均需要转半圈,因此再乘以1/2。

传输时间T R:从磁盘读出或向磁盘中写入数据所经历的时间,假设磁盘转速为r,此次读/写的字节数为b,每个磁道上的字节数为N,则传输时间T R= (b/N) * (1/r) = b/(rN)。

每个磁道可存N字节数据,因此b字节数据需要b/N个磁道才能存储。

而读/写一个磁道所需的时间刚好是转一圈的时间1/r。

总的平均时间T a= T s+ 1/2r + b/(rN),由于延迟时间和传输时间都是与磁盘转速有关的,且是线性相关。

而转速又是磁盘的固有属性,因此无法通过操作系统优化延迟时间和传输时间。

所以只能优化寻找时间。

2 磁盘调度算法2.1 先来先服务算法(FCFS)算法思想:根据进程请求访问磁盘的先后顺序进行调度。

假设磁头的初始位置是100号磁道,有多个进程先后陆续地请求访问55、58、39、18、90、160、150、38、184号磁道。

按照先来先服务算法规则,按照请求到达的顺序,磁头需要一次移动到55、58、39、18、90、160、150、38、184号磁道。

磁头共移动了 45 + 3 + 19 + 21 + 72 + 70 + 10 + 112 + 146 = 498个磁道。

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

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

操作系统实验报告实验六磁盘调度算法班级:学号:姓名:一、需求分析1、实验目的:通过这次实验,加深对磁盘调度算法的理解,进一步掌握先来先服务FCFS、最短寻道时间优先SSTF、SCAN和循环SCAN算法的实现方法。

2、问题描述:设计程序模拟先来先服务FCFS、最短寻道时间优先SSTF、SCAN和循环SCAN算法的工作过程。

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

3、程序要求:1)利用先来先服务FCFS、最短寻道时间优先SSTF、SCAN 和循环SCAN算法模拟磁道访问过程。

2)模拟四种算法的磁道访问过程,给出每个磁道访问的磁头移动距离。

3)输入:磁道个数n和磁道访问序列,开始磁道号m和磁头移动方向(对SCAN和循环SCAN算法有效),算法选择1-FCFS,2-SSTF,3-SCAN,4-循环SCAN。

4)输出:每种算法的平均寻道长度。

二、概要设计1、程序中的变量及数据结构的定义a) 自定义的整型向量类型:typedef vector<int> vInt;b) 磁道的结构体:struct OrderItem{int Data; //磁道号bool IsVisited;//磁道是否已被访问};c) 磁道序列类型:typedef vector<OrderItem> Order;d) 存储待访问磁道序列:Order InitOrder;e) 存储已被访问的磁道序列:vInt TrackOrder;f) 移动距离序列:vInt MoveDistance;g) 平均寻道长度:double AverageDistance;2、主要函数说明a)获取用户输入的磁盘个数和磁盘的访问序列:void InitDate(int &num);参数num为磁道个数b)先来先服务算法:void FCFS(int disk);c)最短寻道时间优先算法:void SSTF(int disk);d)扫描算法:void SCAN(int disk);e)循环扫描算法:void CSCAN(int disk);f)void Show(int disk);3、主函数的流程三、详细设计1.FCFS算法a)说明:根据进程请求访问磁盘的先后次序进行调度。

操作系统实验第五讲磁盘调度算法

操作系统实验第五讲磁盘调度算法

操作系统实验报告哈尔滨工程大学计算机科学与技术学院第六讲磁盘调度算法一、实验概述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 算法源代码的基础上进行改写,要求不再使用双重循环,而是只遍历一次请求队列中的请求,就可以选中下一个要处理的请求。

算法流程图如下图所示。

图SCAN算法IopDiskSchedule函数流程图(2)编写循环扫描(CSCAN)磁盘调度算法在已经完成的SCAN算法源代码的基础上进行改写,不再使用全局变量ScanInside确定磁头移动的方向,而是规定磁头只能从外向内移动。

当磁头移动到最内的被访问磁道时,磁头立即移动到最外的被访问磁道,即将最大磁道号紧接着最小磁道号构成循环,进行扫描。

算法流程图如下图所示。

图CSCAN算法IopDiskSchedule函数流程图(3)编写N-Step-SCAN磁盘调度算法在已经完成的SCAN 算法源代码的基础上进行改写,将请求队列分成若干个长度为N 的子队列,调度程序按照FCFS原则依次处理这些子队列,而每处理一个子队列时,又是按照SCAN算法。

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

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

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

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

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

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

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

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

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

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

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

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

记录磁头移动的距离。

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

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

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

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

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

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

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

操作系统磁盘调度算法

操作系统磁盘调度算法

操作系统磁盘调度算法磁盘调度算法的作用在计算机系统中,磁盘是一个重要的存储设备,而磁盘调度算法则是管理磁盘读写请求的关键操作之一。

磁盘调度算法可以使磁盘的读写时间最小,提高磁盘的利用率,保证磁盘的可靠性。

常见的磁盘调度算法先来先服务(FCFS)先来先服务是一种简单、易于实现的磁盘调度算法。

它将磁盘请求队列中的请求按照队列顺序进行服务,即磁盘读写请求按照先来先服务的原则被服务。

例如,如果请求队列为1,2,3,4,5,则磁头先会寻找1,完成后再寻找2,以此类推。

当然,这种算法会存在“饥饿”现象,即后面的请求需要等待前面的请求完成后才能获得服务。

最短寻道时间优先(SSTF)SSTF是一种比FCFS更优秀的算法,它选择离当前磁头位置最近的请求为下一个服务对象。

这种算法的好处在于,可以减少磁头的寻道时间。

例如,如果当前磁头在请求队列的3个请求2, 5和8的中间位置,则SSTF会选择请求2,这样会比选择5或8更快地完成磁盘读写。

扫描算法(SCAN)扫描算法,也称电梯算法,是一种沿着磁道的方向移动磁头的算法。

在扫描算法中,磁头在一个方向上移动,直到到达最边缘,然后开始沿着相反的方向移动,直到服务完整个队列。

例如,如果磁头的移动方向是向“外”(即向磁道号增大的方向),磁头将服务最小的请求,然后继续向下寻找。

当磁头到达队列的最大值后,再继续向“内”折回。

这种算法将会循环操作队列,直到完成服务。

循环扫描算法(C-SCAN)循环扫描算法是一种改进版的SCAN算法,它将SCAN算法改进成了一个环形的磁盘,在这个环形的磁盘上磁头运动方向是单向的。

与SCAN算法不同的是,当读写头到达一端时,它不会立即返回而是重新回到另一端继续扫描。

例如,一旦磁头到达队列的最大值,它会马上返回队列的最小值,这样可以更好地利用闲置时间服务队列。

磁盘调度算法的选择在实际应用中,选择适当的磁盘调度算法对于磁盘性能有着至关重要的影响。

FCFS算法简单但性能一般,SSTF算法寻找最近请求可提高系统性能,SCAN和C-SCAN算法可以处理高负载的读写请求。

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

操作系统实验报告哈尔滨工程大学计算机科学与技术学院第六讲磁盘调度算法一、实验概述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原则依次处理这些子队列,而每处理一个子队列时,又是按照SCAN算法。

算法流程图如下图所示。

图 3.1.3 N-Step-SCAN算法IopDiskSchedule函数流程图2.算法实现(1)改写SCAN算法在一次遍历中,不再关心当前磁头移动的方向,而是同时找到两个方向上移动距离最短的线程所对应的请求,这样就不再需要遍历两次。

在计算出线程要访问的磁道与当前磁头所在磁道的偏移后,可以将偏移分为三种类型:偏移为0,表示线程要访问的磁道与当前磁头所在磁道相同,此情况应该优先被调度,可立即返回该线程对应的请求的指针;偏移大于0,记录向内移动距离最短的线程对应的请求;偏移小于0,记录向外移动距离最短的线程对应的请求。

循环结束后,根据当前磁头移动的方向选择同方向移动距离最短的线程,如果在同方向上没有线程,就变换方向,选择反方向移动距离最短的线程。

(2)编写循环扫描(CSCAN)磁盘调度算法由于规定了磁头只能从外向内移动,所以在每次遍历中,总是同时找到向内移动距离最短的线程和向外移动距离最长的线程。

注意,与SCAN 算法查找向外移动距离最短线程不同,这里查找向外移动距离最长的线程。

在开始遍历前,可以将用来记录向外移动最长距离的变量赋值为0。

在计算出线程要访问的磁道与当前磁头所在磁道的偏移后,同样可以将偏移分为三种类型:偏移为0,表示线程要访问的磁道与当前磁头所在磁道相同,此情况应优先被调度,可立即返回该线程对应的请求的指针;偏移大于0,记录向内移动距离最短的线程对应的请求;偏移小于0,记录向外移动距离最长的线程对应的请求。

循环结束后,选择向内移动距离最短的线程,如果没有向内移动的线程,就选择向外移动距离最长的线程。

(3)编写N-Step-SCAN磁盘调度算法在block.c 文件中的第360 行定义了一个宏SUB_QUEUE_LENGTH,表示子队列的长度(即N 值)。

目前这个宏定义的值为6。

在第367行定义了一个全局变量SubQueueRemainLength,表示第一个子队列剩余的长度,并初始化其值为SUB_QUEUE_LENGTH。

在执行N-Step-SCAN算法时,要以第一个子队列剩余的长度做为计数器,确保只遍历第一个子队列剩余的项。

所以,结束遍历的条件就既包括第一个子队列结束,又包括整个队列结束(如果整个队列的长度小于第一个子队列剩余的长度)。

注意,不要直接使用第一个子队列剩余的长度做为计数器,可以定义一个新的局部变量来做为计数器。

按照SCAN 算法从第一个子队列剩余的项中选择一个合适的请求。

最后,需要将第一个子队列剩余长度减少1(SubQueueRemainLength减少1),如果第一个子队列剩余长度变为0,说明第一个子队列处理完毕,需要将子队列剩余的长度重新变为N(SubQueueRemainLength 重新赋值为SUB_QUEUE_LENGTH),从而开始处理下一个子队列。

3.需要解决的问题及解答(1)实验指导P176-3.2验证先来先服务(FCFS)磁盘调度算法,要求请给出在“输出”窗口中的结果。

答:先来先服务(FCFS)磁盘调度算法在“输出”窗口中的结果如下图所示。

图 3.3.1(2)实验指导P177-3.3验证验证最短寻道时间优先(SSTF)磁盘调度算法,要求请给出在“输出”窗口中的结果。

答:最短寻道时间优先(SSTF)磁盘调度算法在“输出”窗口中的结果如下图所示。

图 3.3.2(3)实验指导P178-3.4验证SSTF算法造成的线程“饥饿”现象,要求请给出在“输出”窗口中的结果。

答:SSTF算法造成的线程“饥饿”现象在“输出”窗口中的结果如下图所示。

图 3.3.3(4)实验指导P179-3.5验证扫描(SCAN)磁盘调度算法,要求在非饥饿(即《实验指导》P176-3.2节中的数据)和饥饿(即《实验指导》P178-3.4节中的数据)请给出在“输出”窗口中的结果,并且要求在每次输入两次“ds”命令(注意不要连续输入,要等第一次“ds”命令执行完,再输入第二次“ds”命令),分析结果为什么不同。

答:在非饥饿情况下,“输出”窗口中的结果如下图所示。

图 3.3.4在饥饿情况下,“输出”窗口中的结果如下图所示。

图 3.3.5ScanInside是一个全局变量,当第一次执行“ds”命令时,调用IopDiskSchedule 函数,ScanInside被修改了一次,再次执行“ds”命令时,ScanInside不会被重置,因此输出的结果会不一样。

(5)在执行SCAN、N-Step-SCAN 磁盘调度算法时,如果在EOS控制台中多次输入“ds”命令,调度的顺序会发生变化,说明造成这种现象的原因(提示:注意这两种算法使用的全局变量)。

尝试修改源代码,使这两种算法在多次执行时,都能确保调度的顺序一致(提示:可以参考io/block.c 文件中IopReceiveRequest 函数和IopProcessNextRequest 函数判断磁盘调度算法开始工作和结束工作的方法)。

答:ScanInside是一个全局变量,当第一次执行“ds”命令时,调用IopDiskSchedule 函数,ScanInside被修改了一次,再次执行“ds”命令时,ScanInside不会被重置,因此输出的结果会不一样。

只需在for循环结束后添加如下代码,就能确保调度的顺序一致。

图 3.3.6(6)尝试在io/block.c 文件中定义一个全局的函数指针变量DiskScheduleFunc,该函数指针初始指向实现了FCFS 算法的IopDiskSchedule 函数。

修改io/block.c 文件中的IopProcessNextRequest 函数,在该函数中不再直接调用IopDiskSchedule 函数,而是调用函数指针DiskScheduleFunc 指向的磁盘调度算法函数;ke/sysproc.c 文件中的ConsoleCmdDiskSchedule 函数中也不再直接调用IopDiskSchedule函数,也要修改为调用函数指针DiskScheduleFunc指向的磁盘调度算法函数。

最后,添加一个控制台命令“sstf”,该命令使函数指针DiskScheduleFunc 指向实现了SSTF 算法的函数。

这样,在EOS启动后默认会执行FCFS 算法,执行控制台命令“sstf”后,会执行SSTF算法。

按照这种方式依次实现“fcfs”、“scan”、“cscan”和“nstepscan”命令。

说明这种在EOS运行时动态切换磁盘调度算法的好处。

答:首先在block.c 中定义一个全局的函数指针变量DiskScheduleFunc。

图 3.3.7修改IopProcessNextRequest 函数和ConsoleCmdDiskSchedule 函数,使其不再直接调用IopDiskSchedule 函数而是调用函数指针DiskScheduleFunc指向的磁盘调度算法函数。

图 3.3.8调用函数前先声明。

图 3.3.9添加一个控制台命令“sstf”,该命令使函数指针DiskScheduleFunc 指向实现了SSTF 算法的函数。

验证结果如下图所示。

(7)分析已经实现的各种磁盘调度算法的优缺点,尝试实现更多其它的磁盘调度算法。

答:先来先服务算法是一种比较简单的磁盘调度算法,它根据进程请求访问磁盘的先后次序进行调度,此算法的优点是公平、简单,且每个进程的请求都能依次得到处理,不会出现某一进程的请求长期得不到满足的情况,在对磁盘的访问请求比较多的情况下,致使平均寻道时间可能较长;最短寻道时间优先算法选择这样的进程,其要求访问的磁道与当前磁头所在的磁道距离最近,以使每次的寻道时间最短,该算法可以得到比较好的吞吐量,但却不能保证平均寻道时间最短,其缺点是在服务请求很多的情况下,对内外边缘磁道的请求将会无限期的被延迟;扫描算法不仅考虑到欲访问的磁道与当前磁道的距离,更优先考虑的是磁头的当前移动方向,此算法基本上克服了最短寻道时间优先算法的服务集中于中间磁道和响应时间变化比较大的缺点,而具有最短寻道时间优先算法的优点即吞吐量较大,平均响应时间较小,但由于是摆动式的扫描方法,两侧磁道被访问的频率仍低于中间磁道;循环扫描算法是对扫描算法的改进,如果对磁道的访问请求是均匀分布的,当磁头到达磁盘的一端,并反向运动时落在磁头之后的访问请求相对较少;N-Step-SCAN算法是扫描算法和先来先服务算法的一个综合算法,将请求队列分成若干个长度为N 的子队列,调度程序按照FCFS原则依次处理这些子队列,而每处理一个子队列时,又是按照SCAN算法,所以它是一种性能比较平均的算法。

(6)EOS 在块设备层实现了磁盘调度算法后,由于请求队列中的请求一定是被逐个处理的,所以并发的多个线程已经可以互斥的访问磁盘上的数据,那为什么在IopReadWriteSector 函数中还要使用磁盘设备的互斥信号量进行互斥呢?(提示:如果一个线程只是要获取磁盘设备的状态而不是要访问磁盘上的数据,是否需要对该线程进行磁盘调度?该线程是否要与其它并发访问磁盘设备的线程进行互斥?)答:如果一个线程只是要获取磁盘设备的状态而不是要访问磁盘上的数据,那这个线程是不需要进行磁盘调度的,所以不会进入请求队列,但该线程同样需要与其它并发访问磁盘设备的线程进行互斥,这时就需要使用磁盘设备的互斥信号量进行互斥。

相关文档
最新文档