操作系统实验三-驱动调度(二)

简介: 操作系统实验三-驱动调度

2.完整程序

#include<iostream>
#include<vector>
#include<queue>
#include<iomanip>
#include<cstdlib>
#include<cmath>
using namespace std;
vector<int> sameCylinderpos;//当前柱面号相同访问者
struct process {
  int id;//进程号
  int cylinder;//柱面号
  int track;//盘面号
  int sector;//扇区号
  process(int _id = 0, int _cylinder = 0, int _track = 0, int _sector = 0) {
    id = _id;
    cylinder = _cylinder;
    track = _track;
    sector = _sector;
  }
  void print() {//输出
    cout << "Process id:" <<setw(5)<< id;
    cout << " Cylinder id:" << setw(5)<<cylinder ;
    cout << " Track id:" << setw(5)<<track;
    cout << " Sector id:" << setw(5)<<sector;
    cout << endl;
  }
};
bool direction;//0 up,1out 
int curCylinder;//当前柱面号
int curSector;//当前扇区号
vector<process> iorequests;//请求I/O表
void init() {//初始化
  direction = 0;
  curCylinder = 0;
  curSector = 0;
}
void driveScheduling() {//驱动调度
  if (iorequests.empty()) {//当前有无等待访问者
    cout << "\nNo requests!\n";
    return;
  }
  else {
    cout << "\n*****************************************\n";
    for (int i = 0; i < iorequests.size(); i++)
      iorequests[i].print();
    cout << "\n*****************************************\n";
    bool sameCylinder = 0;//有无与当前柱面号相同访问者
    bool greaterCylinder = 0;//有无大于当前柱面号访问者
    bool lesserCylinder = 0;//有无小于当前柱面号访问者
    sameCylinderpos.clear();
    int mingtCylinderpos=-1;//大于当前柱面号的最小者
    int maxltCylinderpos=-1;//小于当前柱面号的最大者
    int iorequestPos=0;//位置
    for (int i = 0; i < iorequests.size(); i++) {//判断有无与当前柱面号相同访问者,比当前大的请求、比当前小的请求
      if (iorequests[i].cylinder == curCylinder) {
        sameCylinder = 1;
        sameCylinderpos.push_back(i);//与当前柱面号相同的访问者,放入可变长数组中暂存
      }
      if (iorequests[i].cylinder > curCylinder) {//从大于当前柱面号请求中选一个最小者
        greaterCylinder = 1;
        if (mingtCylinderpos == -1)
          mingtCylinderpos = i;
        if (iorequests[i].cylinder < iorequests[mingtCylinderpos].cylinder) 
          mingtCylinderpos = i;
      }
      if (iorequests[i].cylinder < curCylinder) {//从小于当前柱面号请求中选一个最大者
        lesserCylinder = 1;
        if (maxltCylinderpos == -1)
          maxltCylinderpos = i;
        if (iorequests[i].cylinder > iorequests[maxltCylinderpos].cylinder)
          maxltCylinderpos = i;
      }
    }
    if (sameCylinder == 1) {//选使得旋转距离最短的访问者
      int rotateDist = 20;
      iorequestPos = sameCylinderpos[0];
      for (int i=0;i<sameCylinderpos.size();i++) {
        int pos = sameCylinderpos[i];
        int& x = iorequests[pos].sector;
        int& y = curSector;
        int dist = ((x+8-y)%8);
        if (dist < rotateDist) {//选择能使旋转距离最短的访问者
          rotateDist = dist;
          iorequestPos = pos;
        }
      }
    }
    else {
      if (direction == 0) {
        if (greaterCylinder)
          iorequestPos = mingtCylinderpos;
        else {
          direction = 1;//置移臂方向
          iorequestPos = maxltCylinderpos;
        }
      }
      else {
        if (lesserCylinder)
          iorequestPos = maxltCylinderpos;
        else {
          direction = 0;//置移臂方向为往里
          iorequestPos = mingtCylinderpos;
        }
      }
    }
    curCylinder = iorequests[iorequestPos].cylinder;
    curSector = iorequests[iorequestPos].sector;
    cout << "\n*****************************************\n";
    iorequests[iorequestPos].print();
    cout << "Current Cylinder:" << curCylinder << endl;
    cout << "Current Sector:" << curSector << endl;
    cout << "Current direction:";
    if (direction == 0)
      cout << "up!" << endl;
    else
      cout << "down!" << endl;
    cout << "\n*****************************************\n";
    iorequests.erase(iorequests.begin() + iorequestPos);
  }
}
void acceptRequest() {
  cout << "\nAccepting requests!";
  cout << "\ninput request num:";
  int n;
  cin >> n;
  if (n == 0) {//不发送请求
    cout << "No requests!";
    return;
  }
  else while(n--) {
    cout << "input process id,cylinder,track,sector";
    int id, cylinder, track, sector;
    cin >> id >> cylinder >> track >> sector;
    process newp(id, cylinder, track, sector);
    iorequests.push_back(newp);
  }
}
void cpuwork() {
  srand(time(NULL));
  while (1) {
    cout << "1. Drive scheduling 2.Accept Requests";
    double opnum= rand() / double(RAND_MAX);
    if (opnum > 0.5) 
      driveScheduling();
    else
      acceptRequest();
    cout << "Continue?Y/N";
    char op;
    cin >> op;
    if (op == 'Y');
    else
      break;
  }
}
int main() {
  init();
  cpuwork();
}

