磁盘调度算法的C++实现(FCFS、SSTF、SCAN、CSCAN、NStepSCAN)_nstepscan算法实现-程序员宅基地

技术标签: 算法  C  代码乱  操作系统  SchoolDays  

Description

因为代码结构过于冗余,再加上有小伙伴私信我能不能重写一下,我就重写了,新代码在这里,请移步,谢谢!

本实验是模拟操作系统的磁盘寻道方式,运用磁盘访问顺序的不同来设计磁盘的调度算法。

  1. 实现的磁盘调度算法有FCFSSSTFSCANCSCAN NStepSCAN算法。
  2. 设定开始磁道号寻道范围,依据起始扫描磁道号和最大磁道号数,随机产生要进行寻道的磁道号序列。
  3. 选择磁盘调度算法,显示该算法的磁道访问顺序,计算出移动的磁道总数和平均寻道总数。按算法的寻道效率进行排序,并对各算法的性能进行分析比较

参考代码

#include <iostream>
#include <random>
#include <algorithm>
#define element_num 25

using namespace std;
int order[element_num];


void Array_reverse(int l,int r,int* array)
{
    double mid=(l+r)/2.0;
    for(int i=l;i<mid;++i)
    {
        array[i]=array[r+l-i]+array[i];
        array[r+l-i]=array[i]-array[r+l-i];
        array[i]=array[i]-array[r+l-i];
    }
}

void FCFS(int st,int* d,int group_num=element_num)
{
    cout<<endl<<"---------------FCFS--------------"<<endl;
    double a=0;
    for(auto x:order)
        cout<<x<<" ";
    for(int i=0;i<group_num;++i)
        {a+=abs(st-*(d+i));st=*(d+i);}
    cout<<endl<<a<<" "<<a/group_num<<endl;
}

void SSTF(int st,int* d,int group_num=element_num)
{
    cout<<endl<<"---------------SSTF--------------"<<endl;
    double a=0;
    int b=group_num;
    while(b) {
        sort(d, d + b,
             [st](const int &first, const int &second)
             { return (abs(first - st) > abs(second - st)) ? false : true;});
        order[group_num-b--]=*d;
        a += abs(st - *d);
        st=*d++;
    }
    for(auto x:order)
        cout<<x<<" ";
    cout<<endl<<a<<" "<<a/group_num<<endl;
}

void SCAN_CSCAN(int st,int*d,int group_num=element_num,int cho=1)
{
    double a=0;
    if(cho==1)
        cout<<endl<<"---------------SCAN--------------"<<endl;
    else if(cho==2)
        cout<<endl<<"--------------CSCAN--------------"<<endl;
    int min=group_num-1;
    for(int i=0;i<group_num;++i)
        if(*(d+i)-st>0)
            {min=i;break;}
    Array_reverse(min,group_num-1,d);
    if(cho!=1) Array_reverse(0,min-1,d);
    Array_reverse(0,group_num-1,d);
    std::for_each(d,d+group_num,[](int n){cout<<n<<" ";});
    for(int i=0;i<group_num;++i)
        a+=abs(st-*(d+i)),st=*(d+i);
    if(cho!=3)
        cout<<endl<<a<<" "<<a/group_num<<endl;
    else *order=a;
}
void NstepSCAN(int st,int* d,int group_num=element_num)
{
    cout<<endl<<"--------------N-StepSCAN--------------"<<endl;
    cout<<"请输入队列的长度N:"<<endl;
    double A=0;
    int N,a,b;
    cin>>N;
    (group_num%N==0)?a=N,b=N:a=N,b=group_num%N;
//    cout<<a<<" "<<b<<""<<endl;
    cout<<a<<" "<<b<<endl;
    for(int i=0;i!=ceil(group_num/(double)N);++i)
        if(i==ceil(group_num/N))
            SCAN_CSCAN(st,d+a*i,b,3),A+=*order,cout<<"此时移动长度为:"<<A<<endl;
        else
            SCAN_CSCAN(st,d+a*i,a,3),A+=*order,cout<<"此时移动长度为:"<<A<<endl;
    cout<<endl<<A<<" "<<A/group_num<<endl;
}
int main()
{
    int max,start,disk[element_num],temp[element_num];
    cout<<"请输入最大磁道号数&&起始磁道号:"<<endl;
    cin>>max>>start;
    uniform_int_distribution<unsigned> u(0,max);
    default_random_engine e(10);//默认随机数种子
    for(int i=0;i<element_num;++i)
        disk[i]=u(e),order[i]=disk[i],temp[i]=disk[i],cout<<disk[i]<<" ";
    FCFS(start,disk);
    SSTF(start,disk);
    SCAN_CSCAN(start,disk,element_num,1);//默认往外层,0最里层
    SCAN_CSCAN(start,disk,element_num,2);
    NstepSCAN(start,temp);
    return 0;
}

