操作系统实验——移动头磁盘调度算法模拟实现与比较

1、实验目的

​ 理解并掌握主要的移动头磁盘调度算法的基本设计思想和编程实现要旨。

2、实验内容

​ 利用标准 C 语言,编程设计与实现关于移动头磁盘调度的先来先服务调度算法(FCFS)、最短寻道时间优先调度算法(SSTF)、电梯调度算法(SCAN)、循环式单向电梯调度算法(CSCAN)、双队列电梯调度算法(FSCAN),并随机发生一组磁盘访问事件(磁道号)序列,开展有关算法的测试及性能比较。

3、开发环境

​ Vs 2021+Windows操作系统

4、算法流程和实现方法

FCFS(先来先服务)

  • 关键数据结构
    • 仅需要请求队列即可,按照请求顺序进行处理。
  • 算法流程
    • 请求按照到达的顺序依次处理。
    • 磁头从当前位置移动到下一个请求所在的磁道。
    • 移动完成后,继续处理下一个请求,直至队列中的所有请求被满足。

SSTF(最短寻道时间优先)

  • 关键数据结构
    • 请求队列,当前磁头位置。
  • 算法流程
    • 每次选择离当前磁头位置最近的请求来处理。
    • 算法优先处理离当前磁头最近的磁道,最大限度地减少寻道时间。
    • 该算法可能导致某些请求长期等待,产生"饥饿"问题。

SCAN(扫描算法)

  • 关键数据结构
    • 请求队列,当前磁头位置。
  • 算法流程
    • 磁头按照一个方向(通常是向某一方向移动)扫描所有请求。
    • 当达到最边缘时,方向改变并继续扫描,而不返回到最初的位置。
    • 这个算法可能导致某些磁道长期无法被访问到(产生"电梯"效应)。

CSCAN(循环扫描算法)

  • 关键数据结构
    • 请求队列,当前磁头位置。
  • 算法流程
    • 类似于SCAN,但是在到达最边缘后,直接回到另一端而不是返回最初的位置。
    • 这样做有助于减少某些磁道长期无法访问的情况,减少"电梯"效应。

