进程调度算法;先来先服务调度算法、短作业优先调度算法、时间片轮转调度算法

article/2025/9/16 1:28:31

一、  实验目的和要求

1.  了解进程调度算法的特点

2.  掌握进程调度算法,如先来先服务调度算法(first come first served,FCFS)、短作业优先调度算法(shotjob first,SJF)、时间片轮转调度算法。

二、    实验内容

设计模拟实现FCFS、SJF、时间片轮转调度算法的C语言程序

1.  FCFS算法:按照作业/进程进入队列的先后顺序进行挑选,先进入的将先进行后续步骤的处理。

2.  SJF算法:以进入系统的作业所要求的CPU运行时间的长短为挑选依据,优先选取预计所需服务时间最短的作业进行调度,可以分别用于高级调度和低级调度。

3.  时间片轮转算法:将所有的就绪进程按先来先服务的原则排成一个队列,每次调度时,把处理机分配给队首进程,并令其执行一个时间片。

 

三、  实验步骤

1.  使用C++语言编译程序。

2.  完成算法代码。

3.  运行程序,算出结果。

四、     实验源程序

代码:

#include <stdio.h>
#include <iostream>
#include <queue>
#include <stack>
#include <set>
#include <string>
#include <cstring>
#include <cmath>
#define MAX 1111const double Max = 11111.0;using namespace std;typedef struct FCFS
{int mark;string name;double arrivetime;double servetime;double starttime;double finishtime;double roundtime;double daiquantime;bool operator< (const FCFS &a)const{return arrivetime > a.arrivetime;}}FCFS;typedef struct SJF
{int mark;string name;double arrivetime;double servetime;double starttime;double finishtime;double roundtime;double daiquantime;bool operator< (const SJF &a)const{return servetime > a.servetime;}}SJF;typedef struct RDRN{int mark;bool flag =true;string name;double Count =0.0;double arrivetime;double servetime;double starttime;double finishtime;double roundtime;double daiquantime;double running= 0.0;bool operator< (const RDRN &a)const{return Count > a.Count;}}RDRN;void FCFS_arithmetic()
{FCFS f[MAX];FCFS ff;int n;double averagedaiquantime = 0.0;priority_queue<FCFS> q1;printf("请输入作业数(整数)\n");scanf("%d",&n);printf("请输入n组数据,每组数据包括作业名字(字符串)、作业到达时间(浮点数)、作业服务时间(浮点数)(每组数据的给元素之间用空格隔开!):\n");for(int i=0;i<n; i++){f[i].mark =i;cin>>f[i].name;scanf("%lf%lf",&f[i].arrivetime,&f[i].servetime);q1.push(f[i]);}double starttime = 0.0;ff = q1.top();q1.pop();f[ff.mark].starttime = ff.arrivetime;f[ff.mark].finishtime = f[ff.mark].starttime + ff.servetime;f[ff.mark].roundtime = f[ff.mark].finishtime - f[ff.mark].arrivetime;f[ff.mark].daiquantime = f[ff.mark].roundtime / f[ff.mark].servetime;starttime =f[ff.mark].finishtime;printf("先来先服务调度算法的作用时间表:\n\n");printf("作业名字 到达时间 服务时间 开始时间 完成时间 周转时间 带权周转时间\n");cout<<"  "<<f[ff.mark].name;printf("%10.2f %8.2f %8.2f %8.2f %8.2f%8.2f\n",f[ff.mark].arrivetime,f[ff.mark].servetime,f[ff.mark].starttime,f[ff.mark].finishtime,f[ff.mark].roundtime,f[ff.mark].daiquantime);while(!q1.empty()){ff =q1.top();q1.pop();f[ff.mark].starttime = starttime;f[ff.mark].finishtime = f[ff.mark].starttime + ff.servetime;f[ff.mark].roundtime = f[ff.mark].finishtime - f[ff.mark].arrivetime;f[ff.mark].daiquantime = f[ff.mark].roundtime / f[ff.mark].servetime;averagedaiquantime += f[ff.mark].daiquantime;starttime =f[ff.mark].finishtime;cout<<"  "<<f[ff.mark].name;printf("%10.2f %8.2f %8.2f %8.2f %8.2f%8.2f\n",f[ff.mark].arrivetime,f[ff.mark].servetime,f[ff.mark].starttime,f[ff.mark].finishtime,f[ff.mark].roundtime,f[ff.mark].daiquantime);}printf("\n平均代权周转时间:\n");printf("%.2f\n",averagedaiquantime/n);}void SJF_arithmetic(){SJF f[MAX];SJF ff;int n;double starttime = Max;double averagedaiquantime = 0.0;priority_queue<SJF> q1;printf("请输入作业数(整数)\n");scanf("%d",&n);printf("请输入n组数据,每组数据包括作业名字(字符串)、作业到达时间(浮点数)、作业服务时间(浮点数)(每组数据的给元素之间用空格隔开!):\n");for(int i=0;i<n; i++){f[i].mark =i;cin>>f[i].name;scanf("%lf %lf",&f[i].arrivetime,&f[i].servetime);if(f[i].arrivetime < starttime) starttime = f[i].arrivetime;q1.push(f[i]);}printf("短作业优先调度算法的作用时间表:\n\n");int cnt = 0;while(!q1.empty()){SJF temp[MAX];ff =q1.top();q1.pop();if(f[ff.mark].arrivetime <= starttime){for(int i=0; i<cnt; i++) q1.push(temp[i]);cnt =0;f[ff.mark].starttime = starttime;f[ff.mark].finishtime = f[ff.mark].starttime + ff.servetime;f[ff.mark].roundtime = f[ff.mark].finishtime - f[ff.mark].arrivetime;f[ff.mark].daiquantime = f[ff.mark].roundtime / f[ff.mark].servetime;averagedaiquantime += f[ff.mark].daiquantime;starttime = f[ff.mark].finishtime;}else temp[cnt++] = ff;}printf("作业名字 到达时间 服务时间 开始时间 完成时间 周转时间 带权周转时间\n");for(int i=0;i<n; i++){cout<<"  "<<f[i].name;printf("%10.2f %8.2f %8.2f %8.2f %8.2f%8.2f\n",f[i].arrivetime,f[i].servetime,f[i].starttime,f[i].finishtime,f[i].roundtime,f[i].daiquantime);}printf("\n平均代权周转时间:\n");printf("%.2f\n",averagedaiquantime/n);}void RDRN_arithmetic()
{double timeslice;RDRN f[MAX];RDRN temp[MAX];int cnt = 0;RDRN ff;int n;double averagedaiquantime = 0.0;priority_queue<RDRN> q1;printf("请输入作业数和时间片长度(作业数为整数,时间片长度可为浮点数,中间用空格隔开!):\n");scanf("%d%lf",&n,&timeslice);int tot = n;printf("请输入n组数据,每组数据包括作业名字(字符串)、作业到达时间(浮点数)、作业服务时间(浮点数)(每组数据的给元素之间用空格隔开!):\n");for(int i=0;i<n; i++){f[i].mark =i;cin>>f[i].name;scanf("%lf %lf",&f[i].arrivetime,&f[i].servetime);f[i].Count= f[i].arrivetime;q1.push(f[i]);}double clock =q1.top().arrivetime;int t = 0;while(t != n){ff =q1.top();if(f[ff.mark].arrivetime <= clock && tot-- > 0){q1.pop();if(f[ff.mark].flag){f[ff.mark].starttime = clock;f[ff.mark].flag = false;}if(f[ff.mark].running != f[ff.mark].servetime){double newtime = f[ff.mark].servetime - f[ff.mark].running;if(newtime >= timeslice){clock += timeslice;f[ff.mark].running += timeslice;f[ff.mark].Count += timeslice;}else{clock += newtime;f[ff.mark].running += newtime;f[ff.mark].Count += newtime;}if(f[ff.mark].running != f[ff.mark].servetime) temp[cnt++] = f[ff.mark];}if(f[ff.mark].running == f[ff.mark].servetime){t++;f[ff.mark].finishtime = clock;f[ff.mark].roundtime = f[ff.mark].finishtime - f[ff.mark].arrivetime;f[ff.mark].daiquantime = f[ff.mark].roundtime / f[ff.mark].servetime;averagedaiquantime += f[ff.mark].daiquantime;}}else{for(int i=0; i<cnt; i++) q1.push(temp[i]);cnt =0;tot =q1.size();}}printf("时间轮转调度算法的作用时间表:\n\n");printf("作业名字 到达时间 服务时间 开始时间 完成时间 周转时间 带权周转时间\n");for(int i=0;i<n; i++){cout<<"  "<<f[i].name;printf("%10.2f %8.2f %8.2f %8.2f %8.2f %8.2f\n",f[i].arrivetime,f[i].servetime,f[i].starttime,f[i].finishtime,f[i].roundtime,f[i].daiquantime);}printf("\n平均代权周转时间:\n");printf("%.2f\n",averagedaiquantime/n);}int main(){printf("********************************************************欢迎您!***********************************************************\n");int ca = 0;do{printf("\n请选择调度算法或结束程序:\n");printf("0、结束程序\n1、先来先服务\n2、短作业优先\n3、时间片轮转\n");scanf("%d",&ca);if(ca == 1)FCFS_arithmetic();if(ca == 2)SJF_arithmetic();if(ca == 3) RDRN_arithmetic();}while(ca);return 0;}

