短作业优先调度原理

短作业优先调度算法是指对短作业优先调度的算法。短作业优先(SJF)的调度算法是从后备队列中选择一个或若干个估计运行时间最短的作业,将它们调入内存运行。

算法流程图

JCB 代表一个作业,JCB 的结构如下:

模拟实现

在屏幕上输出以下作业状态表:

可以通过键盘命令动态地增加作业(即增加一个 JCB 数 据结构项)。增加作业后,作业状态表内容可更新查看。

算法代码:

#include "stdafx.h"
#include<iostream>
#include <iomanip>
#include<queue>
#include<math.h>
#include<vector>
#include<algorithm>
using namespace std;/*作业的数据结构*/
struct JCB
{int ID;//作业IDdouble in_time;//作业进入时间double ex_time;//作业执行时间
};
/*执行时间大到下排序*/
bool cmp(pair<JCB, double> first, pair<JCB, double> next)
{return first.second > next.second;
}
/*ID从小到大排序*/
bool cmp2(pair<JCB, double> first, pair<JCB, double> next)
{return first.first.ID < next.first.ID;
}
/*开始执行时间从早到晚排序*/
bool cmp3(pair<JCB, double> first, pair<JCB, double> next)
{return first.second < next.second;
}
/*ID从大到小排序*/
bool cmp4(pair<JCB, double> first, pair<JCB, double> next)
{return first.first.ID > next.first.ID;
}/*显示作业表格*/
void ShowJobChart(vector<pair<JCB, double>>res)
{cout<<left;cout << "--------------------------------作业状态表-------------------------------------"<<endl;cout << setw(10) << "作业ID" << "|"<< setw(10) << "到达时间" << "|" << setw(10) << "执行时间"<<"|" << setw(10) << "开始时间" << "|" <<setw(10) << "完成时间" << "|" << setw(10) << "周转时间" << "|" << setw(12) << "带权周转时间" <<"|"<< endl;cout << "-------------------------------------------------------------------------------" << endl;for (auto it = res.begin();it != res.end();it++){cout << setw(10) << it->first.ID << "|" << setw(10) <<it->first.in_time<<"|" << setw(10) << it->first.ex_time << "|" << setw(10) <<it->second<<"|"<< setw(10) <<it->second+it->first.ex_time<<"|" << setw(10) <<it->second + it->first.ex_time -it->first.in_time<< "|"<< setw(12)<< (it->second + it->first.ex_time - it->first.in_time)/it->first.ex_time<<"|"<<endl;}cout << "-------------------------------------------------------------------------------" << endl;
}
/*作业调度                                       */
/*输入:待调度的作业队列jobs                     */
/*输出:调度好的作业数组res                         */
vector<pair<JCB, double>> JobScheduling(queue<JCB>jobs)
{JCB f_job = jobs.front();jobs.pop();//res数组用于存调度之后的结果,jcb以及对应的作业开始执行时间vector<pair<JCB, double>>res;//首先将第一个到达的工作直接加入数组
    res.push_back(make_pair(f_job, f_job.in_time));vector<pair<JCB, double>>job;double finish = f_job.in_time + f_job.ex_time;while (!jobs.empty()){//将到达时间在上一个执行的工作结束时间之前的作业存入job数组while (jobs.front().in_time <= finish){job.push_back(make_pair(jobs.front(), jobs.front().ex_time));jobs.pop();if (jobs.empty())break;}//如果没有到达时间在上一个执行的工作结束时间之前的作业if (job.empty()){res.push_back(make_pair(jobs.front(), jobs.front().in_time));finish = jobs.front().in_time + jobs.front().ex_time;jobs.pop();continue;}//将到达时间在上一个执行的工作结束时间之前的作业按执行时间从大到小排序
        sort(job.begin(), job.end(), cmp);//将最短执行时间的工作存进结果数组res.push_back(make_pair(job.rbegin()->first, finish));//更新结束时间finish += job.rbegin()->second;job.pop_back();}//如果后面几个进入的作业都在上一个执行的作业结束之前进入while(!job.empty()){res.push_back(make_pair(job.rbegin()->first, finish));finish += job.rbegin()->second;job.pop_back();}sort(res.begin(), res.end(),cmp2);return res;
}/*添加作业                                        */
/*输入:待添加的作业job,以及调度好的作业数组res*/
/*输出:添加作业之后的作业数组res               */
vector<pair<JCB, double>> Addjob(JCB job,vector<pair<JCB, double>>res)
{double tmp=job.in_time;vector<pair<JCB, double>>t_job;vector<pair<JCB, double>>res2;sort(res.begin(), res.end(), cmp3);if (job.in_time > res.rbegin()->second)//如果作业的进入时间比最后执行作业的执行时间还晚
    {res.push_back(make_pair(job, job.in_time));return res;}//将作业的执行时间从早到晚排序,将执行时间晚于作业进入时间的作业加入数组并//确定第一个执行的作业之后,重新调用作业调度函数queue<JCB>jobs;for (auto it = res.begin();it != res.end();it++){//比较待添加的作业的进入时间和已经调度好的作业的开始执行时间//和待添加的作业的执行时间和已经调度好的作业的执行时间if (job.in_time > it->second||job.ex_time>=it->first.ex_time)continue;else{job.in_time = it->second;jobs.push(job);sort(it, res.end(), cmp4);for (auto it2 = res.end() - 1;it2 > it;){jobs.push(it2->first);it2--;res.pop_back();}jobs.push(it->first);it--;res.pop_back();break;}}//重新调用作业调度函数res2=JobScheduling(jobs);res2.begin()->first.in_time = tmp;//将重新调度好的作业与不参与调度的作业连接
    res.insert(res.end(), res2.begin(), res2.end());sort(res.begin(), res.end(), cmp2);return res;
}
int main()
{queue<JCB>jobs;JCB job1, job2, job3, job4,job5;//初始作业队列job1 = { 1,8.00,2 };jobs.push(job1);job2 = { 2,8.50,0.50 };jobs.push(job2);job3 = { 3,9.00,0.10 };jobs.push(job3);job4 = { 4,11.60,0.20 };jobs.push(job4);//调用作业调度函数vector<pair<JCB, double>> res=JobScheduling(jobs);//输出作业状态表
    ShowJobChart(res);char i ;cout << "添加作业?(y/n):";cin >> i;while (i-'y'==0){JCB job;cout << "请输入作业ID:";cin >> job.ID;cout << "请输入作业进入时间:";cin >> job.in_time;cout << "请输入作业执行时间:";cin >> job.ex_time;//添加作业vector<pair<JCB, double>> res = Addjob(job, JobScheduling(jobs));ShowJobChart(res);cout << "继续添加作业?(y/n):";cin >> i;}
}

运行结果截图

编译程序

运行程序

添加一个作业

继续添加一个作业

编译环境:Ubuntu

转载于:https://www.cnblogs.com/bigyang/p/9017206.html

模拟处理机作业调度---短作业优先调度算法相关推荐

  1. C#进程调度的模拟实现:模拟先来先服务调度算法、短作业优先调度算法和优先级调度算法(考虑非抢占式和抢占式),进行算法评价,输出调度结果和算法评价指标。

    没什么水平,希望能帮到你 环境:visual studio 2019 附带工程资源:C#进程调度的模拟实现附带资源-C#文档类资源-CSDN下载 先来先服务的调度算法:是一种非抢占式的算法,先来先服务 ...

  2. 短作业优先算法c语言实现,OS短作业优先调度算法C语言

    OS短作业优先调度算法C语言 采用短作业优先调度算法调度程序 学 号: 姓 名: 专 业: 指导老师: 日 期: 目录 一.实验题目3 二.课程设计的目的3 三.设计内容3 四.设计要求3 五.主要数 ...

  3. 先来先服务和短作业优先调度算法-C语言实现

    算法介绍 先来先服务(FCFS)调度算法是一种最简单的调度算法,该算法既可用于作业调度,也可用于进程调度.当在作业调度中采用该算法时,每次调度都是从后备作业队列中选择一个或多个最先进入该队列的作业,将 ...

  4. 设有 4道作业,它们的提交时间及执行时间如下,试计算在单道程序环境下,采用先来先服务调度算法和短作业优先调度算法时的平均周转时间和平均带权周转时间,并指出它们的调度顺序。

    处理机调度算法 题目: 设有 4道作业,它们的提交时间及执行时间如下: 试计算在单道程序环境下,采用先来先服务调度算法和短作业优先调度算法时的平均周转时间和平均带权周转时间,并指出它们的调度顺序. 先 ...

  5. 操作系统第一次实验-短作业优先调度算法

    一.实验目的: 目的:了解并掌握作业调度的功能,熟悉并掌握各种作业调度算法. 任务:模拟实现先来先服务或者短作业优先调度算法. 二.实验内容: 模拟实现SJF调度. 设置作业体:作业名,作业的到达时间 ...

  6. 先来先服务和短作业优先调度算法

    先来先服务调度算法:系统按照作业到达的先后次序来进行调度,或者说它优先考虑在系统中等待时间最长的作业,而不管该作业所需执行时间的长短,从后备作业队列中选择几个最先进入该队列的作业,将它们调入内存,为它 ...

  7. 软件测试——进程调度(短作业优先调度算法+先来先服务算法)测试

    源代码 被测代码 Schedule package net.mooctest;import java.util.ArrayList; import java.util.List;public clas ...

  8. 操作系统:先来先服务调度算法以及短作业优先调度算法C语言实现

    FCFS(先来先服务)和SJF(短作业优先)调度算法 先来先服务(FCFS)调度算法是一种最简单的调度算法,该算法既可用于作业调度,也可用于进程调度.当在作业调度中采用该算法时,每次调度都是从后备作业 ...

  9. 进程调度算法-短作业优先调度算法(SJF)

    基本思想 SJF算法是以作业的长度来计算优先级,作业越短,其优先级越高.作业的长短是作业所要求的运行时间来衡量的. 算法性能评价 面向用户 周转时间 从作业被提交给系统开始,到作业完成为止的这段时间间 ...

  10. 操作系统进程调度算法(先来先服务,短作业优先算法(SJF))linux下(附源码)

    先来先服务算法(FCFS) FCFS是最简单的调度算法,既可以用作作业调度,也可以用作进程调度 这种算法优先考虑系统中等待时间最长的作业(进程),而不管作业所需执行时间长短, 做法是从后备队列中选择几 ...

最新文章

  1. USB无法识别原因分析及解决方案
  2. ssh闲置一段时间自动登出问题的解决
  3. WebClient UI create a hidden form and submit
  4. java序列化深克隆_克隆可序列化和不可序列化的Java对象
  5. CSS 选择器权重计算规则
  6. ChEMBL数据库的官方python工具包
  7. mysql超市管理系统怎么写_求php+mysql的小型超市管理系统
  8. Java验证码图片生成实现
  9. c语言的实验,c语言 实验1
  10. 夜神设置android版本,使用夜神模拟器调试android app
  11. 真假iPhone5s的辨别方法,苹果5改5s,iPhone5 改 iPhone5s 识别方法
  12. 设有一组初始记录关键字序列(K1,K2,…,Kn),要求设计一个算法能够在O(n)的时间复杂度内将线性表划分成两部分,其中左半部分的每个关键字均小于Ki,右半部分的每个关键字均大于Ki。
  13. SuperMap 三维产品白皮书
  14. win7如何用双显示屏,如何设置
  15. TDD三定律和5条规则
  16. GNU链接脚本(06) - SECTIONS指令
  17. 怎样关闭计算机自动开机,电脑定时开机,教您电脑定时开机怎么取消
  18. Java思想进阶之设计模式解析前篇(七大原则)
  19. 环信开源计划开启即时通讯云开源平台时代
  20. c语言程序设计医院就医,C语言程序设计(医院信息管理系统)附源代码[精品].doc...

热门文章

  1. 苹果mac3D模型渲染软件:KeyShot
  2. 如何从Mac桌面隐藏各种标准图标?
  3. 磁盘工具无法修复磁盘怎么办
  4. micro-mvc与主流mvc整合说明
  5. JavaMail:邮件发送以及sina、163、QQ服务器不同的解析结果(附图)
  6. (转 留存)Windows环境下的NodeJS+NPM+GIT+Bower安装配置步骤
  7. MySQL只有.frm文件恢复表结构
  8. Nginx、Apache工作原理以及nginx为何比Apache高效
  9. 安装active directory
  10. VS2008开发Silverlight程序用到的插件