码迷,mamicode.com
首页 > 编程语言 > 详细

磁盘调度算法

时间:2021-06-24 17:36:28      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:tor   性方面   有一个   ++   选择   分析   用户   流程图   enter   

目录

一、    实验目的    3

二、实验内容    3

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

(2)、最短寻找时间优先(SSTF)算法    3

(3)、扫描(SCAN)算法(又称为电梯算法)    3

(4)、循环扫描(C-SCAN)算法    3

(5)、分步电梯调度(F-SCAN)算法    4

补充:磁壁粘着    4

三、实现思路    4

四、主要的数据结构    4

void request(vector<int>&m_vec,ofstream &outfile)    5

void compute_dis(vector<int>m_vec,int &dis,double &average_distance) //计算平均距离函数    5

void FCFS(vector<int>m_vec,int position)    5

void SSTF(vector<int>m_vec,int position)    5

void SCAN(vector<int>m_vec,int position)    5

void CSCAN(vector<int>m_vec,int position)    5

void FSCAN(vector<int>m_vec,int position)    5

void print()    5

int choose_algorithm(vector<int>m_vec)    5

int main()    5

五、算法流程图    6

六、运行与测试    7

(1)FCFS算法    7

(2)SSTF算法    7

(3)SCAN算法    8

(4)CSCAN算法    8

(5)FSCAN算法    9

七、总结(各算法优缺点比较汇总)    9

 

 

 

Tips:建议打开word【导航视图】与批注阅读,数据结构部分的代码编辑在【批注】内。

 

拓展实验5:磁盘调度算法

  1. 实验目的

分析操作系统的核心功能模块,理解相关功能模块实现的数据结构和算法,并加以实现,加深对操作系统原理和实现过程的理解。本次实验:用c++模拟五种磁盘调度算法并比它们的优劣性。

二、实验内容

目前常用的磁盘调度算法有以下几种:

 

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

FCFS 算法根据进程请求访问磁盘的先后顺序进行调度,这是一种最简单的调度算法。该算法的优点是具有公平性。如果只有少量进程需要访问,且大部分

请求都是访问簇聚的文件扇区,则有望达到较好的性能;如果有大量进程竞争使用磁盘,那么这种算法在性能上往往接近于随机调度。所以,实际磁盘调度中考虑一些更为复杂的调度算法。 

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

SSTF算法选择调度处理的磁道是与当前磁头所在磁道距离最近的磁道,以使每次的寻找时间最短。当然,总是选择最小寻找时间并不能保证平均寻找

时间最小,但是能提供比 FCFS 算法更好的性能。这种算法会产生"饥饿"现象。

(3)、扫描(SCAN)算法(又称为电梯算法)

SCAN算法在磁头当前移动方向上选择与当前磁头所在磁道最近的请求作为下一次服务的对象,实际上就是在最短寻道时间优先算法的基础上规定了磁头 运动的方向。由于磁头移动规律与电梯运行相似,又称为电梯调度算法。SCAN 算法对最近扫描过的区域不公平,因此,它在访问局部性方面不如 FCFS 算法和SSTF算法好。

补充:采用 SCAN 算法时,不但要知道磁头的当前位置,还要知道磁头的移动方向。

(4)、循环扫描(C-SCAN)算法

在扫描算法的基础上规定磁头单向移动来提供服务,回返时直接快速移动至起始端而不是服务任何请求。由于SCAN 算法偏向于处理那些接近最里或最外 的磁道的访问请求,所以使用改进型的 C-SCAN 算法来避免这个问题。

(5)、分步电梯调度(F-SCAN)算法

分步电梯调度算法。算法思想是,在扫描的过程中所有新产生的序列放在另外的一个队列中,当访问完当前队列之后,再访问新产生的一个队列。这种算法可以有效防止磁壁粘着现象。

补充:磁壁粘着

在FCFS,SSTF、SCAN及CSCAN几种调度算法中,都有可能出现磁臂停留在某个位置不动的情况。例如,有一个或几个进程对某一磁道有着较高的访问频率,即他们反复地请求对一个磁道进行了I/O请求,从而垄断了整个磁盘设备,这一现象称为磁臂粘着。

三、实现思路

程序入口是main主函数,在程序一开始由request()函数产生随机的要求服务的磁盘序列。然后由用户选择算法FCFS、SSTF、SCAN、CSCAN、FSCAN其中之一。

 

分别执行相应的算法。

 

1)FCFS算法实现思路:将vector内随机产生的数依次读出,相当于对于队列数据结构中的出队操作。

 

2)SSTF算法实现思路:在时间复杂度和空间复杂度上的综合考虑,我首先将vector内的数据进行排序,然后确定当前磁道号在有序数据中的位置,然后在该位置的左右找到离它最近的数,并将当前位置进行刷新。

 

3)SCAN算法实现思路:首先将vector内的数据进行排序,然后同样地确定当前磁道号在有序数据中的位置,然后在向内的方向上依次访问,访问完了之后,再输出初始位置向外的服务序列。

 

4)CSCAN算法实现思路:开始和前面的算法一样,也是先进行排序,定位,然后在向内的方向上依次访问,访问完了之后,再从最外层向内扫。

 

5)FSCAN算法实现思路:将初始的序列放在一个队列中,将在扫描过程中新出现的服务序列放在另一个序列中,然后对两个队列中的数据依次进行SCAN算法的实现。

四、主要的数据结构

#include <iostream>

#include <time.h>

#include <vector>

#include <math.h>

#include <stdlib.h>

#include <algorithm>

#include <cstring>

#include <windows.h>

#include <fstream>

using namespace std;

void request(vector<int>&m_vec,ofstream &outfile)

//添加随机数种子

void compute_dis(vector<int>m_vec,int &dis,double &average_distance) //计算平均距离函数

void FCFS(vector<int>m_vec,int position)

void SSTF(vector<int>m_vec,int position)

void SCAN(vector<int>m_vec,int position)

void CSCAN(vector<int>m_vec,int position)

void FSCAN(vector<int>m_vec,int position)

void print()

int choose_algorithm(vector<int>m_vec)

//选择调度算法

int main()

//主函数

 

 

 

五、算法流程图

技术图片

 

 

 

 

 

 

 

六、运行与测试

(1)FCFS算法

技术图片

(2)SSTF算法

技术图片

(3)SCAN算法

技术图片

(4)CSCAN算法

技术图片

(5)FSCAN算法

技术图片

七、总结(各算法优缺点比较汇总)
 

优点

缺点

适用

先来先服务

公平、简单

平均寻道距离大效率不高磁壁粘着

仅应用在磁盘I/O较少的场合

最短寻道时间优先

性能比"先来先服务"好能保证平均寻道时间最短

可能出现"饥饿"现象, 磁壁粘着

 

扫描算法

寻道性能较好,可避免"饥饿"现象;既考虑了距离,同时又考虑了方向。

不利于远离磁头一端的访问请求, 磁壁粘着

 

循环扫描算法

消除了对两端磁道请求的不公平

  

分步电梯调度算法

有效防止磁壁粘着现象。

  

磁盘调度算法

标签:tor   性方面   有一个   ++   选择   分析   用户   流程图   enter   

原文地址:https://www.cnblogs.com/CCTVCHCH/p/14923993.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!