优化和改进

代码确实非常乱,不该重载的瞎重载,主要是用来强制走出自己的comfort zone,尝试多用几种套路来coding。当然是有炫技的成分在里面,看看就好,大神就别喷代码了。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_38657141/article/details/84330829

智能推荐

C++程序打包_c++打包-程序员宅基地

文章浏览阅读1.9k次。首先我用的vs2017对现有的项目进行打包处理,当然首先的有打包的工具就是下图的这个vs小工具,找不到的话可以在工具中打开扩展与更新,在里面查找相应的工具名之后就是在项目上新建一个setup项目,前提是你已经安装了上面的那个小工具,之后就是对项目进行添加要输出的项目,设为主输出,然后再第二个文件上进行存放该项目的快捷方式,这个是在桌面的上的,而第三个文件夹是在开始菜单栏里添加的在其中加入所需要的依赖以及项目再进行生成就会出现项目的安装的exe文件在你生成的项目下..._c++打包

输入打开文件-程序员宅基地

文章浏览阅读86次。import fnmatch, osimport reyy = input('')def edd(user_name): def allFiles(root, patterns = '*', single_level = False, yield_folders = False): patterns = patterns.split(';') ..._输打开

Eplan教学视频合集-百度网盘-收集于网络_eplan教程 百度网盘-程序员宅基地

文章浏览阅读9.4k次,点赞5次,收藏18次。Eplan教学视频合集-百度网盘-收集于网络https://yun.baidu.com/s/1djYbk#list/path=%2Fhttps://pan.baidu.com/s/14DHLr31mLq2N8qbxd7vcbw //code:cva8https://yun.baidu.com/s/1qYfdJLM#list/path=%2Fhttps://yun.baidu.co..._eplan教程 百度网盘

keep-alive vue不起作用的原因_vue3+vite的keep-alive浏览器返回不生效-程序员宅基地

文章浏览阅读2w次。keep-alive 从列表页进入到详情页,再回到列表页,然后页面又重新请求,而不是直接读缓存里面的(ps:之前keep-alive用在项目中是可以起作用的,但是不知道为什么这两天就出现了这样的问题。就连activated,deactivated这两个钩子函数也是没有触发到) 具体代码如下 我尝试在项目中新建一个很简单的页面,也是没有效果。一开始以为是vue的版本过低导致的,看了一下v..._vue3+vite的keep-alive浏览器返回不生效

十进制小数部分如何转化成二进制算法实现_小数进制转换编程-程序员宅基地

文章浏览阅读483次。十进制小数转化成二进制,就是不断地乘二,判断之后的这个数是否比1大,比1大则输出输出1,留下小数部分继续前面的操作。将3.75的小数部分转化为二进制。最后的输出结果是.11。_小数进制转换编程

免费OFD文件在线转PDF_在线生成一个 ofd文件-程序员宅基地

文章浏览阅读739次。ofd文件打不开?ofd怎么转换为pdf?本文将给告诉大家ofd是什么文件格式?ofd怎么打开?ofd怎么免费转换为配pdf文件等,以下是具体的方法:一,什么是OFD文件?OFD是我国电子公文交换和存储格式标准。OFD格式是我国自主可控的电子文件版式文档格式。OFD版式文件,版面固定、不跑版、所见即所得,可以视为计算机时代的“数字纸张”;是电子文档发布、数字化信息传播和存档的理想文档格式。OFD格式是当下对于全国产环境具有明显的优势。因此,在自主可控档案系统中,OFD格式无疑是自主可控档案系.._在线生成一个 ofd文件

