设计一个以电梯调度思想为主并考虑旋转优化的程序,对磁盘进行移臂和旋转调度,对磁盘进行移臂和旋转调度。
        假定某个磁盘组共有 200 个柱面,由外向里顺序编号(0—199),每个柱面上有 20 个磁道,编号为 0—19,每个磁道分成 8 个物理记录,编号 0—7。进程访问磁盘的物理 地址可以用键盘输入的方法模拟得到。
        图 4-1 中的初始化工作包括,初始化“请求 I/O”表,置当前移臂方向为里移; 置当前位置为 0 号柱面,0 号物理记录。程序运行前可假定“请求 I/O”表中已经有如干个进程等待访问磁盘。
        在模拟实验中,当选中一个进程可以访问磁盘时,并不实际地启动磁盘,而用显示:“请求 I/O表;当前移臂方向;当前柱面号,物理记录号来代替图 4-3 中的“启动磁盘” 这项工作

/*模拟电梯调度算法,实现对磁盘的驱动调度。*/#include<iostream>
#include<string>
#include<iomanip>
#include<cmath>using namespace std;typedef struct request {//请求I/O表string name;//进程名int cylinder;//柱面号int magnetic;//磁道号int record;//物理记录号
}Request;int tableNum = 0;
Request Table[100];
Request current;void InitCurrent() {//初始化初始进程current.name = "初始进程";current.cylinder = 0;current.magnetic = 0;current.record = 0;//假定表中已经存在的请求Table[0].name = "请求A";Table[0].cylinder = 1;Table[0].magnetic = 5;Table[0].record = 0;Table[1].name = "请求B";Table[1].cylinder = 10;Table[1].magnetic = 4;Table[1].record = 2;Table[2].name = "请求C";Table[2].cylinder = 66;Table[2].magnetic = 3;Table[2].record = 6;Table[3].name = "请求D";Table[3].cylinder = 30;Table[3].magnetic = 4;Table[3].record = 5; Table[4].name = "请求E";Table[4].cylinder = 3;Table[4].magnetic = 1;Table[4].record = 3;Table[5].name = "请求F";Table[5].cylinder = 77;Table[5].magnetic = 0;Table[5].record = 1;
}void CountTable() {int i;for (i = 0; Table[i].cylinder != NULL; i++) {}tableNum = i;
}int FindNearest() {int min = 8, k;//最小距离,最小距离的编号int distance = 8;//当前距离for (int i = 0; i < tableNum; i++) {if (Table[i].cylinder == current.cylinder) {distance = abs(Table[i].record - current.record);if (distance < min) {min = distance;k = i;}}}return k;
}void print_io() {//打印请求I/O表cout << "--------------------------请求I/O表---------------------------" << endl;cout << "进程名:         柱面号:         磁道号:         物理记录号:" << endl;for (int i = 0; i < tableNum; i++) {cout << setfill(' ') << setw(6) << Table[i].name << setfill(' ') << setw(15) << Table[i].cylinder << setfill(' ') << setw(16) << Table[i].magnetic << setfill(' ') << setw(17) << Table[i].record << endl;}cout << "--------------------------------------------------------------" << endl;
}void PrintProcess(bool direction) {string directionStr;if (direction == 1) {directionStr = "up";}else {directionStr = "down";}cout << "------------------------选中的进程信息------------------------" << endl;cout << "进程名:         柱面号:         物理记录号:         方向:" << endl;cout << setfill(' ') << setw(6) << current.name << setfill(' ') << setw(15) <<current.cylinder << setfill(' ') << setw(16) << current.record << setfill(' ') << setw(17) << directionStr << endl;cout << "--------------------------------------------------------------" << endl;
}int CylinderJudge() {//遍历请求表判断是否有与当前柱面号相同的访问者for (int i = 0; i < tableNum; i++) {if (Table[i].cylinder == current.cylinder){return i;}}return -1;
}int CylinderMax() {int differenceC=200;//柱面号之差int t = 8;//最小物理记录int k;//选择出的最小柱面号int a;//选择出的最佳请求号for (int i = 0; i < tableNum; i++) {if (abs(Table[i].cylinder - current.cylinder) < differenceC && Table[i].cylinder > current.cylinder) {differenceC = Table[i].cylinder - current.cylinder;}k = current.cylinder + differenceC;}for (int i = 0; i < tableNum; i++) {if (Table[i].cylinder == k && Table[i].record < t) {t = Table[i].record;a = i;}}if (differenceC == 200) {//没有比当前柱面号大的访问请求return -1;}else {return a;}
}int CylinderMin() {int differenceC = 200;//柱面号之差int t = 8;//最小物理记录int k;//选择出的最大柱面号int a;//选择出的最佳请求号for (int i = 0; i < tableNum; i++) {if (abs(Table[i].cylinder - current.cylinder) < differenceC && Table[i].cylinder < current.cylinder) {differenceC = abs(Table[i].cylinder - current.cylinder);}k = current.cylinder - differenceC;}for (int i = 0; i < tableNum; i++) {if (Table[i].cylinder == k && Table[i].record < t) {t = Table[i].record;a = i;}}if (differenceC == 200) {//没有比当前柱面号小的访问请求return -1;}else {return a;}
}void PopProcess(int process) {for (int i = process; i < tableNum; i++) {Table[i] = Table[i + 1];}tableNum--;
}int Scan(){int process;//选择的进程号bool direction =1; //方向0=out,1=in,默认移臂方向为向里移print_io();if (tableNum == 0) {//无等待访问者cout << "无等待访问者!!!" << endl;return 0;}else//有等待访问者{if (CylinderJudge() != -1) {//有与当前柱面号相同的访问者process = FindNearest();}else//没有与当前柱面号相同的访问者{if (direction == 1) {//移臂方向为向里process = CylinderMax();if (process == -1) {//没有比当前柱面号大的访问请求process = CylinderMin();direction = 0;}}else {//移臂方向为向外process = CylinderMin();if (process == -1) {//没有比当前柱面号小的访问请求process = CylinderMax();direction = 1;}}}current = Table[process];PrintProcess(direction);PopProcess(process);}
}void Accept() {int flag = 1;while (flag == 1) {cout << "输入:进程名、柱面号、磁道号、物理记录号" << endl;cin >> Table[tableNum].name >> Table[tableNum].cylinder >> Table[tableNum].magnetic >> Table[tableNum].record;tableNum++;cout << "登记成功!继续登记请求按1否则按0" << endl;cin >> flag;}
}void Init() {float n;int command=1;InitCurrent();//初始化当前位置CountTable();//统计IO请求表中请求数目while (command == 1) {cout << "输入在[0,1]区间内的一个随机数!!!" << endl;cin >> n;if (n > 0.5) {Scan();}else {Accept();}cout << "继续请按1,退出请按0" << endl;cin >> command;}
}int main(){Init();
}

