吐槽

上课时操作系统没咋学,倒不是不想学,实在是老师讲的太乏味,照着PPT读,今天学习SJF时,发现不少博客写错了,居然直接将服务时间排序而不考虑到达时间,导致我一下陷入自我怀疑。

SJF概念介绍

SJF,全称Short Job First,中文名:短作业优先调度算法
优点:考虑到作业的服务时间情况,降低了周转时间等相应时间;
缺点:有可能短进程一致插队,导致长进程处于长期饥饿状态;
理解误区:不是直接将进程按服务时间的长短排序后顺序执行!!,而是先按到达时间排序,若有多个进程的到达时间小于上一进程的结束时间,则将这多个进程按服务时间长短调度

SJF代码实现

CreateProcessQueue模块的实现思路和之前我写的先来先服务算法FCFS的CreateProcessQueue模块的实现思路一样,实现创建进程和初始化进程功能。

Sort模块的实现思路:

  • 冒泡算法

SJF模块的实现思路:

  1. 先将所有进程按到达时间排序,用sort函数实现;
  2. 利用循环体依次调度进程;
  3. 判断进程状态,‘f’为未调用;
  4. 先实现第一个进程;
  5. 往后的进程判断到达时间是否小于上一进程的结束时间;
  6. 若小于上一进程的结束时间,将小于上一进程结束时间的进程按服务时间排序,这里利用冒泡算法;
  7. 若大于,直接执行;

这里使用了数组存取进程,是因为SJF算法很少涉及插入删除操作,比较链表,还是数组更合适。

SJF算法的完整实现代码:

#include<stdio.h>
#include<stdlib.h>
#define MAX 100typedef struct PCB{int no;char name[10];char State;int ArrivalTime;            //到达时间 int ServeTime;              //服务时间 int StartTime;              //开始时间 int EndTime;                //结束时间 float TurnaroundTime;       //周转时间 float TakePowerTime;        //带权周转时间 struct PCB *next;
}PCB;PCB Queue[MAX] = {0};
int time;                       //计时器
int n;                          //进程数量 void CreateProcessQueue(){printf("创建进程数:");scanf("%d",&n);for(int i=0;i<n;i++){//进程初始化 Queue[i].State = 'f';           Queue[i].StartTime = 0;Queue[i].EndTime = 0;Queue[i].TakePowerTime = 0;Queue[i].TurnaroundTime = 0;printf("进程编号 进程名 到达时间 服务时间\n");scanf("%d %s %d %d",&Queue[i].no,&Queue[i].name,&Queue[i].ArrivalTime,&Queue[i].ServeTime);     }
}void Run(PCB pcb){pcb.State = 't';pcb.StartTime = time;pcb.EndTime = pcb.ServeTime+pcb.StartTime;time = pcb.EndTime;pcb.TurnaroundTime = pcb.EndTime - pcb.ArrivalTime;pcb.TakePowerTime = pcb.TurnaroundTime/pcb.ServeTime;printf("进程编号 进程名 开始时间 结束时间 周转时间 带权周转时间\n");printf("%d       %s     %d        %d       %.2f     %.2f\n",pcb.no,pcb.name,pcb.StartTime,pcb.EndTime,pcb.TurnaroundTime,pcb.TakePowerTime);
}void sort(){//按到达时间排序 for(int j=0;j<n;j++){for(int i=0;i<n-j-1;i++){if(Queue[i].ArrivalTime>Queue[i+1].ArrivalTime){PCB temp = Queue[i];Queue[i] = Queue[i+1];Queue[i+1] = temp;} }}
}void SJF(){sort();time = Queue[0].ArrivalTime;for(int i=0;i<n;i++){if(Queue[i].State = 'f'){if(i ==0){Run(Queue[i]);   }else if(Queue[i].ArrivalTime<time){int num = i;while(Queue[num].ArrivalTime<time && num<n){num++;}for(int x=i;x<num;x++){for(int t=i;t<num-x;t++){if(Queue[t].ServeTime>Queue[t+1].ServeTime){PCB temp = Queue[t];Queue[t] = Queue[t+1];Queue[t+1] = temp;}   }}Run(Queue[i]);}else{Run(Queue[i]);}               }}
}int  main(){CreateProcessQueue();SJF();return 0;
}

一些思考

我实现SJF算法时走了很多弯路,集中在SJF模块,我之前曾想若多个进程小于计时器时间,通过排序找到最小服务时间进程并执行,但这样就漏掉了最小服务时间进程前面的进程,因为循环体不会往前走。也曾想通过一些限制返回到漏掉的进程处重新开始,但没能实现。

之所以能用冒泡算法将小于计时器的进程排序,因为之后的进程必然在这些进程中选择执行,因为之前是按到达时间排序的。

