先来先服务算法(FCFS)

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

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

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

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

要求

1.打印就绪队列中的进程、正运行进程的进程名、开始运行时间、结束运行时间

2.给出各进程的周转时间和平均周转

设计思路

设计一个先进先出队列和系统时间,调度时,总是选择队列头部(到达时间最早)的进程;当进程到达时间小于系统时间时,进程执行,当在当前时间没有到达的进程时,可安排延时执行进程。

测试数据

进程的参数

运行流程图

程序输出结果1(显示最终结果)

程序输出结果2(显示每秒的状态)

程序实现

程序流程图

源码

#include<iostream>using namespace std;const int N = 20;
int h[N], hh, tt = -1;//用数组模拟队列,就绪队列, 存放的是进程的下标 struct Process
{string name;//进程名int arriveTime;//到达时间int runTime;//运行时间bool st = false;//是否已经运行完毕, false为没运行完int startTime = 0x3f3f3f3f;//开始运行时间int endTime = 0x3f3f3f3f;//结束运行时间 bool operator < (const Process &w)//按照到达时间排序 {return arriveTime < w.arriveTime;}   }process[N];//N个进程void init()
{//初始化四个进程 process[1].arriveTime = 0, process[1].runTime = 4, process[1].name = "process 1";process[2].arriveTime = 2, process[2].runTime = 2, process[2].name = "process 2";process[3].arriveTime = 1, process[3].runTime = 3, process[3].name = "process 3";process[4].arriveTime = 4, process[4].runTime = 1, process[4].name = "process 4";
}void arriveCheck(int syTime)//每秒钟都check一下有没有新进程来
{for(int i = 1; i <= 4; i ++)if(!process[i].st && process[i].arriveTime <= syTime)//当进程到达,进入就绪队列{h[++ tt] = i; process[i].st = true;//标记已经到达  }
}void print(int i, int t)//打印每秒的输出
{cout << "当前时间是 " << i << "    正在运行的进程是 " << process[t].name <<  "    开始运行时间为 " << process[t].startTime << endl;if(tt >= hh){cout << "当前就绪队列中的进程为 ";for(int j = hh; j <= tt; j ++)cout << process[h[j]].name << ' ';cout << endl << endl;}else cout << "当前就绪队列为空" << endl << endl;
} void printResult()//打印最终结果
{cout << "进程已经全部运行完毕" << endl;cout << "进程名      " << "到达时间   " << "开始运行时间   " << "结束运行时间   " << "周转时间   " << endl;double sum = 0;//计算平均周转时间 for(int i = 1; i <= 4; i ++){int t = process[i].endTime - process[i].arriveTime;//周转时间sum += t; cout << process[i].name << "       " << process[i].arriveTime << "            " << process[i].startTime << "            " << process[i].endTime << "             " << t << endl;}cout << "平均周转时间为 " << sum / 4 << endl;
}int main()
{init();int syTime = 0;//系统时间 int t = 0;//当前正在运行的进程int n = 4;//总进程数 while(n){arriveCheck(syTime);if(!t)//初始化,第一个进入的进程 {t = h[hh ++];process[t].startTime = syTime;//开始运行时间 process[t].st = true;} print(syTime, t);//显示信息 if(process[t].runTime <= 0)//当前进程做完,调入就绪序列的下一个{process[t].endTime = syTime;//结束运行时间t = h[hh ++];process[t].startTime = syTime;//开始运行时间 n --; }syTime ++;process[t].runTime --;}printResult();return 0;
} 

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

  1. python单核运行_python下多核,单核CPU对于并行,并发执行效率的对比-Go语言中文社区...

    ** ** 这篇博客主要内容为python 中多线程以及多进程的效率对比,以及记录自己在做这个实验中遇到的一些问题以及心得 背景引入: CPU制造商为了追求CPU效率放弃了在CPU频率上的追求(CPU ...

  2. java后端开发面经(一)

    java synchronized 对象结构:markword(8 bytes),类指针,实例对象,对齐 markword:锁信息,GC信息,hashCode 锁消除 是发生在编译器级别的一种锁优化方 ...

  3. 阅读笔记--操作系统(清华大学公开课)

    B站 https://www.bilibili.com/video/av6538245?from=search&seid=15415472580385966467 练习 在uCore操作系统上 ...

  4. 提升计算机性能 操作系统原理角度,浅析计算机操作系统原理

    1.操作系统概述 我们从功能.组成.特征.结构4个方面对操作系统进行介绍. 1)功能: 从用户角度讲,操作系统是一个管理应用程序的控制程序,管理应用程序: 从资源管理角度讲,操作系统是管理外设.分配资 ...

  5. Linux 操作系统原理 — 进程管理 — 进程调度

    目录 文章目录 目录 进程调度 CFS 完全公平调度器 SCHED_NORMAL(普通进程调度算法) SCHED_BATCH(批量调度算法) RTS 实时调度器 SCHED_FIFO(先到先服务调度算 ...

  6. Java后端面试八股文汇总

    一.Java基础 1.Java语言具有那些特点? Java为纯面向对象的语言.它能够直接反映现实生活中的对象 具有平台无关性.java利用Java虚拟机运行字节码,无论是在Windows.linux还 ...

  7. 计算机考研849考哪几科,2016年山东大学849软件工程专业基础综合考研大纲

    2016年山东大学849软件工程专业基础综合考研大纲 849-软件工程专业基础综合操作系统一.考查目标操作系统是软件工程专业的一门核心专业基础课程,具有较强的理论性和实践性.该课程的考试内容包 作者 ...

  8. 山东大学软件学院--操作系统复习题目

    第1章 导论 1.描述操作系统的概念,解释说明其主要作用. 操作系统是控制和管理整个计算机系统的硬件与软件资源,合理地组织.调度计算机的工作与资源的分配,进而为用户和其他软件提供方便接口与环境的程序集 ...

  9. 进程调度算法之先到先服务

    进程调度算法进程调度算法之先到先服务 先到先服务(First-Come First-Served) 优点: 编码简单且容易理解: 缺点: 平均等待时间往往很长: 代码 根据个人思路模拟的FCFS,仅供 ...

最新文章

  1. ARM嵌入式编程之STM32的命名方法 STM32F103VET6命名解释
  2. JQuery中对option的添加、删除、取值
  3. MySQL加索引避免锁表:避开事务 lock_wait_timeout 副本
  4. 电机与系统计算机仿真作业,北邮计算机仿真期末大作业.docx
  5. leetcode 724. 寻找数组的中心索引
  6. 数据的PB级别是什么?
  7. Java 并发编程之 ConcurrentLinkedQueue
  8. json解析数组 nlohmann_json解析数组 nlohmann_Nlohmann json学习
  9. Evaluate that you caught up with the price cut
  10. 痞子衡嵌入式:极易上手的可视化wxPython GUI构建工具(wxFormBuilder)
  11. YDOOK:MyPLayer:Jinwei Lin 最新开源 Python 音频视频基本播放器
  12. trans系列是sci几区_怎么确定SCI论文期刊是几区的
  13. python教程(八)之异常(8.Warn)
  14. 广义表(Generalized Lists)
  15. 【历史上的今天】9 月 13 日:计算机先驱诞生日;第一台装载硬盘的超级计算机;《超级马里奥兄弟》发布
  16. VS2010播放.WAW音频文件
  17. 我们能用计算机做什么英语作文,关于计算机工作的英文作文
  18. 迷路的奶牛 Farmer John C++
  19. 家乡主题网页设计代码 旅游主题网页设计 html静态网页设计制作 dw静态网页成品模板素材网页 web前端网页设计与制作 div静态网页设计
  20. 虚幻引擎中的反射(译)

热门文章

  1. 香港科大开办英文DBA 工商管理博士课程!
  2. html表格table冻结行和列
  3. HDU5599GTW likes tree
  4. 三菱FX3G/3U RTU方式通讯四台台达vfd-e变频器示例
  5. #33 mystrcpy
  6. 复杂度 O、Θ、Ω、o、ω,别再傻傻分不清了!
  7. 阿里云服务器被挖矿病毒入侵处理
  8. 99%游戏开发者都不知道的游戏运营词汇
  9. 基于Spring Cloud的微服务架构脚手架实践
  10. 公司情况介绍及中远期规划