先来先服务调度算法(C语言代码实现) 大三操作系统实验

这篇具有很好参考价值的文章主要介绍了先来先服务调度算法(C语言代码实现) 大三操作系统实验。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

实验原理:

先来先服务(First Come First Served,FCFS),是一种简单的调度算法,它既适用于作业调度,也适用于进程调度。先来先服务算法是按照作业或进程的到达先后次序来进行调度。当作业调度中采用该算法时,每次调度都是从后备队列中选择一个最先进入该队列中作业,将它调入内存,为其创建进程、分配相应的资源,将该作业的进程放入就绪队列。在进程调度中采用该算法时,每次调度是从就绪队列中选择一个最新进入该队列的进程,并给他分配处理机。

实验内容:

按作业提交的/到达的(到达后备队列的时间)先后次序从外存后备队列中选择几个最先进入该队列的作业为他们分配资源、创建进程,然后再放入就绪队列。 

每个作业由一个作业控制块JCB表示,JCB可以包含如下信息∶作业名、提交时间、所需的运行时间、作业状态等等。

作业的状态可以是等待W(Wait)、运行R(Run)和完成F(Finish)三种状态之一。每个作业的最初状态总是等待W。各个等待的作业按照提交时刻的先后次序排队。

每个作业完成后要输出该作业的开始运行时刻、完成时刻、周转时间和带权周转时间,这一组作业完成后计算并输出这组作业的平均周转时间、平均带权周转时间。

#include <iostream>
#include <string.h>
#include <iomanip>

struct job
{
    char name[10];      //作业的名字
    int starttime;      //作业到达系统时间
    int needtime;       //作业服务时间
    int runtime;        //作业周转时间
    int endtime;        //作业结束时间
    int flag=0;           //作业完成标志   
	char state='W'; 		//作业状态,一开始都默认为就绪 
	double dqzz_time;    //带权周转时间
};

void fcfs(struct job jobs[50],int n){
   int i=0,j=0,sum=1;
   char t_name[10];
   int t_time;            
   for(i=0;i<n;i++) //按作业到达系统时间进行排序,最早到达的排在最前面 
	  {
		  for(j=i;j<n;j++) //按作业到达系统时间进行排序,最早到达的排在最前面 
		  {
			  if(jobs[j].starttime<jobs[i].starttime)
			  {   //把到达时间早的赋值到t_time
				  t_time=jobs[j].starttime;
				  jobs[j].starttime=jobs[i].starttime;
				  jobs[i].starttime=t_time;
				  //把到达时间早的赋值到t_time
				  t_time=jobs[j].needtime;
				  jobs[j].needtime=jobs[i].needtime;
				  jobs[i].needtime=t_time;
				  strcpy(t_name,jobs[j].name);
				  strcpy(jobs[j].name,jobs[i].name);
				  strcpy(jobs[i].name,t_name);//在t_name数组中排序
			  }
		  } 
	  }
	int nowtime=0;//系统时间 
	for(i=0;i<n;i++){
		if(nowtime<jobs[i].starttime){
			nowtime=jobs[i].starttime;
		}
		jobs[i].state='R';
    	jobs[i].endtime=nowtime+jobs[i].needtime;
		jobs[i].runtime=jobs[i].endtime-jobs[i].starttime;
		jobs[i].dqzz_time=double(jobs[i].runtime)/jobs[i].needtime;
		nowtime=jobs[i].endtime;
		jobs[i].state='F';		
	} 
}

 
void print(struct job jobs[50],int n)
{
    int i;
    double avertime;
    double dqzz_avertime;
    int sum_runtime=0;
    double  sum_time=0.00;
    printf("作业名  到达时间 运行时间 完成时间 周转时间 带权周转时间\n");
    for(i=0;i<n;i++)
    {
    printf("%s       %2d        %2d       %2d        %2d        %.2f\n",jobs[i].name,jobs[i].starttime,jobs[i].needtime,jobs[i].endtime,jobs[i].runtime,jobs[i].dqzz_time);
    
    sum_runtime=sum_runtime+jobs[i].runtime;
    sum_time=sum_time+jobs[i].dqzz_time;
    }
    avertime=sum_runtime*1.0/n;
    dqzz_avertime=sum_time*1.000/n;
    printf("平均周转时间:%.2f \n",avertime);
    printf("平均带权周转时间:%.3f \n",dqzz_avertime);
    printf("\n");
}

