操作系统实验——磁盘调度算法(FIFS SSTF SCAN)

操作系统实验——磁盘调度算法(FIFS SSTF SCAN)

一、实验目的

1、了解磁盘调度的策略和原理;
2、理解和掌握磁盘调度算法——先来先服务算法(FCFS)、最短寻道时间优先算法(SSTF)、电梯扫描算法(SCAN)。

二、实验内容

1、模拟先来先服务法(First-Come, First-Served,FCFS),最短寻道时间优先法(Shortest Seek Time First, SSTF),电梯扫描算法(SCAN)三种磁盘调度算法;
2、对三种算法进行对比分析。
3、输入为一组请求访问磁道序列,输出为每种调度算法的磁头移动轨迹和移动的总磁道数。

三、实验原理

1、先来先服务算法(FCFS):

按先来后到次序服务,未作优化。最简单的移臂调度算法是“先来先服务”调度算法,这个算法实际上不考虑访问者要求访问的物理位置,而只是考虑访问者提出访问请求的先后次序。 采用先来先服务算法决定等待访问者执行输入输出操作的次序时,移动臂来回地移动。先来先服务算法花费的寻找时间较长,所以执行输入输出操作的总时间也很长。

2、最短寻道时间优先算法(SSTF) :

最短寻找时间优先调度算法总是从等待访问者中挑选寻找时间最短的那个请求先执行的,而不管访问者到来的先后次序。与先来先服务、算法比较,大幅度地减少了寻找时间,因而缩短了为各访问者请求服务的平均时间,也就提高了系统效率。但最短查找时间优先(SSTF)调度,FCFS会引起读写头在盘面上的大范围移动,SSTF查找距离磁头最短(也就是查找时间最短)的请求作为下一次服务的对象。SSTF查找模式有高度局部化的倾向,会推迟一些请求的服务,甚至引起无限拖延(又称饥饿)。

3、扫描算法(SCAN):

SCAN 算法又称电梯调度算法。SCAN算法是磁头前进方向上的最短查找时间优先算法,它排除了磁头在盘面局部位置上的往复移动,SCAN算法在很大程度上消除了SSTF算法的不公平性,但仍有利于对中间磁道的请求。“电梯调度”算法是从移动臂当前位置开始沿着臂的移动方向去选择离当前移动臂最近的那个柱访问者,如果沿臂的移动方向无请求访问时,就改变臂的移动方向再选择。但是,“电梯调度”算法在实现时,不仅要记住读写磁头的当前位置,还必须记住移动臂的当前前进方向。

四、实验中用到的系统调用函数

  实验只是模拟实现磁盘调度功能,不需要系统调用函数。

五、实验要求

1、输入为一组请求访问磁道序列,该序列和所选磁道个数要求随机生成,输出为每种调度算法的磁头移动轨迹和移动的总磁道数;

srand((int)time(NULL));
	cout << "请输入生成的访问磁道进程数量:";
	int n, m, p=0;
	int flag ;
	string direction;
	cin >> n;
	int a[100];
	for (int i = 0; i < n; i++)
	{
   
		a[i] = rand() % 1000;
	}cout << "生成的访问进程为:";
	for (int i = 0; i < n; i++)
	{
   
		if (i % 5 == 0)
		{
   
			cout << endl;
		}
		cout << a[i] << "  ";

	}

2、输入磁道范围 0~1000 ,输入所选磁道个数0~1000;

3、画出主程序流程图;

在这里插入图片描述
源代码:

include <iostream>
#include<cstdlib>
#include <time.h>

