算法思想:

先来先服务调度算法:

(1)假设系统中有5个进程,每个进程有一个进程控制块(PCB)来标识。进程控制块内容包括:进程名,链接指针,到达时间,估计运行时间,进程状态。

进程名即进程标识。

链接指针:按照进程到达系统的时间将处于就绪状态的进程连接成一个就绪队列。指针指出下一个到达进程的进程控制块地址。最后一个进程的链接指针为NULL。

估计运行时间:可由设计者任意指定一个时间值。

到达时间:进程创建时的系统时间或由用户指定。调度时。总是选择到达时间最早的进程。

进程状态:为简单起见,这里假定进程有两种状态:就绪和完成。并假定进程一创建就处于就绪状态,用R表示。当一个进程运行结束时,就将其置成完成态,用C表示。

(2)设置一个队首指针head,用来指出最先进入系统地进程。各就绪进程通过链接指针连在一起。

(3)处理机调度时总是选择对首指针指向的进程投入运行。由于本实验是模拟试验,所以对被选中进程并不实际启动运行,而只是执行:估计运行时间减1。用这个操作来模拟进程的一次运行,而且省去进程的现场保护和现场恢复工作。

(4)在所设计的程序中应有显示或打印语句,能显示或打印正运行进程的进程名、已运行时间、还剩时间、就绪队列中的进程等。所有进程运行完成时,给出各进程的周转时间和平均周转时间。

代码:

#include<iostream>
#include<string>
#include<queue>
using namespace std;
typedef struct pcb {string pName;  //进程名float arriveTime;//到达时间float serviceTime;//服务时间float estimatedRunningtime;//估计运行时间float startTime;//开始运行时间float finishTime;//完成运行时间float turnaroundTime;//周转时间float weightedTuraroundTime;//带权周转时间char state;//状态bool operator<(const pcb &a)const {return arriveTime > a.arriveTime;}
}PCB;void createProcess(priority_queue<PCB> &p, int n) {//创建n个进程cout << endl << endl << "创建进程" << endl;PCB r;//工作结点for (int i = 0; i<n; i++) {cout << "请输入第" << i + 1 << "个进程的名字、到达时间、服务时间(例如:A 12 8):";cin >> r.pName;cin >> r.arriveTime;cin >> r.serviceTime;r.startTime = 0;r.finishTime = 0;r.estimatedRunningtime = r.serviceTime;r.turnaroundTime = 0;r.weightedTuraroundTime = 0;p.push(r);}
}void printProcess(priority_queue<PCB> p) {//输出所有进程的信息PCB q;cout << "进程名\t到达时间 服务时间 开始时间 完成时间 周转时间 带权周转时间" << endl;while (p.size() != 0) {q = p.top();cout << q.pName << "\t" << q.arriveTime << "\t " << q.serviceTime << "\t  ";cout << q.startTime << "\t   " << q.finishTime << "\t    " << q.turnaroundTime << "\t     " << q.weightedTuraroundTime << endl;p.pop();}cout << endl << endl;
}void runProcess(priority_queue<PCB> &p, priority_queue<PCB> &q, int n) {//运行进程PCB s;float finishTimeOfPriorProcess;for (int i = 0; i<n; i++) {s = p.top();if (i == 0) {//当前进程是第一个进程while (s.estimatedRunningtime != 0) {//输出当前运行进程的信息cout << "正在运行的进程" << endl;cout << "进程名\t到达时间 服务时间 已运行时间 还剩运行时间" << endl;cout << s.pName << "\t" << s.arriveTime << "\t " << s.serviceTime << "\t  ";cout << s.serviceTime - s.estimatedRunningtime << "\t     " << s.estimatedRunningtime << endl;s.estimatedRunningtime--; //当前进程的估计运行时间减1}s.startTime = s.arriveTime;s.finishTime = s.startTime + s.serviceTime;s.turnaroundTime = s.finishTime - s.arriveTime;s.weightedTuraroundTime = float(s.turnaroundTime*1.0 / s.serviceTime);s.state = 'C';finishTimeOfPriorProcess = s.finishTime;}else {//当前进程不是第一个进程while (s.estimatedRunningtime != 0) {cout << "正在运行的进程" << endl;cout << "进程名\t到达时间 服务时间 已运行时间 还剩运行时间" << endl;cout << s.pName << "\t" << s.arriveTime << "\t " << s.serviceTime << "\t  ";cout << s.serviceTime - s.estimatedRunningtime << "\t     " << s.estimatedRunningtime << endl;s.estimatedRunningtime--;//当前进程的估计运行时间减1}s.startTime = finishTimeOfPriorProcess>s.arriveTime ? finishTimeOfPriorProcess : s.arriveTime;s.finishTime = s.startTime + s.serviceTime;s.turnaroundTime = s.finishTime - s.arriveTime;s.weightedTuraroundTime = float(s.turnaroundTime*1.0 / s.serviceTime);s.state = 'C';finishTimeOfPriorProcess = s.finishTime;}q.push(s);p.pop();cout << "进程" << s.pName << "执行结束之后就绪队列中的进程" << endl;printProcess(p);}cout<< endl << endl;
}int main() {priority_queue<PCB> p,q;int n;cout << "请输入进程的个数:";cin >> n;createProcess(p, n);runProcess(p, q, n);cout << "所有进程执行结束之后的相关情况" << endl << endl;printProcess(q);getchar();getchar();return 0;
}