int main()
{
    struct job jobs[50];
    int n,i; //n个作业
    printf("请输入作业个数:");
    scanf("%d",&n);
    printf("请输入各作业的信息(格式:作业名 到达时间 服务时间):\n");
    for(i=0;i<n;i++)
    {
        scanf("%s",jobs[i].name); //作业名
        scanf("%d",&jobs[i].starttime);//到达时间
        scanf("%d",&jobs[i].needtime);//运行(服务时间)时间
    }
    printf("\n");
	fcfs(jobs,n);
	printf("先来先服务(FCFS)调度算法运行结果:\n");
	print(jobs,n);
	
}

结果:

先来先服务算法代码,操作系统,算法,c语言,c++

运行流程

nowtime 0 1 2 3 4 5 6 7 8 9 10 11 12 13
wait B BD DE DE DE DE E E E E
run A C C C B B B B D D D D E
finish A A A AC AC AC AC ACB ACB ACB ACB ACBD ACBDE

需要提出的一点,这个调度算法的调度过程是先找作业或者进程中最先到来的那一个,也就是说,这个是看到达时间的,到达时间越早,则最先进行调度,值得注意的是,此调度算法是服务完一个作业或进程后,再服务下一个作业或者进程

优点:公平、算法实现简单
缺点:排在长作业(进程)后面的短作业需要等待很长时间,带权周转时间很大,对短作业来说用户体验不好,比如下面的P3进程,带权周转时间为8s,但是它只需要1s即可运行完成,即FCFS算法对长作业有利,对短作业不利,此外不利于I/O繁忙的作业

所谓的CPU繁忙,是指的这项作业的CPU计算部分的时间需要占用大量的时间,很少请求I/O。对应于I/O繁忙,那就是这项作业很是频繁的请求I/O,但是真正用于计算的时间却是不多,因此可以认为CPU繁忙的作业更接近于长作业的工作方式,因为它长时间占用了CPU,I/O繁忙更接近于短作业的工作方式

若进程是CPU繁忙型,则一旦占有CPU,就可能会运行很长时间,因此CPU繁忙型作业类似于长作业,FCFS算法对长作业有利。而对于I/O繁忙型作业,运行进程中要频繁访问I/O端口,即可能频繁放弃CPU,所以占用CPU的时间不会太长,一旦放弃CPU,则必须等待下次调度,因此FCFS算法不利于它。

具体关于I/O繁忙可以参考

《计算机操作系统》——调度算法_热衷做分母的博客-CSDN博客_i/o繁忙型适合什么调度算法文章来源地址https://www.toymoban.com/news/detail-853412.html