运行结果:

操作系统实验:模拟电梯调度算法,实现对磁盘的驱动调度C++实现相关推荐

  1. 操作系统实验:驱动调度 模拟电梯调度算法 C语言实现

    一:实验内容 模拟电梯调度算法,对磁盘进行移臂和旋转调度. 二.实验题目 (1)."驱动调度"进程和"接收请求"进程能否占有处理器运行,取决于磁盘的结束中断信 ...

  2. 操作系统实验二(调度算法模拟-先进先出-时间片轮转法-优先服务调度算法)

    实验二 进程调度 一.     实验目的 1.       理解进程运行的并发性. 2.       理解处理器的三级调度. 3.       掌握先来先服务的进程调度算法. 4.       掌握短 ...

  3. 操作系统实验——模拟动态分区首次适应分配和回收算法

    实验三 实验题目:模拟动态分区首次适应分配和回收算法 实验目的:通过本实验,可加深理解动态分区分配.回收程序的功能和具体实现,特别是对回收分区的合并的理解. 实验环境:硬件:pc 机.软件:Windo ...

  4. 操作系统实验二——时间片轮转调度算法(RR算法)(新进程放队首和队尾两种C++实现)

    情况介绍 基本原理 系统将所有就绪进程按照FCFS的原则,排成一个队列依次调度. 把CPU分配给队首进程,执行一个时间片(10-100ms). 时间片用完后,系统计时器发出时钟中断,该进程将被剥夺CP ...

  5. 操作系统实验二——进程调度算法(FCFS、RR)

    目录 进程调度算法 FCFS算法代码 RR算法代码 进程调度算法 FCFS算法代码 #include <stdio.h> #include <string.h> #includ ...

  6. 操作系统实验之作业调度算法

    #include <iostream.h>#include <stdio.h> #include <string.h> #include<stdlib.h&g ...

  7. 操作系统----磁盘调度(电梯调度算法)

    一.实验内容 模拟电梯调度算法,实现对磁盘的调度. 二.实验目的 磁盘是一种高速.大量旋转型.可直接存取的存储设备.它作为计算机系统的辅助存储器,负担着繁重的输入输出任务,在多道程序设计系统中,往往同 ...

  8. 算法高级(39)-坐电梯时情不自禁想起的电梯调度算法实现原理

    一.引言 现代社会中,不管你是在北上广.北海道.新加坡,或者是三四五六七八线的小城市,凡是有点规模的地方,高楼大厦都是比比皆是的.而在上下楼的时候,不可避免的会跟电梯打交道.而一般情况你也很少能心平气 ...

  9. 操作系统实验六:作业调度算法模拟

    一.实验目的 (1)掌握周转时间.等待时间.平均周转时间等概念及其计算方法. (2)理解五种常用的进程调度算法(FCFS.SJF.HRRF.HPF.RR),区分算法之间的差异性,并用C语言模拟实现各算 ...

