操作系统-----作业调度实验

一、 实验要求
1、 编写并调试一个单道处理系统的作业调度模拟程序。(必做)  作业调度算法:分别采用先来先服务(FCFS),最短作业优先(SJF)、响应比高者优先(HRRN)的调度算法。  
对每种调度算法都要求打印每个作业开始运行时刻、完成时刻、周转时间、带权周转时间,以及这组作业的平均周转时间及带权平均周转时间,以比较各种算法的优缺点。

#include <iostream>
#include <math.h>
#include <vector>
#include <stdlib.h>
#include <iomanip>
#include <algorithm>
using namespace std;
using std::cout;
using std::sort;
int n;//job count
string s[3] = { "ready" ,"running","finish" };
struct jcb
{
 int id;//作业编号
 int needtime;//需要多少时间
 int allneedtime;//一共最开始是需要多长时间
 int startruntime = 0;//开始运行时间
 int status = 0;//是否完成
 float priority = 1;//优先级
};
//设置运行所需时间从小到大排列
int cmp(jcb a, jcb b)
{
 return a.needtime < b.needtime;
}
//设置优先级从高到低
int cmp1(jcb a, jcb b)
{
 return a.priority > b.priority;
}
//输出,遍历数组来输出全部的运行过程,使用于FCFS和SJF算法
int run(vector <jcb> job)
{
 int runtime = 0;
 int alltime = 0;
 float allwtime = 0;
 while (!job.empty())
 {
  cout << "JOB" << job[0].id
   << "\tneedtime:" << job[0].needtime
   << "\tstartruntime:" << runtime;
  runtime += job[0].needtime;
  alltime += runtime;
  allwtime += runtime * 1.0 / job[0].needtime;
  cout << "\tfinishtime:" << runtime
   << "\tround time:" << runtime
   << "\tweight round time:"
   << setiosflags(ios::fixed) << setprecision(3)
   << runtime * 1.0 / job[0].needtime << endl;
  job.erase(job.begin(), job.begin() + 1);
 }
 cout << "\n  average round time:" << alltime * 1.0 / n
  << "  average weight round time:" << allwtime / n << endl;
 cout << endl;
 return 1;
}
//输出数组的全部元素的状态信息,仅仅是当前时间各个作业的状态信息
int print1(vector <jcb> job)
{//输出就绪队列的进程
 while (!job.empty())
 {
  cout << "JOB" << job[0].id
   << "\tneedtime:" << job[0].needtime
   << "\tstatus:" << s[job[0].status]
   << "\tpriority:" << job[0].priority << endl;
  job.erase(job.begin(), job.begin() + 1);
 }
 cout << endl;
 return 1;
}
int FCFS(vector <jcb> job)
{
 run(job);
 return 1;
}
int SJF(vector <jcb> job)
{
 sort(job.begin(), job.end(), cmp);
 run(job);
 return 1;
}
int HRRN(vector <jcb> job)
{
 sort(job.begin(), job.end(), cmp);
 int count = n;//还有多少个作业尚未完成
 int runtime = 0, alltime = 0;
 float allwtime = 0;
 int isstarted[100] = { 0 };
 cout << "初始的作业状态:" << endl;
 print1(job);
 cout << "运行状态:" << endl;
 while (true)//就绪队列非空
 {
  if (isstarted[job[0].id - 1] == 0)
  {
   isstarted[job[0].id - 1] = 1;
   job[0].startruntime = runtime;
  }
  //运行队列的第一个作业
  job[0].status = 1;
  job[0].needtime -= 1;
  runtime++;
  for (int i = 1; i < count; i++)
  {
   job[i].priority = 1 + runtime * 1.0 / job[i].needtime;
  }
  cout << "time:" << runtime << endl;
  print1(job);//输出作业的状态
  if (job[0].needtime == 0)//当前作业完成
  {
   count--;
   job[0].status = 2;//运行结束
   alltime += runtime;
   allwtime += runtime * 1.0 / job[0].allneedtime;
   cout << "JOB" << job[0].id << " has finished!!\n" << "startruntime:" << job[0].startruntime
    << "\tfinishtime:" << runtime << "\troundtime:" << runtime
    << "\tround weight time:" << runtime * 1.0 / job[0].allneedtime << endl;
   cout << endl;
   job.erase(job.begin(), job.begin() + 1);
   if (job.empty())
    break;
  }
  else
   job[0].status = 0;
  sort(job.begin(), job.end(), cmp1);
 }
 cout << endl;
 cout << "  average round time:" << alltime * 1.0 / n
  << "  average weight round time:" << allwtime / n << endl;
 return 1;
}
int main() {
 cout << "input job counts:";
 cin >> n;
 vector <jcb> job(n);
 cout << "input jobs needtime:\n";
 for (int i = 0; i < n; i++)
 {
  cout << "请输入第" << i + 1 << "个作业所需要的时间:";
  job[i].id = i + 1;
  cin >> job[i].needtime;
  job[i].allneedtime = job[i].needtime;
 }
 cout << "FCFS:" << endl;
 FCFS(job);
 cout << "SJF" << endl;
 SJF(job);
 cout << "HRRN" << endl;
 HRRN(job);
}