到了这里,关于先来先服务调度算法(C语言代码实现) 大三操作系统实验的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【操作系统】基于动态优先级的进程调度算法-C语言实现(有代码)

    本文章将会介绍如何编写动态优先级的进程调度算法,并使用从语言实现。 一、什么是动态优先级的调度算法        进程运行一个时间片后,如果进程已占用 CPU时间已达到所需要的运行时间,则撤消该进程;如果运行一个时间片后进程的已占用CPU时间还未达所需要的运行

    2024年02月06日
    浏览(50)
  • 操作系统:用C语言实现FCFS(先来先服务),SJF(短作业抢占)和RR(时间片轮转,时间片=1)

       加深对进程调度的理解,熟悉进程调度的不同算法,比较其优劣性。 假如一个系统中有5个进程,它们的到达时间内如表1所示,忽略I/O以及其他开销时间。若分别按先来先服务(FCFS)、抢占的短作业优先(SJF)、时间片轮转(RR,时间片=1)进行CPU调度,请按照上述三个

    2024年02月04日
    浏览(58)
  • 操作系统之FCFS - 先来先服务算法

    先来先服务调度算法是最简单的调度方法。 基本原则:按照进程进入就绪队列的先后次序进行选择。对于进程调度来说, 一旦一个进程得到处理机,它就一直运行下去,直到该进程完成任务或者因等待某事件而不能继续运行,才会让出处理机 。先来先服务调度算法属于非剥

    2024年02月08日
    浏览(50)
  • 磁盘调度算法之先来先服务(FCFS),最短寻找时间优先(SSTF),扫描算法(SCAN,电梯算法),LOOK调度算法

    寻找时间(寻道时间) Ts:在读/写数据前,将磁头移动到指定磁道所花的时间。 ① 启动磁头臂 是需要时间的。假设耗时为s; ② 移动磁头 也是需要时间的。假设磁头匀速移动,每跨越一个磁道耗时为m,总共需要跨越n条磁道。 则寻道时间 T s = s + m ∗ n Ts =s + m*n T s = s + m ∗

    2024年02月08日
    浏览(47)
  • 操作系统进程调度算法(c语言模拟实现)

            前言: 本文旨在分享如何使用c语言对操作系统中的部分进程调度算法进行模拟实现,以及算法描述的讲解, 完整代码放在文章末尾,欢迎大家自行拷贝调用 目录 常见的调度算法 数据结构 先来先服务调度算法 算法模拟思路: 算法模拟:  最短作业优先调度算法

    2024年02月06日
    浏览(55)
  • 操作系统进程调度算法的模拟实现(c语言版本)

            前言: 本文旨在分享如何使用c语言对操作系统中的部分进程调度算法进行模拟实现,以及算法描述的讲解, 完整代码放在文章末尾,欢迎大家自行拷贝调用 目录 常见的调度算法 数据结构 先来先服务调度算法 算法模拟思路: 算法模拟:  最短作业优先调度算法

    2024年02月06日
    浏览(55)
  • 操作系统实验一模拟优先级调度算法(C语言实现附带详细注释)

    文章目录 优先级调度算法介绍 两种情况 调度算法分类 优先级分类 实验内容与要求 实验步骤 调度算法总流程图  优先级调度算法流程图  实验代码 实验结果         优先级调度算法既可以用于作业调度,又可以用于进程调度。该算法中的优先级用于描述作业或者进程的

    2024年02月01日
    浏览(52)
  • 操作系统实验——处理机调度算法(C语言)

    目录 实验要求 代码实现 运行结果 代码解析   1、设定系统中进程数,每一个进程用一个进程控制块表示。 2、输入每个进程的“优先数”和“要求运行时间”。 3、为了调度方便,将进程按给定的优先数从大到小连成就绪队列。用一单元指出队列首进程 4、处理机调度总是选

    2023年04月27日
    浏览(42)
  • 用代码模拟操作系统进程调度算法(Python)

     引言 近日,在学习完操作系统的进程调度部分后,我萌生了一个有趣的想法:通过编写代码来模拟进程调度算法,以加深自己对这一知识点的理解。于是,我花了一整天的时间投入到了这个突发奇想的实践中。  背景 进程调度是操作系统中的重要概念,它决定了如何合理地

    2024年02月06日
    浏览(55)
  • 【操作系统】c语言--进程调度算法(FCFS和SPN)

    创作不易,本篇文章如果帮助到了你,还请点赞 关注支持一下♡𖥦)!! 主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步! 🔥c++系列专栏:C/C++零基础到精通 🔥 给大家跳段街舞感谢支持!ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ c语言内容💖:

    2024年02月12日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包