操作系统磁盘调度算法(c++)

这篇具有很好参考价值的文章主要介绍了操作系统磁盘调度算法(c++)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

先来先服务这个没什么好说了,按顺序来就是了。将需要访问的磁道序列直接作为算法的访问序列,然后将每次移动的磁道数量记录下来。

最短寻道时间优先,每次执行完,看一下离自己最近的哪条磁道有任务,就移动过去执行。每次寻找下一次访问的磁道号时,都遍历磁道序列,找到最近的磁道,记下此磁道在磁道序列的位置,并换到前面(假设第i次寻找就换到i-1号),循环直到算法访问序列全部算出。然后依照访问序列记录每次移动的磁道数量。

scan,扫描算法也叫电梯算法,从当前位置开始,指定某个方向移动,移动到该方向所有任务都执行完毕,调换反向继续搜索。将磁道序列升序排序,找到第一个磁道号大于等于当前磁道号的位置 pos,作为下一次访问的磁道。从该磁道往后将所有磁道遍历,然后从这里开始  ,继续往前遍历直到全部磁道都访问完 。

cscan,循环扫描算法,和scan的区别在于往一个方向扫描完后,回到另一端的开始任务,继续循环。

先来先服务算法最简单,每个进程按到达时间先后进行服务,不会出现进程长时间等待,但是平均寻道的距离较长。最短寻道时间优先算法保证每一次找到移动距离最短的磁道开始服务,但是不能保证平均寻道时间最短,效率比先来先服务高。扫描算法即能获得较好的性能,也避免”饥饿”现象发生,但是需要先将磁道需要访问的序列进行排序,空间消耗较大。如果采用循环scan,例如scan向高磁道方向扫描完成后,回到最低的访问任务所在磁道,然后继续向高磁道方向扫描,那么可以使每一条磁道的平均访问比较均匀,而普通scan算法在靠近两端的磁道上的寻道时间有可能很长,虽然平均寻道时间更短

代码示例如下

#include<iostream>
#include<conio.h>
using namespace std;

#define TRACK_NUM  12	  //io时需要访问的磁道数量

int TRACK_SEQUENCE[TRACK_NUM] ;    //存放磁道访问序列的数组
int CURRENT_TRACK;             //当前磁头所在的磁道号
int move_num[TRACK_NUM];       //记录每次移动的磁道数
int FCFS_MOVE_SEQUENCE[TRACK_NUM];    //存放先来先服务算法的磁道访问序列
int SSTF_MOVE_SEQUENCE[TRACK_NUM];    //存放最短寻道时间优先算法的磁道访问序列
int SCAN_MOVE_SEQUENCE[TRACK_NUM];	//存放扫描算法的磁道访问序列
int CSCAN_MOVE_SEQUENCE[TRACK_NUM];	//存放循环扫描算法的磁道访问序列
int ASC_SEQUENCE[TRACK_NUM];        //存放磁道序列的升序排序结果

void init_move_sequence()
{
	for (int i = 0; i < TRACK_NUM; i++)
	{
		FCFS_MOVE_SEQUENCE[i] = TRACK_SEQUENCE[i];
		SSTF_MOVE_SEQUENCE[i] = TRACK_SEQUENCE[i];
		ASC_SEQUENCE[i] = TRACK_SEQUENCE[i];
	}
	
}

void input()
{
	TRACK_SEQUENCE[0] = 23;
	TRACK_SEQUENCE[1] = 376;
	TRACK_SEQUENCE[2] = 205;
	TRACK_SEQUENCE[3] = 132;
	TRACK_SEQUENCE[4] = 19;
	TRACK_SEQUENCE[5] = 61;
	TRACK_SEQUENCE[6] = 190;
	TRACK_SEQUENCE[7] = 398;
	TRACK_SEQUENCE[8] = 29;
	TRACK_SEQUENCE[9] = 4;
	TRACK_SEQUENCE[10] = 18;
	TRACK_SEQUENCE[11] = 40;
	

	CURRENT_TRACK = 100;

	init_move_sequence();
}

void show_result(int* move_sequence)
{
	int i,sum_move_num = 0;

	cout << "\n\n\n该算法的磁道访问序列为: ";
	for (i = 0; i < TRACK_NUM; i++)
		cout << move_sequence[i] << " ";

	cout << "\n每次移动的磁道数为: ";
	for (i = 0; i < TRACK_NUM; i++)
	{
		sum_move_num += move_num[i];
		cout << move_num[i] << " ";
	}

	cout << "\n平均寻道长度为: " << 1.0 * sum_move_num / TRACK_NUM;
	cout << "\n\n 请按任意键继续" << endl;
	_getch();
}

void FCFS()   //先来先服务
{
	int current_track = CURRENT_TRACK;
	for (int i = 0; i < TRACK_NUM; i++)
	{
		move_num[i] = abs(current_track - FCFS_MOVE_SEQUENCE[i]);
		current_track = FCFS_MOVE_SEQUENCE[i];
	}
	show_result(FCFS_MOVE_SEQUENCE);   //显示运行结果
}

