操作系统中的进程调度算法进行分析:

1.先来先服务算法(FCFS)
先来先服务算法是按照作业到达的先后次序来进行调度,或者说是优先考虑在系统中等待时间最长的作业,而不管该作业所执行时间的长短,从后备作业中选择几个最先进入该队列的作业,将他们调入内存,为之分配资源和创建进程。然后把他们放入就绪队列。
2.时间片轮转调度算法
在时间片轮转调度算法中,系统根据FCFS策略,将所有的就绪进程排成一个就绪队列,并设置每隔一定的时间间隔产生一次中断,激活系统中的进程调度程序,完成一次调度,将CPU分配给队首进程,令其执行。当该进程的时间片耗尽或运行完毕时,系统再次将CPU分配给新的队首进程。由此,可以保证就绪队列中的所有进程在一个确定的时间段内,都能获得一次CPU执行。
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 = 0; 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 = 0; 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 priority(int num)
{Priority_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 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:priority(num);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;int prio;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;cin >>prio;job[i].prio = prio;}display(num);return 0;
}
3、运行结果分析
本实验是通过结构体变量模拟进程,实现进程调度算法,本文优先级算法是根据
优先级大的先执行。

运行结果:

操作系统之进程调度算法相关推荐

  1. 【操作系统之进程调度算法习题】

    操作系统之进程调度算法习题 1.第一题 解答: 2. 第二题 解答: 3. 第三题 解答: 1.第一题 在一个具有三道作业的批处理系统中,作业调度采用先来先服务(FCFS) 调度算法,进程调度采用 短 ...

  2. 操作系统实习-进程调度算法(C语言)

    文章目录 设计目的 设计内容 设计思路 算法流程图 程序结构 实现代码 调试结果 设计目的 进程管理是操作系统中的重要功能,用来创建进程.撤消进程.实现进程状态转换,它提供了在可运行的进程之间复用CP ...

  3. 操作系统:进程调度算法

    进程调度算法 基本调度算法: 1.   先来先服务FCFS:既可以作为作业调度算法也可以作为进程调度算法:按作业或者进程到达的先后顺序依次调度:因此对于长作业比较有利. 算法优点:易于理解且实现简单, ...

  4. 面试必备操作系统之进程调度算法(非常全面)

    文章目录 背景 衡量指标 调度算法 先进先出(FIFO) 最短任务优先(SJF) 最短完成时间优先(STCF) 新衡量指标:响应时间 轮转(Round-Robin,RR) 去掉假设没有IO操作 参考 ...

  5. java实现操作系统时间片轮转进程调度算法(RR算法)

    Time类 package RR算法; public class time {private int hour;private int min;public int getHour() {return ...

  6. 操作系统中常见的进程调度算法

    一.调度与调度算法 调度:操作系统管理了系统的有限资源,当有多个进程(或多个进程发出的请求)要使用这些资源时,因为资源的有限性,必须按照一定的原则选择进程(请求)来占用资源.这就是调度.目的是控制资源 ...

  7. 操作系统(5)-进程调度算法

    一.概述 [百度百科]在操作系统中调度是指一种资源分配,因而调度算法是指:根据系统的资源分配策略所规定的资源分配算法.对于不同的的系统和系统目标,通常采用不同的调度算法,例如,在批处理系统中,为了照顾 ...

  8. 【操作系统 - 1】先来先服务FCFS和短作业优先SJF进程调度算法

    操作系统系列 学习至此,发现很多学了但很久没用的知识,久而久之,慢慢遗忘.等哪天还需要的话,却发现已经忘得差不多了,即使整理了文档(word等),还是得从头再学一遍.读研第一学期,发现很多东西都可以从 ...

  9. 【操作系统 - 2】时间片轮转RR进程调度算法

    操作系统系列 2017.03.17:整理第一版. 2018.01.08:添加使用 DEV C++ 的说明. ======== 学习至此,发现很多学了但很久没用的知识,久而久之,慢慢遗忘.等哪天还需要的 ...

最新文章

  1. Java培训进阶书籍推荐,赶快收藏起来!
  2. 文件特殊权限suid、sgid、stick_bit、硬链接、软链接
  3. 10. 解析XML文件(SAX/DOM/ElementTre)
  4. vb treeview 展开子节点_C# / VB.NET 在PPT中创建、编辑PPT SmartArt图形
  5. 光端机与光纤收发器的区别
  6. 其他团队对本团队评价的总结
  7. 自行车房车,还是第一次看到,惊倒一片!
  8. 巧用Calendar求解黑色星期五问题(洛谷P1202题题解,Java语言描述)
  9. cad在线转低版本_【设计专业干货】史上最齐全的CAD大全
  10. Ubuntu下emacs使用搜狗输入法
  11. 蓝桥杯2016年第七届C++省赛B组第五题-抽签
  12. 【年终总结】投身福报,我的2021年终总结
  13. python中len 函数_python len
  14. 在VS中给源文件用文件夹分类/在VS中变更源文件路径
  15. java Locale介绍
  16. 五大内存分区,堆与栈的区别
  17. 如何搭建在线网校最省钱
  18. 请问转换音乐格式的软件有哪些
  19. 左耳朵耗子:程序员如何拿到年薪60万的岗位?
  20. k-阶特征交叉增强图卷积网络

热门文章

  1. 怎么扩大图片大小?如何调整图片大小不变形?
  2. C语言,后门程序,c语言windows后门
  3. 人工智能成最强“风口” 基金多路径布局
  4. JS设置等待一段时间再执行
  5. HDU-1305-Immediate Decodability
  6. 19. 电商本质之渠道整合
  7. 收拾收拾` 回家过年
  8. 基于物品 的协同过滤推荐算法(ItemCF)
  9. UnityEditor加载AssetBundle模型变为粉色
  10. 背景图片全屏拉伸显示