运行结果:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
图有点多,就不都附上了
这是最后一张:
在这里插入图片描述

  • 1
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实验一 进程调度 编写并调试一个模拟的进程调度程序,采用“短进程优先”调度算法对五个进程进行调度。以加深对进程的概念及进程调度算法的理解. 下面是采用动态优先数的调度程序,可作参考。  例题: 设计一个有 N个进程共行的进程调度程序。   进程调度算法:采用最高优先数优先的调度算法(即把处理机分配给优先数最高的进程)和先来先服务算法。   每个进程有一个进程控制块( PCB)表示。进程控制块可以包含如下信息:进程名、优先数、到达时间、需要运行时间、已用CPU时间、进程状态等等。   进程的优先数及需要的运行时间可以事先人为地指定(也可以由随机数产生)。进程的到达时间为进程输入的时间。   进程的运行时间以时间片为单位进行计算。   每个进程的状态可以是就绪 W(Wait)、运行R(Run)、或完成F(Finish)三种状态之一。   就绪进程获得 CPU后都只能运行一个时间片。用已占用CPU时间加1来表示。   如果运行一个时间片后,进程的已占用 CPU时间已达到所需要的运行时间,则撤消该进程,如果运行一个时间片后进程的已占用CPU时间还未达所需要的运行时间,也就是进程还需要继续运行,此时应将进程的优先数减1(即降低一级),然后把它插入就绪队列等待CPU。   每进行一次调度程序都打印一次运行进程、就绪队列、以及各个进程的 PCB,以便进行检查。重复以上过程,直到所要进程都完成为止。实验作业调度 一、实验目的:用高级语言编写和调试一个或多个作业调度模拟程序,以加深对作业调度算法的理解。 二、实验内容: 1.写并调试一个单道处理系统作业等待模拟程序。 2.作业等待算法:分别采用先来先服务(FCFS)、响应比高者优先(HRN)的调度算法。 3.由于在单道批处理系统作业一投入运行,它就占有计算机的一切资源直到作业完成为止,因此调度作业时不必考虑它所需要的资源是否得到满足,它所占用的 CPU时限等因素。 4.每个作业由一个作业控制块JCB表示,JCB可以包含如下信息:作业名、提交时间、所需的运行时间、所需的资源、作业状态、链指针等等。作业的状态可以是等待W(Wait)、运行R(Run)和完成F(Finish)三种状态之一。每个作业的最初状态总是等待W。 5.对每种调度算法都要求打印每个作业开始运行时刻、完成时刻、周转时间、带权周转时间,以及这组作业的平均周转时间及带权平均周转时间。 三、思考:比较各种算法的优缺点。 实验三 动态分区分配方式的模拟 1、实验目的:了解动态分区分配方式的数据结构和分配算法,并进一步加深对动态分区存储管理方式及其实现过程的理解 2、实验内容: (1)用C语言分别实现采用首次适应算法和最佳适应算法的动态分区分配过程和回收过程。其,空闲分区通过空闲分区链(表)来管理;在进行内存分配时,系统优先使用空闲区低端的空间。 (2)假设初始状态下,可用的内存空间为640KB,并有下列的请求序列: •作业1申请130KB •作业2申请60KB •作业3申请100KB •作业2释放60KB •作业4申请200KB •作业3释放100KB •作业1释放130KB •作业5申请140KB •作业6申请60KB •作业7申请50KB •作业8申请60KB 请分别采用首次适应算法和最佳适应算法进行内存的分配和回收,要求每次分配和回收后显示出空闲内存分区链的情况。 3、思考:讨论各种分配算法的特点。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值