操作系统:FCFS调度算法简单实现(c++)


操作系统:FCFS调度算法简单实现


  1. 由于本人(小白一个)一直以来想要写博客,加上最近学习操作系统,为了巩固自己的学习成果以及加深印象,现在决定开始写博客,可以说这是我的第一篇博客。
  2. 这篇文章主要描述的计算机操作系统的FCFS(先来先服务)的调度算法,可以用在进程调度和作业调度中。它的基本思想是按进程或作业到达的时间先后顺序进行调度。
  3. 下面就详细讲下本小白实现此简单算法的基本功能,过程以及思想。
    基本功能:
    1、输出每个进程的调度时间表
    2、上一个进程结束前,下一个进程还没有到达,程序计算周转时间仍然正确
    3、进程可以不按到达时间大小排列输入,输出的调度时间表依然正确

首先我们得知道进程是怎么构造的,在这篇文章中我是以结构体数组的形式来构造多个进程,结构体里的各个成分分别表示进程的基本信息,数组的大小为常数 5。
以下是我的进程具体构造:

struct  PCB
{
     char name[8];     //进程名称
     int  arrive_time;  //到达时间
     int  run_time;   //运行时间
     int finish_time;    //完成时间
     int  zhouzhuan_time;    //周转时间
     float daiquan_time;      // 带权周转时间
};
#define  N  5
struct PCB pcb[N],temp;

输入进程功能:自定义一个输入函数,设置for循环语句,循环输入,很容易实现


void input()
{
    int i;
 cout<<"--------------------------------------"<<endl;
 cout<<"             FCFS调度算法     "<<endl;
    cout<<"--------------------------------------"<<endl;
 cout<<"      输入五个进程信息:"<<endl;
 for ( i=0;i<N;i++)
 {
  printf("请输入进程名:\n" );
        scanf("%s",pcb[i].name);
  printf("请输入到达时间:");
  scanf("%d",&pcb[i].arrive_time);
  printf("请输入要运行时间:");
  scanf("%d",&pcb[i].run_time);  
 }
 cout<<"各进程:"<<endl;
 for( i=0;i<N;i++)
 {    printf("%s    ",pcb[i].name);
        printf("%d    ",pcb[i].arrive_time);
  printf("%d \n",pcb[i].run_time);
    }
}

要实现进程无需按到达时间先后输入,则需要将输入的进程按照到达时间先后进行排序,然后计算各个进程的各个时间。这里我设置了一个排序自定义函数。

void sort()//按照到达时间对进程进行排序 
{
 for(int i=0;i<N-1;i++)
 {
  for(int j=i+1;j<N;j++)
  {
   if(pcb[i].arrive_time>pcb[j].arrive_time)
   {
    temp=pcb[i];
    pcb[i]=pcb[j];
    pcb[j]=temp;
   }
  }
 } 
}

输出调度时间顺序时间表则设置一个进程输出函数,具体实现如下:

	void  output()
{   
	int i;
	cout<<"FCFS调度算法:"<<endl;
    	pcb[0].finish_time=pcb[0].arrive_time+pcb[0].run_time;
     	pcb[0].zhouzhuan_time=pcb[0].finish_time-pcb[0].arrive_time;
		pcb[0].daiquan_time=(float)pcb[0].zhouzhuan_time/pcb[0].run_time;
  	for(i=1;i<N;i++)
	{	 
	 	if(pcb[i].arrive_time>pcb[i-1].finish_time)  //如果下一个进程在上一个进程完成后到达,则用以下算法计算调度时间
		{
              pcb[i].finish_time=pcb[i].arrive_time+pcb[i].run_time;
              pcb[i].zhouzhuan_time=pcb[i].run_time;
              pcb[i].daiquan_time=(float)pcb[i].zhouzhuan_time/pcb[i].run_time;
		}
		else       //下一个进程在上一个进程结束前就已经到达
		{
            pcb[i].finish_time=pcb[i-1].finish_time+pcb[i].run_time;
            pcb[i].zhouzhuan_time=pcb[i].finish_time-pcb[i].arrive_time;
			pcb[i].daiquan_time=(float)pcb[i].zhouzhuan_time/pcb[i].run_time;
		}
    	
	}  

	for(i=0;i<N;i++)
		{
			sumzhouzhuantime+=pcb[i].zhouzhuan_time;
			sumdaiquanzhouzhuantime+=pcb[i].daiquan_time;
		}

    printf("----------------------------------------------------------------\n");
    printf("进程名   到达时间  运行时间  完成时间  周转时间    带权周转时间  \n");
	printf("----------------------------------------------------------------\n");
    for(i=0;i<N;i++)
	{
	  	printf(" %s        %d         %d         %d         %d         %.2f\n",pcb[i].name,pcb[i].arrive_time,pcb[i].run_time,pcb[i].finish_time,pcb[i].zhouzhuan_time,pcb[i].daiquan_time);

	}
	cout<<"平均周转时间:"<<sumzhouzhuantime/N<<endl;     //定义一个全局变量(总的进程的周转时间)/进程数
	cout<<"平均带权周转时间:"<<sumdaiquanzhouzhuantime/N<<endl;    //总的进程的带权周转时间/进程数
    printf("----------------------------------------------------------------\n");
}