FSCAN(双重扫描算法

  • 关键数据结构
    • 两个请求队列,分别为当前进行的队列和等待的队列。
  • 算法流程
    • 将所有请求分为两个队列,在处理当前队列的同时,后续请求进入等待队列。
    • 当前队列处理完毕后,切换到等待队列处理请求。
    • 这种方法减少了某些请求长时间等待的情况,减轻了"饥饿"和"电梯"效应。

5、技术难点及解决方案

算法效率与性能

  • 难点:算法的效率和性能是关键指标,但不同算法在不同场景下的表现可能不同。

  • 解决方案:进行实际测试和性能评估,比较不同算法在不同数据集和工作负载下的表现。根据实验结果优化算法选择,或者结合多种算法实现智能调度机制。

    算法的正确性

  • 难点:确保算法的正确性和稳定性,避免出现错误和异常情况。

  • 解决方案:进行严格的测试和验证,针对各种边界条件和极端情况对算法进行全面测试,确保算法在各种情况下都能正确运行并且表现稳定。

6、运行截图

在这里插入图片描述

性能比较:

FCFS

  • 优点:简单易实现。
  • 缺点:可能会导致平均寻道时间较长,因为它忽略了寻找最优路径的可能性。

SSTF

  • 优点:最小化了磁头移动距离,平均寻道时间较短。
  • 缺点:可能产生"饥饿"问题,某些请求长时间等待。

SCAN

  • 优点:减少了某些磁道长期无法访问的情况。
  • 缺点:可能导致某些请求长时间等待,产生"电梯"效应。

CSCAN

  • 优点:减少了某些磁道长期无法访问的情况。
  • 缺点:与SCAN类似,可能产生长时间等待的情况。

FSCAN

  • 优点:减轻了"饥饿"和"电梯"效应,提高了公平性。
  • 缺点:实现相对复杂。

7、源代码:

#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
#include <cstdlib>
#include <time.h>
#include <vector>
#include <algorithm>
#include <utility>
using namespace std;
const int maxRightValue = 199;//磁头移动的最右边界值
const int minLeftValue = 0;//磁头移动的最左边界值
vector<int> FSCAN_SHOW;//存放FSCAN_SHOW算法的访问顺序void getRandomNumber(vector<int>& randValue, int& pos)
{for (int i = 0; i < 100; i++)randValue.push_back(rand() % 200);pos = rand() % 200;
}
//输入 请求访问序列和磁头所在位置
//输出 移动磁道数
void Show(const string& str, const vector<int>& t)
{cout << str << "的访问序列为:";for (int i = 0; i < t.size(); i++){if (i != t.size() - 1)cout << t[i] << "->";elsecout << t[i] << endl;}
}int FCFS(const vector<int>& t, int pos)
{int sum = 0;Show("FCFS", t);for (int i = 0; i < t.size(); i++){sum += abs(pos - t[i]);pos = t[i];}return sum;
}
int findClose(const vector<int>& t, int pos)
{int minDistance = INT_MAX;int index = -1;for (int i = 0; i < t.size(); i++){if (t[i] == -1)continue;int distance = abs(pos - t[i]);if (minDistance > distance){minDistance = distance;index = i;}}return index;
}
int SSTF(vector<int> t, int pos)
{vector<int> show;int sum = 0;for (int i = 0; i < t.size(); i++){int index = findClose(t, pos);if (index == -1){break;}else{show.push_back(t[index]);sum += abs(pos - t[index]);pos = t[index];t[index] = -1;}}Show("SSTF", show);return sum;
}
int FindLarger(vector<int>& t, int pos)
{int index = -1;for (int i = 0; i < t.size(); i++){if (pos <= t[i]){index = i;break;}}return index;
}
//假设磁盘指针总是向右移动
pair<int, int> SCAN(vector<int> t, int pos, int flag = 1)
{int sum = 0;vector<int> left, right;vector<int> show;for (auto e : t){if (e < pos){left.push_back(e);}else{right.push_back(e);}}sort(left.begin(), left.end());sort(right.begin(), right.end());for (auto e : right){show.push_back(e);}sum += maxRightValue - pos;if (!left.empty()){sum += maxRightValue - left[0];reverse(left.begin(), left.end());for (auto e : left){show.push_back(e);}}if (flag){Show("SCAN", show);}else{for (auto e : show){FSCAN_SHOW.push_back(e);}}pair<int, int> res;res.first = sum;res.second = pos;return res;
}
int CSCAN(vector<int> t, int pos)
{int sum = 0;vector<int> left, right;vector<int> show;for (auto e : t){if (e < pos){left.push_back(e);}else{right.push_back(e);}}sort(left.begin(), left.end());sort(right.begin(), right.end());for (auto e : right){show.push_back(e);}sum += maxRightValue - pos + 200;if (!left.empty()){for (auto e : left){show.push_back(e);}sum += left.back();}Show("CSCAN", show);return sum;
}
//将前50个请求划分为当前正在进行的队列,后50个请求划分为扫描期间请求磁盘调度的进程int FSCAN(vector<int> t, int pos)
{int sum = 0;vector<int> t1(t.begin(), t.begin() + 50);vector<int> t2(t.begin() + 50, t.begin() + 100);const pair<int, int>& temp = SCAN(t1, pos, 0);sum += temp.first;sum += SCAN(t2, temp.second, 0).first;Show("FSCAN", FSCAN_SHOW);return sum;
}
int main()
{int pos = 0;vector<int> randValue;srand((unsigned)time(NULL));getRandomNumber(randValue, pos);cout << "FCFS的平均寻道数为:" << FCFS(randValue, pos) / 100 << endl;cout << endl;cout << "SSTF的平均寻道数为:" << SSTF(randValue, pos) / 100 << endl;cout << endl;cout << "SCAN的平均寻道数为:" << SCAN(randValue, pos).first / 100 << endl;cout << endl;cout << "CSCAN的平均寻道数为:" << CSCAN(randValue, pos) / 100 << endl;cout << endl;cout << "FSCAN的平均寻道数为:" << FSCAN(randValue, pos) / 100 << endl;cout << endl;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/285505.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于物联网表计的综合能源管理方案——安科瑞 顾烊宇

为加快推进国家“双碳”战略和新型能源体系建设&#xff0c;努力实现负荷准确控制和用户精细化管理&#xff0c;按照“政府主导、电网组织、政企协同、用户实施”的指导原则&#xff0c;多地成立市/县级电力负荷管理中心&#xff0c;包括浙江宁波、慈溪、辽宁大连、湖南株洲、娄…

CompleteFuture与Future的比较

CompleteFuture的介绍CompleteFuture的特点CompleteFuture的应用场景CompletableFuture的优缺点Future的介绍Future的特点Future的应用场景Future的优缺点CompletableFuture和Future的区别CompletableFuture和Future的关联关系CompletableFuture和Future的使用示例CompletableF…

【Docker】Docker安装部署maven私服

文章目录 镜像拉取构建nexus实例登录maven私服如何查看实例初始化的admin密码呢&#xff1f;1.查看容器挂载卷2.找到nexus_nexus_data查看挂载卷详情3.查看admin账号密码4.登录并重置密码 使用nexus私服1.设置settings.xml2.设置idea pom 出现的问题小插曲 镜像拉取 docker pu…

【已解决】ModuleNotFoundError: No module named ‘taming‘

问题描述 Traceback (most recent call last) <ipython-input-14-2683ccd40dcb> in <module> 16 from omegaconf import OmegaConf 17 from PIL import Image ---> 18 from taming.models import cond_transformer, vqgan 19 import taming.modu…

基于Web的流浪狗收容领养管理平台的设计与实现论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本浪狗收容领养管理平台就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据…

思幻二次元风格的工作室个人引导页源码

思幻工作室个人引导页源码已经完成开发&#xff01;该源码支持三端自适应&#xff0c;并且具备赞助功能。我们选择了当前点赞量最高的配色方案&#xff0c;打造了一个独特的二次元风格引导页。经过在美国服务器上进行的测试&#xff0c;效果令人满意&#xff0c;网页加载速度达…

卷积神经网络的学习与实现

基于matlab的卷积神经网络(CNN)讲解及代码_matlab中如何查看cnn损失函数-CSDN博客 可以看到与BP神经网络相比&#xff0c;卷积神经网络更加的复杂&#xff0c;这里将会以cnn作为学习案例。 1.经典反向传播算法公式详细推导 这里引用经典反向传播算法公式详细推导_反向目标公…

Android Studio(3.6.2版本)安装 java2smali 插件,java2smali 插件的使用方法简述

一、Android Studio&#xff08;3.6.2版本&#xff09;安装 java2smali 插件 1、左上角File—>Setting&#xff0c;如下图 2、Setting界面中&#xff1a;点击Plugins—>选择右侧上方Marketplace—>搜索栏输入java2smali&#xff0c;如下图 3、点击Install按钮—>点…

Webpack安装及使用

win系统 全局安装Webpack及使用 前提&#xff1a;使用Webpack必须安装node环境&#xff0c;建议使用nvm管理node版本。 1&#xff1a;查看自己电脑是否安装了node 2&#xff1a;npm install webpack版本号 -g 3&#xff1a;npm install webpack-cli -g -g:表示全局安装 4&…

【机器学习】卷积神经网络(CNN)的特征数计算

文章目录 基本步骤示例图解过程 基本步骤 在卷积神经网络&#xff08;CNN&#xff09;中&#xff0c;计算最后的特征数通常涉及到以下步骤&#xff1a; 确定输入尺寸&#xff1a; 首先&#xff0c;你需要知道输入数据的尺寸。对于图像数据&#xff0c;这通常是 (batch_size, c…

118. 杨辉三角

描述 : 给定一个非负整数 numRows&#xff0c;生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 题目 : LeetCode 118. 杨辉三角 : 118. 杨辉三角 分析 : 这道题用二维数组来做 . 解析 : class Solution {public Li…

力扣日记12.18-【二叉树篇】合并二叉树

力扣日记&#xff1a;【二叉树篇】合并二叉树 日期&#xff1a;2023.12.18 参考&#xff1a;代码随想录、力扣 617. 合并二叉树 题目描述 难度&#xff1a;简单 给你两棵二叉树&#xff1a; root1 和 root2 。 想象一下&#xff0c;当你将其中一棵覆盖到另一棵之上时&#xf…