void SSTF()   //最短寻道时间优先
{
	int current_track = CURRENT_TRACK;
	int next,temp,i,j;

	for (i = 0; i < TRACK_NUM-1; i++)   //每次选取最短距离的磁道形成寻道序列
	{
		next = i;
		for (j = i+1; j < TRACK_NUM; j++)
		{
			if (abs(current_track - SSTF_MOVE_SEQUENCE[next]) >
				abs(current_track - SSTF_MOVE_SEQUENCE[j]))
			{
				next = j;
			}
		}
		if (next != i)
		{
			temp = SSTF_MOVE_SEQUENCE[next];
			SSTF_MOVE_SEQUENCE[next] = SSTF_MOVE_SEQUENCE[i];
			SSTF_MOVE_SEQUENCE[i] = temp;
		}
		move_num[i] = abs(current_track - SSTF_MOVE_SEQUENCE[i]);
		current_track = SSTF_MOVE_SEQUENCE[i];

	}
	move_num[i] = abs(current_track - SSTF_MOVE_SEQUENCE[i]);
	
	show_result(SSTF_MOVE_SEQUENCE);   //显示运行结果
}

void sort()   //升序排序
{
	int temp;
	for (int i = 1; i < TRACK_NUM; i++)
	{
		for (int j = 0; j < TRACK_NUM - i; j++)
		{
			if (ASC_SEQUENCE[j] > ASC_SEQUENCE[j + 1])
			{
				temp = ASC_SEQUENCE[j];
				ASC_SEQUENCE[j] = ASC_SEQUENCE[j + 1];
				ASC_SEQUENCE[j + 1] = temp;
			}
		}
	}
}

void CSCAN()    //循环扫描算法(先往磁道号增加方向扫描)
{
	sort();   //磁道号按升序排序
	int i,j,pos=0;

	int current_track = CURRENT_TRACK;

	while (1)      //找到下一个要访问的磁道在数组中的序号
	{
		if (ASC_SEQUENCE[pos] >= current_track)
			break;
		pos++;
	}
	for (i = 0,j=pos; i < TRACK_NUM - pos; i++)
	{
		CSCAN_MOVE_SEQUENCE[i] = ASC_SEQUENCE[j++ ];
		move_num[i] = abs(current_track - CSCAN_MOVE_SEQUENCE[i]);
		current_track = CSCAN_MOVE_SEQUENCE[i];
	}
	for (j = 0; i < TRACK_NUM; i++)
	{
		CSCAN_MOVE_SEQUENCE[i] = ASC_SEQUENCE[j++];
		move_num[i] = abs(current_track - CSCAN_MOVE_SEQUENCE[i]);
		current_track = CSCAN_MOVE_SEQUENCE[i];
	}

	show_result(CSCAN_MOVE_SEQUENCE);
}

void SCAN()    //扫描算法(往磁道号增加方向扫描)
{
	sort();   //磁道号按升序排序
	int i, j, pos = 0;

	int current_track = CURRENT_TRACK;

	while (1)      //找到下一个要访问的磁道在数组中的序号
	{
		if (ASC_SEQUENCE[pos] >= current_track)
			break;
		pos++;
	}
	for (i = 0, j = pos; i < TRACK_NUM - pos; i++)
	{
		SCAN_MOVE_SEQUENCE[i] = ASC_SEQUENCE[j++];
		move_num[i] = abs(current_track - SCAN_MOVE_SEQUENCE[i]);
		current_track = SCAN_MOVE_SEQUENCE[i];
	}
	for (j = pos - 1; i < TRACK_NUM; i++)
	{
		SCAN_MOVE_SEQUENCE[i] = ASC_SEQUENCE[j--];
		move_num[i] = abs(current_track - SCAN_MOVE_SEQUENCE[i]);
		current_track = SCAN_MOVE_SEQUENCE[i];
	}

	show_result(SCAN_MOVE_SEQUENCE);
}

void show_message()
{
	cout << "io时需要访问的磁道数量为 : " << TRACK_NUM;
	cout << "\n需要访问的磁道序列为 : ";
	for (int i= 0; i < TRACK_NUM; i++)
		cout << TRACK_SEQUENCE[i] << " ";

	cout << "\n当前磁头所在的磁道号为 : " << CURRENT_TRACK;
	
}

void menu()
{
	char choice;
	while (1)
	{
		system("cls");
		show_message();
		cout << "\n\n\n请选择磁盘调度算法 :" << endl;
		cout << "\t1.先来先服务算法" << endl;
		cout << "\t2.最短寻道时间优先算法" << endl;
		cout << "\t3.扫描算法" << endl;
		cout << "\t4.循环扫描算法" << endl;
		cout << "\t5.离开 " << endl;

		choice = _getch();
		switch (choice) 
		{
			case '1' :
				FCFS();
				break;
			case '2' :
				SSTF();
				break;
			case '3' :
				SCAN();
				break;
			case '4':
				CSCAN();
				break;
			case '5' :
				exit(0);
			default :
			{
				cout << "\n\n输入有误,请按任意键继续" << endl;
				_getch();
			}
		}
	}
	

}

