进程调度之最短作业优先

最短作业优先

SJF(Shortest-Job-First):

  • 分为抢占式和非抢占式:

    • 非抢占式的SJF 更确切的叫 最短下次CPU执行算法(shortest-next-CPU-burst)
    • 占式的SJF 叫 最短剩余时间优先算法(shortest-remaining-time-first)
  • 优点:
    它的平均等待时间最小,是最优的调度算法。
  • 缺点:
    获取下次CPU执行长度比较困难(一般估计)。
  • 用途:
    经常用于长期调度

代码

根据个人思路模拟的SJF,仅供参考

非抢占式

#include <iostream>
#include <queue>using namespace std;
typedef  double TimeType;
const int MAXN =  1e6+5;int task_num;
TimeType now_time; //从第一个到达的作业时间开始
TimeType avg_spend_time; //平均周转时间
TimeType avg_weight_time; //平均带权周转时间struct StruTask
{int id; //序号TimeType arrive_time; //到达时间(输入)TimeType service_time; //服务时间(输入)TimeType start_time; //开始时间(设置)TimeType end_time; //结束时间(设置)TimeType spend_time; //周转时间:end_time - arrive_timeTimeType weight_time; //带权周转时间spend_time/service_timebool finished;} arrayTask[MAXN];TimeType get_task()
{cout<<"请输入任务数:"<<endl;cin>>task_num;if(task_num <= 0) return -1;cout<<"----------请输入任务相关信息-------"<<endl;TimeType minx = 1e15;for(int i = 1; i <= task_num; ++i){cout<<"请输入第"<<i<<"个任务的 到达时间 和 服务时间:";arrayTask[i].id = i;cin>>arrayTask[i].arrive_time;minx = min(minx,arrayTask[i].arrive_time);cin>>arrayTask[i].service_time;}return minx;
}int get_next_task()
{int minx = 1<<30;int aim = 0;for(int i = 1; i <= task_num; ++i){if(arrayTask[i].arrive_time<=now_time && !arrayTask[i].finished){if(arrayTask[i].service_time < minx){minx = arrayTask[i].service_time;aim = i;}}}return aim;}void run_task(StruTask &task)
{now_time = max(now_time,task.arrive_time);task.start_time  = now_time;task.end_time = now_time + task.service_time;now_time = task.end_time;task.spend_time = task.end_time - task.arrive_time;avg_spend_time += task.spend_time;task.weight_time = task.spend_time / task.service_time;avg_weight_time += task.weight_time;task.finished = true;
}void print_result(StruTask &task)
{cout<<" id: "<<task.id<<" arrive_time: "<<task.arrive_time<<" service: "<<task.service_time;cout<<" start: "<<task.start_time<<" end: "<<task.end_time;cout<<" spend: "<<task.spend_time<<" weight: "<<task.weight_time<<endl;
}/*SJF 非抢占式
Short Job First
*/
void SJF()
{avg_spend_time = 0;avg_weight_time = 0;for(int i = 1; i <= task_num; ++i){int id = get_next_task();run_task(arrayTask[id]);print_result(arrayTask[id]);}
}int main()
{now_time = get_task();if(now_time == -1)return 0;SJF();double wait = 0;for(int i = 1; i <= task_num; ++i){wait += arrayTask[i].start_time - arrayTask[i].arrive_time;}avg_spend_time /= task_num;avg_weight_time /= task_num;cout<<" avg_spend: "<<avg_spend_time<<" avg_weight: "<<avg_weight_time<<endl;cout<<" avg_wait: "<<(wait/task_num)<<endl;return 0;
}

运行示例

4
0 6
0 8
0 7
0 3

4
0 8
1 4
3 5
2 9

抢占式

#include <iostream>
#include <queue>
using namespace std;
typedef  double TimeType;
const int MAXN =  1e3+5;int task_num;
TimeType now_time; //从第一个到达的作业时间开始
TimeType avg_spend_time; //平均周转时间
TimeType avg_weight_time; //平均带权周转时间
TimeType avg_wait;
TimeType last_run[MAXN];struct StruTask
{int id; //序号TimeType arrive_time; //到达时间(输入)TimeType service_time; //服务时间(输入)TimeType start_time; //开始时间(设置)TimeType end_time; //结束时间(设置)TimeType spend_time; //周转时间:end_time - arrive_timeTimeType weight_time; //带权周转时间spend_time/service_timeTimeType remain_service_time; //剩余服务时间} arrayTask[MAXN];TimeType get_task()
{cout<<"请输入任务数:"<<endl;cin>>task_num;if(task_num <= 0) return -1;cout<<"----------请输入任务相关信息-------"<<endl;TimeType minx = 1e15;for(int i = 1; i <= task_num; ++i){cout<<"请输入第"<<i<<"个任务的 到达时间 和 服务时间:";arrayTask[i].id = i;cin>>arrayTask[i].arrive_time;minx = min(minx,arrayTask[i].arrive_time);cin>>arrayTask[i].service_time;arrayTask[i].remain_service_time = arrayTask[i].service_time;}return minx;
}int get_next_task()
{TimeType minx = 1e15;int aim = -1;for(int i = 1; i <= task_num; ++i){if(arrayTask[i].arrive_time<=now_time && arrayTask[i].remain_service_time){if(arrayTask[i].remain_service_time < minx){minx = arrayTask[i].remain_service_time;aim = i;}}}return aim;}void run_task(StruTask &task)
{now_time = max(now_time,task.arrive_time);avg_wait += now_time - (last_run[task.id]==-1?task.arrive_time:last_run[task.id]);task.start_time  = now_time;task.end_time = now_time + 1; // 执行一秒后询问,便于实现task.remain_service_time -= 1;now_time = task.end_time;last_run[task.id] = now_time;if(!task.remain_service_time){task.spend_time = task.end_time - task.arrive_time;avg_spend_time += task.spend_time;task.weight_time = task.spend_time / task.service_time;avg_weight_time += task.weight_time;}}void print_result(StruTask &task)
{cout<<" id: "<<task.id<<" arrive_time: "<<task.arrive_time<<" service: "<<task.service_time;cout<<" start: "<<task.start_time<<" end: "<<task.end_time;cout<<" spend: "<<task.spend_time<<" weight: "<<task.weight_time<<endl;
}/*SJF 抢占式:又叫最短剩余时间优先
Shortest remaining time first
*/
void SRTF()
{avg_spend_time = 0;avg_weight_time = 0;avg_wait = 0;for(int i = 0; i < MAXN; ++i){last_run[i] = -1;}int id;while(1){id = get_next_task();if(id == -1) break;run_task(arrayTask[id]);print_result(arrayTask[id]);}
}int main()
{now_time = get_task();if(now_time == -1)return 0;SRTF();avg_spend_time /= task_num;avg_weight_time /= task_num;avg_wait /= task_num;cout<<" avg_spend: "<<avg_spend_time<<" avg_weight: "<<avg_weight_time<<endl;cout<<" avg_wait: "<<avg_wait<<endl;return 0;
}

运行示例

4
0 8
2 9
3 5
1 4

进程调度之最短作业优先相关推荐

  1. 一、操作系统——处理机(作业)调度算法:先来先服务算法FCFS、最短作业优先算法SJF(非抢占式)、 最短剩余时间优先算法SRTN(抢占式)、最高响应比优先算法HRRN

    各种调度算法的学习思路: 调度算法的评价指标: 一.先来先服务算法(FCFS):First Come First Serve 二.最短作业优先算法(SJF非抢占式):Shortest Job Firs ...

  2. 操作系统之进程管理:6、调度算法(先来先服务FCFS、最短作业优先SJF、最高响应比优先HRRN、时间片轮转法、优先级调度、多级反馈队列)

    6.调度算法 适用于早期批处理机系统的调度算法 思维导图 1.先来先服务FCFS 2.最短作业优先SJF 非抢占式最短作业优先 抢占式最短作业优先(最短剩余时间优先算法) 注 3.最高响应比优先HRR ...

  3. c语言 进程调度 短作业,帮忙编写一个操作系统中进程调度的短作业优先算发的程序,感谢!该怎么解决...

    帮忙编写一个操作系统中进程调度的短作业优先算发的程序,感谢! 帮忙编写一个操作系统中进程调度的短作业优先算发的程序,感谢! ------解决方案-------------------- 完整的代码(C ...

  4. 最短作业优先(SJF)调度算法

    最短作业优先(SJF)调度算法将每个进程与其下次 CPU 执行的长度关联起来.当 CPU 变为空闲时,它会被赋给具有最短 CPU 执行的进程.如果两个进程具有同样长度的 CPU 执行,那么可以由 FC ...

  5. 最短作业优先(SJF)

    最短作业优先(SJF)是一种调度任务请求的调度策略.每个任务请求包含有请求时间(即向系统提交的请求的时间)和持续时间(即完成任务所需时间).当前任务完成后,SJF策略会选择最短持续时间执行任务,若最短 ...

  6. 调度算法先来先服务(FCFS)、最短作业优先(SJF)和最高响应比优先(HRRN)算法

    一.调度算法 (一)先来先服务(FCFS,First Come First Serve) 例题:各进程到达就绪队列的时间.需要的运行时间如下表所示.使用先来先服务调度算法,计算各进程的等待时间.平均等 ...

  7. 2.2.4 调度算法: 先来先服务 最短作业优先 最高相应比优先

    目录 思维导图 先来先服务(FCFS) 短作业优先(SJF) 高响应比优先(HRRN) 思维导图 先来先服务(FCFS) 短作业优先(SJF) 高响应比优先(HRRN) 巧妙记忆: 先来先服务(FCF ...

  8. 交互式系统中的调度:轮转调度,优先级调度,多级队列,最短进程优先,保证调度,彩票调度。批处理系统中的调度:先进先出,最短作业优先,最短剩余时间优先。陈向群书上的概念

    来自于陈向群现代操作系统原书第四版

  9. 操作系统之短作业优先实现代码

    完成与:2013.12.11左右 1. 算法思想 短作业(进程)优先调度算法SJ(P)F,是指对短作业或段进程优先调度的算法.他们分别用于作业调度和进程调度.短作业优先的调度算法时从后备队列中选择一个 ...

最新文章

  1. java相关网络协议无响应_java网络协议有哪些
  2. 4.1 df命令 4.2 du命令 4.3/4.4 磁盘分区
  3. 【计算机视觉】几个计算机视觉库
  4. OpenCV之feature2d 模块. 2D特征框架(1)Harris 角点检测子 Shi-Tomasi角点检测子 定制化创建角点检测子 亚像素级的角点检测 特征点检测
  5. 不懂规矩站错位置,“代币”谄媚“区块链”逼于无奈
  6. [iOS] tableView中实现底部button出现时tableView的bottom自动向上偏移
  7. openshift命令_使用命令行工具创建WildFly OpenShift应用程序
  8. Java 9,Jigsaw,JPMS和模块:个人探索
  9. 我的世界服务器的文件名叫什么,我的世界 外国服务器叫什么名字 | 手游网游页游攻略大全...
  10. 卸载win10装Ubuntu笔记
  11. 暴力技术(一)——BFS广(宽)度优先搜索
  12. (4)JavaScript之alert语句
  13. java中会用到二进制吗,java中的二进制运算以使用场景
  14. 解决由于Windows Installer造成的SAV安装失败的问题
  15. 二十六. Python基础(26)--类的内置特殊属性和方法
  16. 安装JDK和tomcat
  17. 关于主机远程唤醒(WOL,Wake on Lan)的几种方法
  18. 计算机地图制图的点状符号制作,计算机地图制图地图符号库系统建立..doc
  19. 在python中用os模块实现批量移动文件
  20. datax因为脏数据降速问题解决

热门文章

  1. pycharm怎么关联python_Python3 安装pylint 及与PyCharm关联
  2. 鸿蒙杀戮手机电脑版,鸿蒙杀戮单职业最新版
  3. vue事件总线_[面试] 聊聊你对 Vue.js 框架的理解
  4. Jupyter Noteboot 添加kernel 环境
  5. Python3.9又更新了:dict内置新功能,正式版十月见面
  6. 【Python面试】 说说4种常用编码的区别?
  7. 哪个瞬间你对科研圈彻底失望了?
  8. android 子module混淆_Android 矢量图详解
  9. 深度学习-Tensorflow2.2-卷积神经网络{3}-电影评论数据分类/猫狗数据集实例-15
  10. 分支限界发:Dijkstra算法