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

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

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,运行该进程。

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

六、实验感悟

目录
相关文章
|
5月前
|
算法
数据结构实验之操作系统打印机管理器问题
本实验旨在通过实现操作系统中的打印机管理器问题,掌握队列的基本操作如入队、出队等,利用队列的先进先出特性解决先申请先打印的问题。实验包括队列的初始化、入队、出队、打印队列内容等功能,并通过菜单式界面进行交互。实验结果显示基本功能可正常执行,但在连续操作时存在执行失败的情况,需进一步优化。
80 4
|
23天前
|
弹性计算 运维 资源调度
使用阿里云操作系统控制台巧解调度抖动
阿里云操作系统控制台是一站式云服务器管理平台,提供性能监控、故障诊断、日志分析、安全管理和资源调度等功能。用户可实时查看CPU、内存等使用情况,快速定位并解决调度抖动等问题。智能诊断工具自动生成优化建议,简化运维流程,降低技术门槛。尽管部分功能仍在优化中,但整体上显著提升了云服务器管理的效率和稳定性。
54 15
|
5月前
|
算法 调度 UED
深入理解操作系统:进程调度与优先级队列
【10月更文挑战第31天】在计算机科学的广阔天地中,操作系统扮演着枢纽的角色,它不仅管理着硬件资源,还为应用程序提供了运行的环境。本文将深入浅出地探讨操作系统的核心概念之一——进程调度,以及如何通过优先级队列来优化资源分配。我们将从基础理论出发,逐步过渡到实际应用,最终以代码示例巩固知识点,旨在为读者揭开操作系统高效管理的神秘面纱。
|
2月前
|
人工智能 运维 安全
操作系统控制台体验评测:AI驱动的运维新体验
作为一名开发工程师,我体验了阿里云的操作系统服务套件,选择CentOS作为测试环境。安装SysOM和OS Copilot组件非常顺利,系统健康检查、诊断功能精准高效,OS Copilot智能解答操作系统问题,节省大量时间。订阅管理确保系统安全更新,整体提升运维效率约30%。建议增加更多诊断功能和培训资源。总结:AI驱动的运维新体验,极大提高工作效率和系统稳定性。[访问控制台](https://alinux.console.aliyun.com/)。
76 0
|
4月前
|
存储 算法 调度
深入理解操作系统:进程调度的奥秘
在数字世界的心脏跳动着的是操作系统,它如同一个无形的指挥官,协调着每一个程序和进程。本文将揭开操作系统中进程调度的神秘面纱,带你领略时间片轮转、优先级调度等策略背后的智慧。从理论到实践,我们将一起探索如何通过代码示例来模拟简单的进程调度,从而更深刻地理解这一核心机制。准备好跟随我的步伐,一起走进操作系统的世界吧!
|
5月前
|
消息中间件 算法 调度
深入理解操作系统:进程管理与调度
操作系统是计算机系统的核心,负责管理和控制硬件资源、提供用户接口以及执行程序。其中,进程管理是操作系统的重要组成部分,它涉及到进程的创建、调度、同步和通信等方面。本文将深入探讨进程管理的基本概念、进程调度算法以及进程间的同步和通信机制。通过本文的学习,读者将能够更好地理解操作系统的工作原理,并掌握进程管理的基本技能。
80 11
|
5月前
|
算法 调度 UED
深入理解操作系统:进程管理与调度策略
操作系统作为计算机系统的核心,其进程管理和调度策略对于系统性能和用户体验至关重要。本文将通过直观的代码示例和浅显易懂的语言,带领读者了解操作系统如何有效管理进程以及常见的进程调度算法。我们将从进程的基本概念出发,逐步深入到进程状态、进程控制块(PCB)的作用,最后探讨不同的调度算法及其对系统性能的影响。无论您是初学者还是有一定基础的开发者,都能从中获得有价值的信息。
|
5月前
|
负载均衡 算法 调度
深入理解操作系统:进程管理与调度
在数字世界的心脏,操作系统扮演着至关重要的角色。它如同一位精明的指挥家,协调着硬件资源和软件需求之间的和谐乐章。本文将带你走进操作系统的核心,探索进程管理的艺术和调度策略的智慧。你将了解到进程是如何创建、执行和消亡的,以及操作系统如何巧妙地决定哪个进程应该在何时获得CPU的青睐。让我们一起揭开操作系统神秘的面纱,发现那些隐藏在日常计算背后的精妙机制。
|
5月前
|
调度 开发者
深入理解操作系统之进程调度
在计算机科学领域,操作系统是核心的一环,它管理着计算机硬件资源,并提供接口供上层软件运行。本文将通过深入浅出的方式,探讨操作系统中至关重要的一个概念——进程调度。我们将从基础理论出发,逐步展开讲解进程调度的原理和实现,并配以实际代码示例,旨在帮助读者更好地理解和掌握这一主题。文章不仅适合初学者建立基础,也适合有一定基础的开发者深化理解。
|
5月前
|
算法 调度 UED
深入理解操作系统:进程管理与调度策略
【10月更文挑战第40天】在数字世界中,操作系统是连接硬件与软件的桥梁,它管理着计算机资源和提供用户服务。本文将深入探讨操作系统中的进程管理与调度策略,揭示它们如何协调多任务运行,保证系统高效稳定运作。通过代码示例,我们将展示进程创建、执行以及调度算法的实际应用,帮助读者构建对操作系统核心机制的清晰认识。

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等