int main()
{
	input();
	menu();
	return 0;

}

当前情况如下

cscan,c++,算法

先来先服务

cscan,c++,算法

最短寻道时间优先

cscan,c++,算法

scan算法

cscan,c++,算法

cscan算法

cscan,c++,算法

 文章来源地址https://www.toymoban.com/news/detail-762249.html

到了这里,关于操作系统磁盘调度算法(c++)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【操作系统】调度算法

    目录 🏫基本概念 🏥先来先服务(FCFS, First Come First Serve) 🏩短作业优先(SJF, Shortest Job First) 🍆细节 ⛪️高响应比优先(HRRN,Highest Response Ratio Next) 🌇时间片轮转(RR,Round-Robin) 🏰时间片大小的影响 🗼优先级调度算法 🌄多级反馈队列调度算法 🌈实例  🗽多级队列调度

    2024年02月08日
    浏览(40)
  • 操作系统——调度算法

    本文的主要内容是调度算法的介绍,包括先来先服务(FCFS)、最短时间优先(SJF)、最高响应比优先(HRRN)、时间片轮转(RR)、优先级调度和多级反馈队列这六种方法,这些调度算法会从其算法思想、算法规则、该方法用于作业调度还是进程调度、进程调度的方式(抢占式和非抢占式

    2023年04月14日
    浏览(35)
  • 操作系统页面调度算法

    实验项目名称:操作系统页面调度算法 一、实验目的和要求 目的:对操作系统中使用的页面调度算法进行设计。 要求:对教材中所讲述的几种页面调度算法进行深入的分析,通过请求页式存储管理中页面置换算法模拟设计,了解虚拟存储技术的特点,掌握请求页式存储管理的

    2024年02月04日
    浏览(38)
  • 「 操作系统 」聊聊进程调度算法

    图文并茂!谈谈进程调度那些算法 Cone 进程调度/页面置换/磁盘调度算法 xiaolinCoding 图解经典的进程调度算法 飞天小牛肉 进程调度算法是操作系统中非常重要的一部分,它决定了操作系统中各个进程的执行顺序和时间片。在单核CPU下,任何时刻都只可能有一个程序在执行,比

    2024年02月04日
    浏览(59)
  • 操作系统之调度算法(学习笔记)

    周转时间 :从作业被提交给系统开始,到作业完成为止的这段时间间隔称为作业周转时间。( 周转时间=作业完成时间-作业提交时间 ) 平均周转时间 :作业周转总时间 / 作业个数( 平均周转时间=(作业1周转时间+作业2周转时间+……作业n周转时间)/n ) 服务时间 :进程在

    2024年02月03日
    浏览(39)
  • 【操作系统之进程调度算法习题】

    在一个具有三道作业的批处理系统中,作业调度采用先来先服务(FCFS) 调度算法,进程调度采用 短作业优先调度算法。现有如下所示的作业序列, 注意 1.具有三道作业的批处理系统指的是内存最多能有3个作业; 2.表格样式是考试时候的格式,练习时候也按这个格式练习各作业的周

    2024年02月11日
    浏览(46)
  • 《操作系统》—— 处理机调度算法

    前言: 在之前的文章中,我们已经了解了进程和线程相关的基本概念,今天我们将要了解的是关于处理机调度相关的知识。   目录 (一)调度的概念 1、调度的基本概念 2、调度的层次 3、三级调度的关系 (二)调度的目标 (三)调度的实现 1、调度器 2、调度的时机、切换

    2024年02月02日
    浏览(55)
  • 操作系统中的调度算法

    处理机调度层次: 1.高级调度( 作业 调度/) 2.中级调度( 内存 调度/) 3.低级调度( 进程 调度/) 一、作业调度算法 1.先来先服务算法(FCFS) 2.短作业优先算法(SJF) 3.优先级调度算法(PR) 4.高响应比调度算法(PR特例) 5.时间片轮转算法(RR) 6.多级队列调度算法 7.基

    2024年02月10日
    浏览(42)
  • 操作系统进程调度算法——先来先服务、时间片轮转、优先级调度算法

    (1)算法内容: 先来先服务调度算法是一种最简单的调度算法,可以应用于高级调度也可以运用于低级调度。高级调度时,FCFS调度算法按照作业进入后备作业队列的先后顺序选择作业进入内存,即先进入后备作业队列的作业被优先选择进入内存,然后为选中的作业创建进程

    2023年04月21日
    浏览(41)
  • 操作系统实验—进程调度算法(java)

    目录 文章目录 前言 一、实验原理 二、实验步骤 1.创建PCB类 2.创建创建类 3.设计主窗口类 4.调度界面函数 5.算法类及其调度算法通用函数 6.进程调度算法函数 总结 操作系统实验1:进程调度算法,步骤3、4在一个类中,步骤5、6在一个类中。 (1)先到先服务调度算法:按照进程提

    2024年02月04日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包