到这就大功告成了,在主函数中执行这些函数就行了。
下面是总的代码(方便大家学习):


#include<iostream>
using namespace std;
#define  N  5
struct  PCB
{
	char name[8];
	int  arrive_time;
	int  run_time;
    int finish_time;
	int  zhouzhuan_time;
	float daiquan_time;
};

float sumzhouzhuantime,sumdaiquanzhouzhuantime;
struct PCB pcb[N],temp;

void input();  //输入进程
void sort();      //对输入的进程按到达时间进行排序执行
void output();   //输出算法调度时间表

void  main()
{   
    input();
	sort( );
	output();
}

void input()
{
    int i;
	cout<<"--------------------------------------"<<endl;
	cout<<"             FCFS调度算法     "<<endl;
    cout<<"--------------------------------------"<<endl;
	cout<<"      输入五个进程信息:"<<endl;
	for ( i=0;i<N;i++)
	{
		printf("请输入进程名:\n" );
        scanf("%s",pcb[i].name);
		printf("请输入到达时间:");
		scanf("%d",&pcb[i].arrive_time);
		printf("请输入要运行时间:");
		scanf("%d",&pcb[i].run_time);		
	}
	cout<<"各进程:"<<endl;
	for( i=0;i<N;i++)
	{  		printf("%s    ",pcb[i].name);
        printf("%d    ",pcb[i].arrive_time);
		printf("%d \n",pcb[i].run_time);
    }
}

void sort()//按照到达时间对进程进行排序 
{
	for(int i=0;i<N-1;i++)
	{
		for(int j=i+1;j<N;j++)
		{
			if(pcb[i].arrive_time>pcb[j].arrive_time)
			{
				temp=pcb[i];
				pcb[i]=pcb[j];
				pcb[j]=temp;
			}
		}
	} 
}

void  output()
{   
	int i;
	cout<<"FCFS调度算法:"<<endl;
    	pcb[0].finish_time=pcb[0].arrive_time+pcb[0].run_time;
     	pcb[0].zhouzhuan_time=pcb[0].finish_time-pcb[0].arrive_time;
		pcb[0].daiquan_time=(float)pcb[0].zhouzhuan_time/pcb[0].run_time;
  	for(i=1;i<N;i++)
	{	 
	 	if(pcb[i].arrive_time>pcb[i-1].finish_time)
		{
              pcb[i].finish_time=pcb[i].arrive_time+pcb[i].run_time;
              pcb[i].zhouzhuan_time=pcb[i].run_time;
              pcb[i].daiquan_time=(float)pcb[i].zhouzhuan_time/pcb[i].run_time;
		}
		else
		{
            pcb[i].finish_time=pcb[i-1].finish_time+pcb[i].run_time;
            pcb[i].zhouzhuan_time=pcb[i].finish_time-pcb[i].arrive_time;
			pcb[i].daiquan_time=(float)pcb[i].zhouzhuan_time/pcb[i].run_time;
		}
    	
	}  

	for(i=0;i<N;i++)
		{
			sumzhouzhuantime+=pcb[i].zhouzhuan_time;
			sumdaiquanzhouzhuantime+=pcb[i].daiquan_time;
		}

    printf("----------------------------------------------------------------\n");
    printf("进程名   到达时间  运行时间  完成时间  周转时间    带权周转时间  \n");
	printf("----------------------------------------------------------------\n");
    for(i=0;i<N;i++)
	{
	  	printf(" %s        %d         %d         %d         %d         %.2f\n",pcb[i].name,pcb[i].arrive_time,pcb[i].run_time,pcb[i].finish_time,pcb[i].zhouzhuan_time,pcb[i].daiquan_time);

	}
	cout<<"平均周转时间:"<<sumzhouzhuantime/N<<endl;
	cout<<"平均带权周转时间:"<<sumdaiquanzhouzhuantime/N<<endl;
    printf("----------------------------------------------------------------\n");
}

运行结果如下:
五个进程的无序输入
这段程序有个问题不能实现任意数量进程的输入,不就我就会更新。
小白还在学习阶段,有很多问题,希望大家能够指出,谢谢大家,一起加油!

  • 33
    点赞
  • 125
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值