using namespace std;
class DISK
{
   
private:
	int Movedistance;//移动距离	
	int Lable[100];//标号指针
	string Movedirection;//移动方向
public:
	int  Calculate_Diference(int a, int b)//计算移动距离(差值的绝对值)
	{
   
		return (a - b > 0 ? a - b : b - a);
	}
	void ShowPath(int a[], int x, int len)//调度过程  时间复杂度O(n)
	{
   
		cout << "从" << x << "号磁道开始" << endl;
		for (int i = 1; i < len + 1; i++)
		{
   
			cout << "下一个访问的磁道号:" << a[i] << "\t移动的距离:" << Calculate_Diference(a[i], a[i - 1]) << endl;
		}
	}
	void CalculateMoveDistance(int a[], int
  • 24
    点赞
  • 215
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
好的,我可以为你提供一份磁盘调度算法实验报告的模板,你可以根据需要进行修改和补充。 实验目的: 通过实验,了解磁盘调度算法的原理和不同算法的优缺点,以及掌握如何使用C语言编写磁盘调度算法实验环境: 操作系统:Windows 10 编程语言:C语言 实验内容: 本次实验主要分为以下几个部分: 1. 磁盘调度算法的原理和分类 2. 磁盘调度算法的实现及代码解析 3. 实验结果分析和比较 1. 磁盘调度算法的原理和分类 磁盘调度算法是指将磁盘上的读写请求按照一定的规则进行排序,然后按照这个排序规则依次处理这些请求的过程。常见的磁盘调度算法有以下几种: (1) 先来先服务算法(FCFS):按照读写请求的先后顺序进行排序,先到达的先进行处理。 (2) 最短寻道时间优先算法(SSTF):按照磁头移动的距离进行排序,移动距离最小的先进行处理。 (3) 扫描算法(SCAN):按照磁头的移动方向进行排序,先处理一个方向上的所有请求,再返回另一个方向上的请求。 (4) 循环扫描算法(C-SCAN):与SCAN算法类似,但是在处理完一个方向上的所有请求后,直接返回到另一个方向的起点处,继续处理请求。 (5) LOOK算法:与SCAN算法类似,但是在到达最外层或最内层时,不需要返回,直接调头而行。 2. 磁盘调度算法的实现及代码解析 以下是FCFS算法的代码实现和解析: ```c #include<stdio.h> #include<conio.h> int main() { int n,i,j,k,sum=0,queue[20],head,m; printf("Enter the size of disk queue: "); scanf("%d",&n); printf("Enter the disk queue: "); for(i=0;i<n;i++) scanf("%d",&queue[i]); printf("Enter the initial head position: "); scanf("%d",&head); queue[n]=head; n++; for(i=0;i<n;i++) { for(j=i;j<n;j++) { if(queue[i]>queue[j]) { m=queue[i]; queue[i]=queue[j]; queue[j]=m; } } } for(i=0;i<n;i++) { if(head==queue[i]) { k=i; break; } } for(i=k;i>=0;i--) { printf("%d ",queue[i]); sum=sum+abs(head-queue[i]); head=queue[i]; } printf("0 "); sum=sum+head; head=0; for(i=k+1;i<n;i++) { printf("%d ",queue[i]); sum=sum+abs(head-queue[i]); head=queue[i]; } printf("\nTotal number of head movements: %d",sum); getch(); return 0; } ``` 解析: (1) 首先输入磁盘队列的大小和队列元素。 (2) 输入初始磁头位置。 (3) 将磁盘队列按照请求的先后顺序进行排序。 (4) 找到初始磁头位置在排序后的队列中的位置。 (5) 从初始位置向队列头部遍历,计算磁头移动距离。 (6) 从队列头部向队列尾部遍历,计算磁头移动距离。 (7) 输出总的磁头移动距离。 3. 实验结果分析和比较 在实验中,我们可以通过模拟不同的磁盘队列和磁头位置,观察不同磁盘调度算法的执行效果,并通过比较它们的磁头移动距离来评估它们的优劣。 在不同的磁盘队列和磁头位置下,不同的磁盘调度算法可能会有不同的表现。一般来说,SSTF算法可以使磁头移动距离最小,但是可能会出现请求饥饿的情况;SCAN和C-SCAN算法可以保证公平性,但是可能会出现长等待时间的情况;LOOK算法可以兼顾公平性和磁头移动距离,但是可能会出现不稳定的情况。 因此,我们需要根据实际情况选择不同的磁盘调度算法,以达到最优的磁头移动距离和较好的公平性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值