随便推点

删除安装Google Chrome浏览器时捆绑安装的Google 文档、表格、幻灯片、Gmail、Google 云端硬盘、YouTube网址链接(Mac)_chrome自带的表格怎么删-程序员宅基地

文章浏览阅读5.2k次,点赞3次,收藏2次。Mac mini操作系统,安装完 Google Chrome 浏览器以后,单击 启动台 桌面左下角的“显示应用程序”,我们发现捆绑安装了。进入目录 /Users/用户名/Applications/Chrome 应用。那如何删除这些网址连接呢?,一个个单击打开,发现都是网址链接。已删除,干干净净,启动台回来了。进入或者删除整个文件夹。_chrome自带的表格怎么删

基于Java+SpringBoot+vue+elementui图书商城系统设计实现_图书商城后台管理系统设计与实现-程序员宅基地

文章浏览阅读3.9w次,点赞153次,收藏430次。主要功能包括管理员:首页、个人中心、图书分类管理、回收类别管理、新书榜管理、特价区管理、旧书回收管理、用户管理、订单评价管理、回收预约管理、图书回收管理、管理员管理、系统管理、订单管理。前台使用:首页、新书榜、特价区、旧书回收、公告资讯、个人中心、后台管理、购物车、客服。用户:首页、个人中心、订单评价管理、回收预约管理、图书回收管理、我的收藏管理、订单管理等功能。_图书商城后台管理系统设计与实现

【JZ2440笔记】裸机实验使用SDRAM_京累里101123-程序员宅基地

文章浏览阅读393次。S3C2440A 存储器控制器为访问外部存储的需要器提供了存储器控制信号。S3C2440A 包含以下特性:–大/小端(通过软件选择)–地址空间:每个 Bank 有 128M 字节(总共 1G/8 个 Bank)–大/小端(通过软件选择)–除了 BANK0(16/32 位)之外,其它全部 BANK 都可编程访问宽度(8/16/32 位)–总共 8 个存储器 Bank6 个存储器 Bank 为 ROM,SRAM 等其余 2 个存储器 Bank 为 ROM,SRAM,SDRAM 等–7 个固定的_京累里101123

工具系列:TensorFlow决策森林_(3)使用dtreeviz可视化-程序员宅基地

文章浏览阅读1.2k次,点赞19次,收藏19次。之前的教程演示了如何使用TensorFlow的决策森林(随机森林、梯度提升树和CART)分类器和回归器来准备数据、训练和评估。(我们将TensorFlow决策森林缩写为TF-DF。)您还学会了如何使用内置的函数可视化树,并显示特征重要性度量。本教程的目标是通过可视化更深入地解释分类器和回归器决策树。我们将查看详细的树结构图示,以及决策树如何划分特征空间以做出决策的描绘。树结构图帮助我们理解模型的行为,特征空间图帮助我们通过展示特征和目标变量之间的关系来理解数据。我们将使用的可视化库称为dtreeviz。_dtreeviz

MySQL8.0学习记录10 - 字符集与校对规则_mysql8.0存储系统元数据的字符集是-程序员宅基地

文章浏览阅读2.1k次。MySQL8.0字符集_mysql8.0存储系统元数据的字符集是

漫威所有电影的 按时间线的观影顺序-程序员宅基地

文章浏览阅读3.1k次。美国队长1 - 2011年惊奇队长 - 2019年钢铁侠1 - 2008年无敌浩克 - 2008年钢铁侠2 - 2010年雷神 - 2011年复仇者联盟 - 2012年雷神2 - 2013年钢铁侠3 - 2013年美国队长2 - 2014年复仇者联盟2 - 2015年银河护卫队 - 2017年蚁人 - 2015年美国队长3 - 2016年奇异博士 - 2016年银河护卫队2 - 2017..._漫威电影观看顺序时间线

推荐文章

热门文章

相关标签