五、  实验结果

先来先服务调度算法:

短作业优先调度算法:

 

时间片轮转调度算法:

 

 


http://chatgpt.dhexx.cn/article/wAijiE3T.shtml

相关文章

操作系统调度算法--高响应比优先调度算法解析

高响应比优先调度算法&#xff08;Highest Response Radio Next&#xff0c;HRRN&#xff09;是一种对CPU中央控制器响应比的分配的算法。HRRN是介于FCFS&#xff08;先来先服务算法&#xff09;与SJF&#xff08;短作业优先算法&#xff09;之间的折中算法。FCFS算法所考虑的只…

进程调度算法

操作系统常见的进程调度算法 调度算法是指&#xff1a;根据系统的资源分配策略所规定的资源分配算法。常见的进程调度算法有&#xff1a; 1.先来先去服务 2.时间片轮转法 3.多级反馈队列算法 4.最短进程优先 5.最短剩余时间优先 6.最高响应比优先 7.多级反馈队列调度算法 一、…

【操作系统】调度算法

目录 &#x1f3eb;基本概念 &#x1f3e5;先来先服务&#xff08;FCFS, First Come First Serve) &#x1f3e9;短作业优先&#xff08;SJF, Shortest Job First) &#x1f346;细节 ⛪️高响应比优先&#xff08;HRRN,Highest Response Ratio Next&#xff09; &#x…