调度算法—SJF调度算法详解相关推荐

  1. mysql udf提权原理_udf提权原理详解

    0x00-前言 这个udf提权复现搞了三天,终于搞出来了.网上的教程对于初学者不太友好,以至于我一直迷迷糊糊的,走了不少弯路.下面就来总结一下我的理解. 想要知道udf提权是怎么回事,首先要先知道ud ...

  2. (王道408考研操作系统)第二章进程管理-第二节3:调度算法详解1(FCFS、SJF和HRRN)

    文章目录 一:先来先服务调度算法(FCFS) 二:最短作业优先调度算法(SJF)和最短剩余时间优先算法(SRTN) (1)最短作业优先调度算法(SJF) (2)最短剩余时间优先算法(SRTN) 三:高 ...

  3. 实现FCFS和SJF调度算法(电梯调度算法详解)

    实现FCFS和SJF调度算法 操作系统实验报告 实验一:作业调度 学院:软件学院 专业:软件工程 班级:软件工程12-01 姓名:*** 学号:541213460157 实验一:作业调度 实现FCFS ...

  4. 处理机调度算法详解----作业调度

    处理机调度算法详解----作业调度 ​ 在之前的理论篇中,我们也介绍了处理机调度的层次,不同的操作系统也会根据自己的设计目标来配置不同层次的调度算法,并且因为调度算法众多,如果全部糅杂在一起来讲,会让 ...

  5. LVS原理详解(3种工作方式8种调度算法)--老男孩

    一.LVS原理详解(4种工作方式8种调度算法) 集群简介 集群就是一组独立的计算机,协同工作,对外提供服务.对客户端来说像是一台服务器提供服务. LVS在企业架构中的位置: 以上的架构只是众多企业里面 ...

  6. openstack ice自定义调度算法项目详解(horizon、novaclient、api、scheduler、db、自定义数据库)

    原文转自:openstack ice自定义调度算法项目详解(horizon.novaclient.api.scheduler.db.自定义数据库) 第一部分:页面层即horizon与novaclien ...

  7. LVS原理详解(3种工作模式及8种调度算法)

    2017年1月12日, 星期四 LVS原理详解(3种工作模式及8种调度算法) LVS原理详解及部署之二:LVS原理详解(3种工作方式8种调度算法) 作者:woshiliwentong  发布日期:20 ...

  8. 调度算法-优先级调度算法+例题详解

    1. 优先级调度算法的类型 优先级进程调度算法,是把处理机分配给就绪队列中优先级最高的进程.这时,又可进一步把该算法分成如下两种. 非抢占式优先级调度算法. 抢占式优先级调度算法. 2. 优先级的类型 ...

  9. 调度算法-多级反馈队列+例题详解

    1. 调度机制 (1) 设置多个就绪队列. 优先级从高到低,时间片从小到大. (2) 每个队列都采用FCFS算法. 当新进程进入内存后,首先将它放入第一队列的末尾,按FCFS原则等待调度.当轮到该进程 ...

最新文章

  1. druid.io mysql 配置_druid.io 使用mysql存储metadata overlord启动出错
  2. android 流量统计不准确_汽车里程表上显示的百公里油耗准确吗?是不是真的是欢乐表...
  3. outlook+app+android,微软Outlook Web App抢占Android平台
  4. git依赖python_python爬虫之git的安装
  5. matlab在运筹学,MATLAB在运筹学(单纯形法)教学中的应用
  6. VPC下访问FTP的问题
  7. zotero mac 插入BibTeX条目 快捷键
  8. 车辆的检测、跟踪和计数
  9. 我的淘宝花名“九霄”
  10. Java doc或docx转pdf文件预览
  11. 6.Celeste Headlee: 10 ways to have a better conversation | TED Talk
  12. Linux的strings命令_拔剑-浆糊的传说_新浪博客
  13. C语言度化为度分秒的方法,一句话转换度:分:秒格式为度.度度度
  14. cvte java_cvte一面——java开发工程师
  15. python结巴分词实例_python 结巴分词(jieba)详解
  16. trick2-mobilenetv1、mobilenetv2、mobilenetv3替换YOLO主干
  17. ITK 形态学中的开运算和闭运算 腐蚀 膨胀
  18. 十年架构师带来的Spring源码解析,极度深寒,程序员修炼内功必备
  19. 1989旧金山地震:动物预测成功的非经典案例
  20. 【Android】动态获取当前背景图,根据背景图色动态改变字体颜色

热门文章

  1. Chapter7 “Functions as First-Class Object“
  2. 控件注册失败原因汇集
  3. 【数模国赛】经验分享
  4. 终于看到Java版的网络商城了
  5. python+爬虫+微信机器人 打造属于你的网购价格监督利器
  6. atm c语言流程图_C语言 ATM自动存取款机全套代码
  7. 神州战神win10+ubuntu双系统制作
  8. 用selenium 爬取世纪佳缘信息
  9. 物通博联·工业智能PLC物联网网关
  10. oracle是否支持gb18030,将oracle字符集改成GB18030