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

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

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

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

六、实验感悟

目录
相关文章
|
2月前
|
负载均衡 算法 调度
深入理解操作系统:进程管理与调度策略
【5月更文挑战第29天】 在现代计算机系统中,操作系统的核心职能之一是高效地管理和调度进程。本文旨在探讨操作系统中进程管理的基础概念、调度算法的重要性以及它们如何影响系统的整体性能。我们将从进程的生命周期入手,解析创建、执行、暂停、终止等过程,并深入讨论不同的调度策略如先来先服务(FCFS)、短作业优先(SJF)和多级反馈队列(MLQ)。通过比较这些策略在不同场景下的表现,本文将提供一个全面的视角,帮助读者理解操作系统如何在保证公平性和效率间取得平衡。
|
2月前
|
算法 调度
深入理解操作系统之进程调度算法的设计与实现
【5月更文挑战第27天】 在多任务处理的现代操作系统中,进程调度算法是核心组件之一,负责决定哪个进程将获得CPU资源。本文不仅探讨了几种经典的进程调度算法,包括先来先服务(FCFS)、短作业优先(SJF)和轮转调度(RR),还分析了各自的优势、劣势及适用场景。此外,文章将深入讨论如何根据系统需求设计自定义调度算法,并提供了基于伪代码的实现示例。最后,通过模拟实验比较了这些算法的性能,以指导读者在实际操作系统设计时的选择与优化。
|
3天前
|
算法 调度 云计算
操作系统中的调度算法:从理论到实践
在计算机科学领域,操作系统的调度算法是决定任务执行顺序的关键。本文首先概述了调度算法的基本概念和重要性,随后深入探讨了几种主要的调度算法,包括先来先服务、短作业优先、轮转与优先级调度等。通过引用最新的科研数据和实验证据,文章揭示了不同调度算法的性能表现和适用场景。此外,本文还讨论了现代操作系统中调度算法面临的挑战和未来的发展方向,强调了在多核处理器和云计算环境下调度策略的复杂性。最后,通过案例分析,展示了如何在实际系统中应用这些理论知识,以及在设计高效调度系统时需要考虑的因素。
|
5天前
|
机器学习/深度学习 算法 调度
操作系统中的进程调度策略
【6月更文挑战第26天】本文将深入探讨操作系统中的核心组件之一——进程调度。我们将从进程调度的基本概念入手,分析其重要性以及如何影响系统性能。文章将介绍几种常见的进程调度算法,并通过实例展示它们在实际操作系统中的应用。我们还将讨论现代操作系统中进程调度面临的挑战和未来可能的发展方向。
|
11天前
|
存储 负载均衡 算法
深入理解操作系统的进程调度
【6月更文挑战第20天】本文将探讨操作系统中的进程调度,包括其定义、重要性以及常见的调度算法。我们将通过具体的例子和代码片段来深入理解进程调度的工作原理和实现方式。最后,我们将讨论进程调度在现代操作系统中的应用和挑战。
|
12天前
|
调度
操作系统之进程调度机制
操作系统之进程调度机制
14 1
|
14天前
|
负载均衡 算法 调度
深入理解操作系统之进程调度
本文旨在探究操作系统核心机制之一——进程调度。文章首先概述进程与线程的基本概念,随后详细解析进程调度的目标、常见算法及其优缺点,并探讨现代操作系统中进程调度的高级话题,如多核调度和实时系统的调度策略。通过实例分析,本篇文章将帮助读者深化对进程调度复杂性的理解,并指出未来可能的发展方向。
|
4天前
|
算法 物联网 调度
操作系统调度算法的演进与性能评估
本文深入探讨了操作系统中进程调度算法的发展轨迹,从早期的先来先服务(FCFS)到现代的多级队列和反馈控制理论。通过引用实验数据、模拟结果和理论分析,文章揭示了不同调度策略如何影响系统性能,特别是在响应时间、吞吐量和公平性方面。同时,本文也讨论了在云计算和物联网等新兴领域,调度算法面临的挑战和未来的发展方向。
|
4天前
|
机器学习/深度学习 人工智能 算法
操作系统调度算法的演变与性能分析
操作系统作为计算机硬件和软件之间的桥梁,其调度算法的效率直接影响到系统的响应速度和资源利用率。本文将探讨从简单到复杂的各类调度算法,包括先来先服务、短作业优先、轮转法以及多级反馈队列等,通过数据分析揭示各算法的性能特点,并结合现代操作系统设计的需求,讨论未来调度算法的发展趋势。
|
4天前
|
机器学习/深度学习 算法 大数据
操作系统调度算法的演变与优化
在计算机科学领域中,操作系统的调度算法是核心的研究课题之一。本文深入探讨了操作系统调度算法的发展历程、当前挑战以及未来趋势。通过引用最新的科研数据和实验证据,本文旨在揭示调度算法如何适应现代计算需求的变化。我们将从理论到实践,详细分析不同调度算法的性能表现,并讨论如何利用这些算法来提升系统的整体效率和响应速度。
6 0

热门文章

最新文章