先来先服务算法(FCFS)

FCFS是最简单的调度算法,既可以用作作业调度,也可以用作进程调度

这种算法优先考虑系统中等待时间最长的作业(进程),而不管作业所需执行时间长短,

做法是从后备队列中选择几个最先进入该队列的作业,将它们调入内存,为它们分配资源和创建进程,然后放入就绪队列

进程调度中使用此算法时,每次都从就绪的进程队列中选择一个最先进入该队列的进程,为之分配处理机,使之投入运行,该进程会一直运行到完成或者因发生某事件而阻塞后,进程调度程序才会把处理机分配给其他进程

先来先服务(FCFS)调度算法是一种最简单的调度算法,该算法既可用于作业调度,也可用于进程调度。当在作业调度中采用该算法时,每次调度都是从后备作业队列中选择一个或多个最先进入该队列的作业,将它们调入内存,为它们分配资源、创建进程,然后放入就绪队列。在进程调度中采用FCFS算法时,则每次调度是从就绪队列中选择一个最先进入该队列的进程,为之分配处理机,使之投入运行。该进程一直运行到完成或发生某事件而阻塞后才放弃处理机。
­­­­短作业优先算法(SJF)
由于在实际情况中短作业(进程)所占比例很大,为了让它们比长作业优先执行,就有了此算法。
SJF顾名思义以作业长短来确定优先级,作业越短优先级越高,作业的长短用作业所需的运行时间来衡量,此算法一样也可以用做进程调度,它将从外存的作业后备队列中选择若干个估计运行时间最短的作业,优先将它们调入内存运行。
SJF调度算法也存在不容忽视的缺点:该算法对长作业不利,如作业C的周转时间由10增至16,其带权周转时间由2增至3.1。更严重的是,如果有一长作业(进程)进入系统的后备队列(就绪队列),由于调度程序总是优先调度那些(即使是后进来的)短作业(进程),将导致长作业(进程)长期不被调度。该算法完全未考虑作业的紧迫程度,因而不能保证紧迫性作业(进程)会被及时处理。由于作业(进程)的长短只是根据用户所提供的估计执行时间而定的,而用户又可能会有意或无意地缩短其作业的估计运行时间,致使该算法不一定能真正做到短作业优先调度。