调度算法

1.先来先服务调度算法&#xff08;FCFS&#xff09;&#xff1a; 按照到达的先后顺序进行调度。 周转时间完成时间 - 到达时间 带权周转时间周转时间 / 运行时间 等待时间周转时间 - 运行时间 特殊情况&#xff1a;当有I/O操作&#xff08;输入/输出&#xff09;的进程的时候…

操作系统——调度算法

文章目录 前言一、先来先服务(FCFS)二、最短时间优先(SJF)三、最高响应比优先(HRRN)四、时间片轮转(RR)五、优先级调度六、多级反馈队列总结 前言 本文的主要内容是调度算法的介绍&#xff0c;包括先来先服务(FCFS)、最短时间优先(SJF)、最高响应比优先(HRRN)、时间片轮转(RR)…

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

1. 优先级调度算法的类型 优先级进程调度算法&#xff0c;是把处理机分配给就绪队列中优先级最高的进程。这时&#xff0c;又可进一步把该算法分成如下两种。 非抢占式优先级调度算法。抢占式优先级调度算法。 2. 优先级的类型 静态优先级 静态优先级是在创建进程时确定的&…

【操作系统】常用的调度算法

文章目录 前言先来先服务调度算法&#xff08;FCFS&#xff09;短作业/短进程优先算法&#xff08;SJF/SPF&#xff09;时间片轮转调度算法&#xff08;RR&#xff09;高响应比优先调度算法&#xff08;HRRF&#xff09;优先级调度算法&#xff08;PSA&#xff09;静态优先级动…

【操作系统】几种常用调度算法

文章目录 一、先来先服务调度算法&#xff08;FCFS&#xff09;二、短作业优先调度算法&#xff08;SJF&#xff09;最短作业优先调度算法&#xff08;SJF&#xff09;最短剩余时间优先调度算法&#xff08;SRTF&#xff09; 三、响应比最高者优先调度算法&#xff08;HRRF&…

【操作系统】_7种进程调度算法

书中一共描述了七种进程调度算法&#xff0c;为了学到这几种调度算法&#xff0c;后边做了几道练习题。 1. 先来先服务&#xff08;FCFS&#xff09;调度算法 先来先服务调度算法是最简单的调度方法。其基本原则是&#xff0c;按照进程进入就绪队列的先后次序进行选择。对于进…