最新文章

  1. java swing单选按钮点击事件_java Swing中点击不同单选按钮JPanel中部分区域进行改变,如何实现?。。急啊!...
  2. 12月9日 php环境的安装和基本知识的学习
  3. 『森林火灾检测』基于PaddleX实现森林火灾检测
  4. 网站正在建设中提示页面设计欣赏
  5. Jmeter 参数化请求实例
  6. eclipse Android 开发基础 Activity 窗体 界面
  7. 把函数包起来就是一个R包 - 完整开发指南
  8. SVG-Android开源库——SVG生成Vector资源文件的编辑预览工具
  9. itx机箱尺寸_讲解 ATX M-ATX ITX 各种主板尺寸
  10. 工字型钢弹性截面模量计算公式_弹性截面模量与塑性截面模量的例析
  11. vue 手写签名_真正的艺术签名!让你的名字充满明星范!
  12. vue3仿网易云界面
  13. 无锡江苏高性能服务器服务商,无锡高防云服务器
  14. pymongo的简单使用
  15. 冬季到吉林来玩雪|史上最全的吉林冬季旅游攻略!
  16. elementUI 表格宽度自适应、不换行
  17. 关于学校edu邮箱登录第三方邮件客户端(例如Outlook、Foxmail、QQ邮箱、邮件App等)的注意事项
  18. 面试必备之深入理解自旋锁
  19. 步步为营二 C语言基本概念 和 数据类型
  20. 语音识别入门第二节:语音信号处理及特征提取

热门文章

  1. POI报表及百万数据导入导出方案
  2. R笔记(简单数据处理)
  3. 组策略里没有计算机组件,Win10家庭版系统没有组策略的解决方法
  4. 给你一个支点你能做些什么呢
  5. 【深度好文】二维图像离散余弦变换
  6. chroot() 函数
  7. jolog扫地机器人怎么样_扫地机器人什么牌子好,扫地机器人十大品牌排名?
  8. 蚂蚁金服ATEC城市峰会上海举行,三大发布引关注
  9. 微信有哪些分销模式可以发展?
  10. 2022年新能源汽车焊接市场前景分析及研究报告