#include<stdio.h>
#include<stdlib.h>
#include<iostream>
using namespace std;
struct Node {char name;int Tarrive;//到达时间int Tservice;//服务时间int Tsurplus;//剩余时间int Tstart;//开始时间int Taccomplish;//完成时间int prio;//优先级---数字越大优先级越高int if_finish;//进程是否完成int num;//进程个数
}job[10];
//按到达时间排序
void Arrive_sort(int num)
{int temp1, temp2, temp3;for (int i = 0; i < num; i++){for (int j = i + 1; j < num; j++){if (job[i].Tarrive > job[j].Tarrive){temp1 = job[j].name;job[j].name = job[i].name;job[i].name = temp1;temp2 = job[j].Tarrive;job[j].Tarrive = job[i].Tarrive;job[i].Tarrive = temp2;temp3 = job[j].Tservice;job[j].Tservice = job[i].Tservice;job[i].Tservice = temp3;}}}
}
//按服务时间排序
void Service_sort(int num)
{int temp1, temp2, temp3;for (int i = 1; i < num; i++){for (int j = i + 1; j < num; j++){if (job[i].Tservice > job[j].Tservice){temp1 = job[j].name;job[j].name = job[i].name;job[i].name = temp1;temp2 = job[j].Tarrive;job[j].Tarrive = job[i].Tarrive;job[i].Tarrive = temp2;temp3 = job[j].Tservice;job[j].Tservice = job[i].Tservice;job[i].Tservice = temp3;}}}
}
//按优先级排序
void Priority_sort(int num)//按优先级减小排序
{int temp1, temp2, temp3, temp4;for (int i = 1; i < num; i++){for (int j = i + 1; j < num; j++){if (job[i].prio < job[j].prio){temp1 = job[j].name;job[j].name = job[i].name;job[i].name = temp1;temp2 = job[j].Tarrive;job[j].Tarrive = job[i].Tarrive;job[i].Tarrive = temp2;temp3 = job[j].Tservice;job[j].Tservice = job[i].Tservice;job[i].Tservice = temp3;temp4 = job[j].prio;job[j].prio = job[i].prio;job[i].prio = temp3;}}}
}
//如果到达时间相等,服务时间按从小到大排序
void Arrive_Short_sort(int num)
{int temp1, temp2, temp3;for (int i = 0; i < num; i++){for (int j = i + 1; j < num; j++){if (job[i].Tarrive >= job[j].Tarrive){if (job[i].Tarrive > job[j].Tarrive){temp1 = job[j].name;job[j].name = job[i].name;job[i].name = temp1;temp2 = job[j].Tarrive;job[j].Tarrive = job[i].Tarrive;job[i].Tarrive = temp2;temp3 = job[j].Tservice;job[j].Tservice = job[i].Tservice;job[i].Tservice = temp3;}else{if (job[i].Tservice > job[j].Tservice){temp1 = job[j].name;job[j].name = job[i].name;job[i].name = temp1;temp2 = job[j].Tarrive;job[j].Tarrive = job[i].Tarrive;job[i].Tarrive = temp2;temp3 = job[j].Tservice;job[j].Tservice = job[i].Tservice;job[i].Tservice = temp3;}}}}}
}
void fcfs(int num)//先来先服务
{for (int i = 0; i < num; i++){job[i].Tstart = job[i - 1].Taccomplish;//上一个作业结束时间if (job[i].Tstart < job[i].Tarrive){job[i].Tstart = job[i].Tarrive;}else{job[i].Tstart = job[i - 1].Taccomplish;}job[i].Taccomplish = job[i].Tstart + job[i].Tservice;}
}
void sjf(int num)//短作业优先
{Service_sort(num);for (int i = 0; i < num; i++){job[i].Tstart = job[i - 1].Taccomplish;//上一个作业结束时间if (job[i].Tstart < job[i].Tarrive)//该作业的开始时间小于到达时间{job[i].Tstart = job[i].Tarrive;}else{job[i].Tstart = job[i - 1].Taccomplish;}job[i].Taccomplish = job[i].Tstart + job[i].Tservice;}
}
void RR(int num)//RR算法
{int q;cout << "请输入时间片长度:" << endl;cin >> q;int flag = 1;//标志队列中是否还有进程int finish_pro = 0;//完成的进程数cout << "进程名称\t" << "开始时间\t" << "运行时间\t" << "剩余服务时间\t" << "结束时间\t" << endl;int time;//记录当前时刻时间int c = 0;while (finish_pro < num){flag = 0;//就绪队列里没进程for (int i = c; i < num; i++){Arrive_sort(num);job[i].Tsurplus = job[i].Tservice;job[i].Tstart = job[i - 1].Taccomplish;//上一个作业结束时间if (job[i].Tstart < job[i].Tarrive)//该作业的开始时间小于到达时间{job[i].Tstart = job[i].Tarrive;}else{job[i].Tstart = job[i - 1].Taccomplish;}time = job[i].Tstart;if (job[i].if_finish == 1) continue;//该进程已完成else{if (job[i].Tsurplus <= q && time >= job[i].Tarrive)//未完成且少于一个时间片{flag = 1;time = time + job[i].Tsurplus;job[i].if_finish = 1;//该进程完成job[i].Taccomplish = time;cout  << job[i].name << "\t\t" << job[i].Taccomplish - job[i].Tsurplus << "\t\t" << job[i].Tsurplus << "\t\t" << 0 << "\t\t" << job[i].Taccomplish << endl;job[i].Tsurplus = 0;}else if (job[i].Tsurplus > q && time >= job[i].Tarrive){flag = 1;time = time + q;job[i].Tsurplus -= q;job[i].Taccomplish = time;cout << job[i].name << "\t\t" << time - q << "\t\t" << q << "\t\t" << job[i].Tsurplus << "\t\t" << job[i].Taccomplish << endl;job[num].name = job[i].name;job[num].Tarrive = time;job[num].Tservice = job[i].Tsurplus;num++;}if (job[i].if_finish == 1) finish_pro++;//一个进程完成加一}c++;}break;if (flag == 0 && finish_pro < num)//没执行完且没进入就绪队列{for (int i = 0; i < num; i++){if (job[i].if_finish == 0){time = job[i].Tarrive;break;}}}}
}
//输出
void print(int num)
{cout << "进程名" << "\t" << "到达时间" << "\t" << "服务时间" << "\t" << "完成时间" << endl;for (int i = 0; i < num; i++){cout << job[i].name << "\t" << job[i].Tarrive << "\t\t" << job[i].Tservice << "\t\t" << job[i].Taccomplish << endl;}
}
void display(int num)
{int ch = 0;cout << "—————————————————————————" << endl;cout << "——————————1、FCFS算法 —————————" << endl;cout << "——————————2、SJF算法——————————" << endl;cout << "——————————3、RR算法 ——————————" << endl;cout << "——————————4、优先级算法 ————————" << endl;cout << "——————————5、退出 ———————————" << endl;cout << "—————————————————————————" << endl;do {cout << "请选择你想要的算法:" << endl;cin >> ch;switch (ch) {case 1:Arrive_sort(num);fcfs(num);print(num);break;case 2://Arrive_Short_sort(num);sjf(num);print(num);break;case 3:RR(num);break;case 4:print(num);break;case 5:exit;default:cout << "输入错误,请重新输入!" << endl;break;}} while (ch != 5);
}
int main()
{int num;char jname;int arrive;int service;int accomplish;cout << "请输入进程个数:" << endl;cin >> num;for (int i = 0; i < num; i++){cout << "请输入进程名、到达时间、服务时间" << endl;cin >> jname;job[i].name = jname;cin >> arrive;job[i].Tarrive = arrive;cin >> service;job[i].Tservice = service;}display(num);return 0;
}

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

  1. 【操作系统】-- 先来先服务算法(FCFS)、短作业优先算法(SJF)、高响应比调度算法(HRRN)

    一.先来先服务(FCFS) 1.算法思想 主要从公平的角度考虑. 2.算法规则 按照 作业/进程 到达的先后顺序进行服务. 3.是否可抢占 非抢占式算法. 4.是否可导致饥饿 不会导致饥饿. 5.优缺 ...

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

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

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

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

  4. Java操作系统进程调度算法——先来先服务(FCFS)算法

    Java操作系统进程调度算法--先来先服务(FCFS)算法 Java操作系统进程调度算法--先来先服务(FCFS)算法 文章目录 Java操作系统进程调度算法--先来先服务(FCFS)算法 前言 一. ...

  5. 操作系统短作业优先(SJF)调度算法

    一,算法代码 #include<stdio.h>struct sjf { //定义进程的结构体 char name[10];//进程名 float arrivetime;//到达时间 fl ...

  6. 【JAVA操作系统——进程调度】非抢占式短作业优先算法

    测试要求 进程信息如下: 进程 到达时间 服务时间 A 0 3 B 1 6 C 2 4 D 3 9 E 4 1 请输出进程的调度过程,以及系统平均带权周转时间. 代码实现 package com.zj ...

  7. 操作系统短作业优先(SJF)算法

    短作业优先(SJF)算法 SJF概念 以运行作业的时间长短来决定计算的优先级,作业运行时间越短,优先级越高. SJF算法展示(java) 首先我们先来创建一个Process类来模拟作业 package ...

  8. 非抢占式优先算法例题_非抢占短作业优先算法源代码(C语言)

    #include #include #define MAX 5 //进程数 /*短作业优先算法*/ struct pro { int num; //进程名 int arriveTime; //到达时间 ...

  9. SHA3系列(KECCAK)哈希算法原理及实现(附源码)

    相关文章: (本文持续更新中) SHA3系列(KECCAK)哈希算法原理及实现(附源码) SHA512系列哈希算法原理及实现(附源码) SHA224和SHA256哈希算法原理及实现(附源码) 国密SM ...

最新文章

  1. arcgis弧段怎么加很多点_ArcGIS小技巧——提取面要素的质心点
  2. AseoZdpAseo.init(this, AseoZdpAseo.INSERT_TYPE);
  3. 可用于在 Microsoft.NET Framework 4.0 中的 ASP.NET 浏览器定义文件的修补程序
  4. 加密解密、Openssl、自建CA
  5. 基础 - 结构体大小计算
  6. qml demo分析(customgeometry-贝塞尔曲线)
  7. 由mysql8降级到mysql5
  8. 沟通科技:将引领接入革命第三次浪潮
  9. 扎克伯格被美国一刊物评为“年度恶人” Facebook为世界最差网站
  10. 报错:1130-host ... is not allowed to connect to this MySql server
  11. PC端微信扫码关注公众号并登录
  12. 安卓实现播放器app
  13. 使用sqlcipher打开加密的sqlite方法
  14. csv文件打开波形,SPICE Explorer 2007.1 软件使用
  15. LaTex 自动生成IEEE格式的参考文献
  16. 深度学习:蒸馏Distill
  17. 其他品牌的触控笔能用在ipad上?性价比高的触控笔合集
  18. node-red教程6 串口控件的使用
  19. Android 流式布局FlowLayout
  20. 天梯赛习题:福到了(递归打印)

热门文章

  1. pb 窗口数据修改sql_大数据hadoop,数据中台选型你应该看到这些分布式数据库
  2. 计算机弹出错误字,电脑蓝屏,并且屏幕上出现这样的文字该怎么解决?
  3. 中的 隐藏鼠标菜单_Mac移动隐藏删除顶部菜单栏图标教程
  4. 对象工厂PHP,php – 有一个工厂用于创建对象的好处?
  5. python简单好看的代码_Python新手写出漂亮的爬虫代码1
  6. pickle序列化存在安全隐患
  7. fastText中常见问题汇总
  8. 线性回归竟然还有不明白的地方
  9. java 乐观锁 实例_JAVA乐观锁实现-CAS(示例代码)
  10. kfold_机器学习gridsearchcv(网格搜索)和kfold validation(k折验证)