(4)运行结果

 打印驱动调度进程每次选择访问请求前的请求“I/O”表以及每次选中的进程名、访问的柱面号、物理记录号和当前移臂方向。打印的格式为:

 首先,手动提交并输入5个进程号。

 利用磁盘调度算法,在每次处理调度时,都打印了“请求I/O”表,并正确地运行了大于当前柱面号访问请求的最小者2号进程。当前移臂方向为向里移动。

 在运行完一个进程后,提交一个新的I/O请求,柱面号比当前柱面号小。该请求会正确地在下一次磁盘调度时不会被运行到。

 第二次磁盘调度时,选择了大于柱面号5的最小者。这个进程柱面号为10。

 第三次磁盘调度前,再提交一个柱面号为10的新请求。

 第三次磁盘调度时,因为有多个请求都在柱面号10,所以选择了旋转距离最短的访问者。从扇区号4移动到了扇区号5。

 第四次磁盘调度时,同理,因为有多个请求都在柱面号10,所以选择了旋转距离最短的访问者。从扇区号5移动到了扇区号7。

 第五次磁盘调度时,同理,因为还有请求都在柱面号10,所以选择了旋转距离最短的访问者。从扇区号7移动到了扇区号1。此时,磁盘已经转完了一圈。

 第六次磁盘调度时,当前移臂方向为向里,选择了大于当前柱面号的最小者,20号柱面。

 最后一次磁盘调度时,原移臂方向为向里,但没有大于当前柱面号的访问者,只能将当前移臂方向置为向外移动,并选择了小于20号柱面的访问请求中的最大者。最大者的柱面号为1,运行该进程。

 通过这几组数据,测试完成了有当前柱面号相同的访问者,移臂向里移时有无比当前柱面号大的访问请求的情况。移臂向外时磁盘调度也与移臂向里的情况是相反的。体现了本程序的正确性。

六、实验感悟