实验结果:

先来先服务调度算法(C++实现)相关推荐

  1. fcfs调度算法_FCFS:先来先服务调度算法

    fcfs调度算法 The FCFS, which stands for First Come First Serve Scheduling Algorithm, is a non-preemptive ...

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

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

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

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

  4. 关于c语言排序计时器完整程序,先来先服务调度算法模拟实验程序源代码(C语言)...

    先来先服务调度算法模拟实验程序源代码(C语言) 下载提示(请认真阅读)1.请仔细阅读文档,确保文档完整性,对于不预览.不比对内容而直接下载带来的问题本站不予受理. 2.下载的文档,不会出现我们的网址水 ...

  5. 请谈谈你对这句话的理解:“所见的是暂时的,所不见的是永远的”5.3 先来先服务调度算法为什么苏联解体的时候,戈尔巴乔夫演讲的当时,电视的所有频道都在放《天鹅湖》介绍一下LSTM文本生成模型

    目录 请谈谈你对这句话的理解:"所见的是暂时的,所不见的是永远的" 5.3 先来先服务调度算法 为什么苏联解体的时候,戈尔巴乔夫演讲的当时,电视的所有频道都在放<天鹅湖> ...

  6. 先来先服务调度算法(FCFS)

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

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

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

  8. 进程调度算法-先来先服务调度算法(FCFS)

    定义 如果早就绪的进程排在就绪队列的前面,迟就绪的进程排在就绪队列的后面,那么先来先服务(FCFS: first come first service)总是把当前处于就绪队列之首的那个进程调度到运行状 ...

  9. 计算机操作原理进程调度算法---先来先服务,短进程优先(C语言)

    目录 先来先服务调度算法: 短进程优先调度算法: 两种进程调度算法优缺点 思维导图 程序代码: 先来先服务调度算法: 先来先服务(FCFS)调度算法是一种最简单的调度算法,该算法既可用于作业调度,也可 ...

最新文章

  1. 练习C语言二级编程题的一些问题
  2. (转)标准I/O缓冲:全缓冲、行缓冲、无缓冲 .
  3. P1303 A*B Problem 高精度乘法
  4. LaTex插入PDF图片并调整它的宽度
  5. session在.ashx文件操作问题
  6. 自增主键为什么不是连续的?
  7. Android开发文摘集合1
  8. 企业 IT 架构转型之道 阿里巴巴中台战略思想与架构实战
  9. 让你的MSN更精彩!聊天伴侣小i机器人试用体验
  10. 新计算机安装系统后鼠标键盘都无反应处理
  11. python 支持erp自动化操作
  12. smallpt: Global Illumination in 99 lines of C++讲解
  13. 吉软-java-第八次作业
  14. 显示器接口_都2019年了,还分不清你的显示器接口?快进来补课!
  15. layui弹窗ifarme引入自适应页面(vw)样式缩小
  16. [转]转型后的BlackBerry“恋上”汽车市场,QNX拿什么与免费的安卓/Linux对抗?
  17. 微信API接口目录大全
  18. Ubuntu Windows双系统安装及部分配置
  19. OCZ新Summit系列固态硬盘强悍性能曝光
  20. VMware虚拟磁盘编程指导(四)

热门文章

  1. java结丹期(16)----javaweb(maven(2))
  2. OSI网络体系结构各层协议:
  3. 【Flask】ORM高级操作之分组、过滤和子查询
  4. (42)驱动中使用全局变量
  5. (34)内核编程基础
  6. while((ch=getchar())!=EOFch != '\n');消除非法输入
  7. 【网络安全】能在Twitter和Instagram上实现信息收集和数据获取的工具
  8. php内核分析-fpm和df的问题思考
  9. 利用邻接表完成图的BFS和DFS
  10. HDU2026 首字母变大写