常用的调度算法(包含实例)|操作系统

目录 1.先来先服务调度算法&#xff08;FCFS&#xff09;2.优先级调度算法3.最短作业优先调度算法&#xff08;SJF&#xff09;4.最高响应比优先调度算法&#xff08;HRRN&#xff09;5.轮转调度算法&#xff08;RR&#xff09;6.多级反馈轮转调度算法7.实时系统的调度算法 1.先…

几种常见的调度算法

文章目录 1.先来先服务算法&#xff08;FCFS,First Come First Service&#xff09;2.短作业优先算法&#xff08;SJF,Short Job First&#xff09;3.高响应比优先算法4.时间片轮转算法5.优先级调度算法6.多级反馈队列算法 1.先来先服务算法&#xff08;FCFS,First Come First …

videojs播放m3u8格式视频

videojs 是不支持m3u8格式&#xff0c;需要配合videojs-contrib-hls插件 npm install --save video.js npm install --save videojs-contrib-hls 不加muted 刷新时不会自动播放&#xff0c;但是加上就会没有声音了&#xff0c;因为业务不需要声音所以没有影响

一个可以在线播放解析m3u8,mp4的网站 m3u8player.lantianye3.top

自己写的一个可以在线播放m3u8的网页&#xff0c;在这里分享一下。借助m3u8 player网页播放器&#xff0c;只需将您的M3U8文件地址或者mp4链接复制粘贴到播放器地址栏中然后点击播放即可。 网站 http://m3u8player.lantianye3.top/ 如有不足&#xff0c;多多指教。 首页截图&am…

视频工具下载(m3u8、MP4)

下载视频m3u8工具 FFmpeg 转 ts 格式 笔记有点乱 都是一笔带过&#xff08;有链接&#xff09;&#xff0c;可以参考别人教程 1、下载m3u8工具&#xff08;支持win和liunx&#xff09; 下载链接 20201019 &#xff08;都是2020年的&#xff0c;还是可以用&#xff09; 使用…

前端如何播放m3u8格式的视频

m3u8格式的视频是将文件分成一小段一小段的ts文件&#xff0c;播放完一个在播放下一个&#xff0c;由于每次请求的ts文件都很小&#xff0c;所以基本可以做到无延时播放。目前WEB上主流的直播方案主要是HLS和RTMP&#xff0c;移动端主要是HLS&#xff0c;PC端主要是RTMP。 HLS…

如何下载m3u8格式视频

小编记得以前手机流量少的时候&#xff0c;电脑上下课程或电影再存到手机上看还是很容易的 现在虽然这种需求比较少&#xff0c;但还是有一些视频想下载下来&#xff0c;不过却发现下不了了因为很多的视频都不提供下载地址或下载的是加密的视频格式 即使我们能通过工具采集到…

Android m3u8网络视频播放

最近在做 m3u8网络视频播放&#xff0c;踩了不少坑&#xff0c;也试了不少的 框架&#xff0c;特别记录一下其中用的比较多的三种 第一种&#xff1a;media:ijkplayer media:ijkplayer 是由 bilbil 提供的开源的视频 框架&#xff0c;但是由过之后感觉不太好用&#xff1a; …

网页在线视频下载教程(m3u8格式介绍及下载教程)

简介&#xff1a; m3u8文件是苹果公司使用的HTTP Live Streaming&#xff08;HLS&#xff09;协议格式的基础。HLS是新一代流媒体传输协议&#xff0c;其基本实现原理为将一个大的媒体文件进行分片&#xff0c;将该分片文件资源路径记录与m3u8文件&#xff08;即playlist&…

什么是m3u8?

什么是m3u8? ​  m3u8是苹果公司推出的视频播放标准&#xff0c;是m3u8的一种&#xff0c;只是编码格式采用的是UTF-8。 m3u8准确来说是一种索引文件&#xff0c;使用m3u8文件实际上是通过它来解析对应的放在服务器上的视频网络地址&#xff0c;从而实现在线播放。使用m3u8…

M3U8是什么

m3u8是苹果公司推出的视频播放标准&#xff0c;是m3u8的一种&#xff0c;只是编码格式采用的是UTF-8。   m3u8准确来说是一种索引文件&#xff0c;使用m3u8文件实际上是通过它来解析对应的放在服务器上的视频网络地址&#xff0c;从而实现在线播放。使用m3u8格式文件主要因为…