目录
相关文章
|
1天前
|
弹性计算 运维 自然语言处理
阿里云操作系统智能助手OS Copilot实验测评报告
OS Copilot是针对Linux的智能助手,助力学习、运维及编程。用户界面直观,自然语言交互方便新手。官方文档详尽,但初次配置略复杂,适合学生和开发者。在提高代码编写和调试效率、系统学习上得分高,功能亮点包括代码生成、问答和命令执行。用户期待更多操作系统支持、自动错误分析和系统排查功能。
87 3
|
2天前
|
机器学习/深度学习 算法 物联网
深入剖析操作系统调度算法
【7月更文挑战第13天】本文旨在探讨和比较不同的操作系统调度算法,并分析其对系统性能的影响。文章首先概述了调度算法的基本概念及其重要性,随后详细阐述了常见的调度算法类型,包括先来先服务、短作业优先、优先级调度、时间片轮转以及多级反馈队列等。通过对比不同算法的优缺点,文章进一步探讨了现代操作系统中调度算法的应用与挑战,以及如何根据实际需求选择合适的调度策略。最后,文章展望了操作系统调度算法的未来发展方向,特别是在云计算和物联网时代下的适应性与创新。
8 1
|
5天前
|
弹性计算 人工智能 运维
阿里云操作系统智能助手OS Copilot实验测评报告
阿里云操作系统智能助手OS Copilot实验测评报告
63 2
|
3天前
|
弹性计算 运维
阿里云操作系统智能助手OS Copilot的实验测评报告
OS Copilot 产品体验摘要 用户角色与场景:一位计算机学生使用辅助学习和解决问题,特别是通过代码解释功能加深理解。 易用性与文档:初者可能会觉得有些细节不明确。 帮助程度:用户给予极高评价,对学习帮助大,评分10分,快速定位和解决代码问题,提升学习效率。 推荐与参与:用户愿意推荐给他人。 功能体验:用户尝试了所有功能,对知识问答、辅助编程和命令执行特别感兴趣,尤其是命令执行帮助大。 对比其他产品:OS Copilot优点是便捷、准确。 期望功能:用户希望增加自动报错分析和系统错误排查。 联动体验:用户期待,以实现更全面的工具集。 总结:整体体验积极,用户看好其潜力,期待改进和未来联动。
|
4天前
|
弹性计算 运维 Python
阿里云操作系统智能助手OS Copilot实验测评报告
**OS Copilot 产品测评摘要** - 学生使用,用于学习和编码,发现上手难度较高,指引文档不清晰,特别是Access ID设置和代码复制流程。 - 功能上,评分9分,辅助编程和知识问答功能显著提升了学习效率,减少了错误。 - 愿意推荐,并有兴趣参与开源开发以提升自我。 - 希望增强错误排查,提供具体错误原因和位置。 - 联动ACK智能助手可增强学习效果。 [链接]: https://developer.aliyun.com/topic/instructions-for-os-copilot
|
5天前
|
弹性计算 运维 自然语言处理
阿里云操作系统智能助手OS Copilot的实验测评报告
阿里云OS Copilot是AI驱动的Linux操作系统助手,助于系统管理和运维。学生反馈它在代码解释和编写上有很大帮助,给予8-9分的评价。功能亮点包括自然语言问答、辅助编程和命令解释,简化操作,提升效率。尽管易用,但需基础Linux知识。用户期待更多功能如系统优化建议和代码优化。与ACK智能助手配合,实现故障排查和运维。适合寻求效率提升的个人和团队。
34 0
|
5天前
|
弹性计算 运维 自然语言处理
阿里云操作系统智能助手OS Copilot实验测评报告
阿里云OS Copilot是面向Linux的智能助手,助运维工程师提升效率。易上手,文档清晰,对新人友好。提供自然语言问答、编程辅助,尤善理解与响应。评分10/10,推荐给同行。目前侧重辅助编程,期望支持更多OS、并发命令执行及错误分析。适合集成于ECS等,打造自动化工作流。期待开源版本与社区合作。
58 0
|
5天前
|
弹性计算 运维 安全
操作系统智能助手OS Copilot实验测评报告
**阿里云OS Copilot摘要** OS Copilot是面向开发者和学生的智能助手,尤其对学习编程和运维有显著帮助。虽然初期上手复杂,但其知识问答、辅助编程功能深受好评,评分10分。用户愿推荐给他人,并期待开源参与开发。产品优点包括多功能、便捷性和高准确度,但新手引导需改进。期望增加Windows支持和自动化错误分析功能。通过与ECS等产品联动,OS Copilot能提升整体效率,简化操作,展现云服务的未来潜力。
45 0
|
10天前
|
安全 Linux 网络安全
部署07--远程连接Linux系统,利用FinalShell可以远程连接到我们的操作系统上
部署07--远程连接Linux系统,利用FinalShell可以远程连接到我们的操作系统上
|
10天前
|
Linux 虚拟化 数据安全/隐私保护
部署05-VMwareWorkstation中安装CentOS7 Linux操作系统, VMware部署CentOS系统第一步,下载Linux系统,/不要忘, CentOS -7-x86_64-DVD
部署05-VMwareWorkstation中安装CentOS7 Linux操作系统, VMware部署CentOS系统第一步,下载Linux系统,/不要忘, CentOS -7-x86_64-DVD