1.先来先服务FCFS

1.1内容概括

在这里插入图片描述

1.2实验及代码

在这里插入图片描述
代码实现

#include<stdio.h> 
#include<stdlib.h>
struct fcfs //ID
{
	char name[20];
	float startime;
	float arrivetime;
	float servicetime;
	float finishtime;
	float zztime; //周转时间 
	float dqzztime; // 平均周转时间 
};
void input(fcfs *p,int N)//输入进程相关信
{
	printf("请输入进程的名字 到达时间  服务时间:(比如:进程1 0 10)\n");
	for(int i=1;i<=N;i++)
	{
		printf("请输入进程%d的信息:\n", i);//i的初始值设为1,这样方便表示 
		printf("Process ID: ");
		scanf("%s",p[i-1].name);
		printf("Arrival Time: ");
		scanf("%f",&p[i-1].arrivetime);
		printf("Service Time: ");
		scanf("%f",&p[i-1].servicetime);
		printf("\n"); 
	 } 
	 
 }
 
void sort(fcfs *p,int N){
 	int i,j;
	for(i=0;i<N-1;i++)
	{
		for(j=0;j<N-i-1;j++)
		{
			if(p[j].arrivetime>p[j+1].arrivetime)
			{
				fcfs temp;
				temp=p[j];
				p[j]=p[j+1];
				p[j+1]=temp;
			}
		}
	}
 }
 void run(fcfs *p,int N){
 	int i; 
 	for(i=0;i<N;i++)
 	{
 		if(i==0){
 			p[i].startime=p[i].arrivetime;
 			p[i].finishtime=p[i].arrivetime+p[i].servicetime;
 			//周转时间=要求服务时间+等待时间
			p[i].zztime=p[i].servicetime;
			//其他进程:p[i].zztime=p[i].finishtime-p[i].arrivetime;
			p[i].dqzztime=p[i].zztime/p[i].servicetime;
		 }else{
		 	p[i].startime=p[i-1].finishtime;
		 	p[i].finishtime=p[i].startime+p[i].servicetime;
		 	p[i].zztime=p[i].finishtime-p[i].arrivetime;
		 	p[i].dqzztime=p[i].zztime/p[i].servicetime;

		 }
	 }
 }
 
 void show(fcfs *p,int N) {
 	int i;
 	printf("调用先来先服务算法后进程的运行顺序为:\n");
	for(i=0;i<N;i++){
	 	printf("%s",p[i].name);
	 	printf("---->");
	 } 
	 printf("\n");
	 printf("具体的进程调度信息为\n"); 
	 printf("进程 到达时间 服务时间 周转时间 ....\n");
	for(i=0;i<N;i++){
		printf("%3s",p[i].name);
		printf("%8.3f",p[i].arrivetime);
		printf("%8.3f",p[i].servicetime);
		printf("%8.3f",p[i].zztime);
		printf("\n");
	}
	 
 }
 
int main()
{
 	fcfs a[100]; //创建100个结构体 
 	int N; //进程数量
    printf("请输入进程数目");
	scanf("%d",&N);
	input(a,N);
	sort(a,N);
	run(a,N);
	show(a,N);
	int i;
	float average_zztime=0;
	float average_dqzztime=0;
	for(i=0;i<N;i++){
		average_zztime+=a[i].zztime;
		average_dqzztime+=a[i].dqzztime;
	}
	average_zztime/=N;
	average_dqzztime/=N;
	printf("采用FCFS算法算得平均周转时间为:%f",average_zztime);
	printf("采用FCFS算法算得平均带权周转时间为:%f",average_dqzztime);
	return 0;
	printf("实验一:FCFS算法");
}

在这里插入图片描述

2.短作业优先SJF

2.1内容概括

在这里插入图片描述

2.2实验及代码

在这里插入图片描述

代码实现

#include<stdio.h> 
#include<stdlib.h>
struct sjf //ID
{
	char name[20]; 
	float startime;//进程开始时间 
	float arrivetime;//进程到达时间 
	float servicetime;//进程执行时间 
	float finishtime;//进程完成时间 
	float zztime; //周转时间 
	float dqzztime; // 平均周转时间 
};
void input(sjf *p,int N)//输入进程相关信
{
	printf("请输入进程的名字 到达时间  服务时间:(比如:进程1 0 10)\n");
	for(int i=1;i<=N;i++)
	{
		printf("请输入进程%d的信息:\n", i);//i的初始值设为1,这样方便表示 
		printf("Process ID: ");
		scanf("%s",p[i-1].name);
		printf("Arrival Time: ");
		scanf("%f",&p[i-1].arrivetime);
		printf("Service Time: ");
		scanf("%f",&p[i-1].servicetime);
		printf("\n"); 
	 } 
 }
void sort_arrivetime(sjf *p,int N){//对所有进程按照到达时间进行排序 
 	int i,j;
 	sjf temp;
	for(i=0;i<N-1;i++)
	{
		for(j=0;j<N-i-1;j++)
		{
			if(p[j].arrivetime>p[j+1].arrivetime)
			{
				temp=p[j];
				p[j]=p[j+1];
				p[j+1]=temp;
			}
		}
	}
 } 
void sort_servicetime(sjf *p,int N)//对start到i之间的进程进行排序 
{
    sjf temp;//创建一个零时进程,便于后期排序时进行交换 
    int k=0;
	float end=0.0;//保存cpu已经运行的时间 
 	for(int i=0;i<N;i++){
			k=i;//保存当前i的下表 
			while(p[i].arrivetime<=end&&i<N)//对从第i个之后的所有进程进行搜索 
					 i++;//找到最后一个等待进程的下标(其实就是当前在等待的最后一个进程)			
			for (int t=k; t<i; t++)//对当前正在等待执行的进程按照服务时间排序 
     		{
          		for (int j = k+1; j<i; j++)
         			{
               			if(p[t].servicetime < p[j].servicetime)
                  			  continue;
              			 else
              			 {
		                    temp = p[t];
		                    p[t] = p[j];
		                    p[j] = temp;
               			}
          			}
     		}			
			i=k; //将i的下标还原 
			end+=p[i].servicetime;
		}
}
 
 void run(sjf *p,int N){
 	int i; 
 	for(i=0;i<N;i++)
 	{
 		if(i==0){
 			p[i].startime=p[i].arrivetime;
 			p[i].finishtime=p[i].arrivetime+p[i].servicetime;
 			//周转时间=要求服务时间+等待时间
			p[i].zztime=p[i].servicetime;
			//其他进程:p[i].zztime=p[i].finishtime-p[i].arrivetime;
			p[i].dqzztime=p[i].zztime/p[i].servicetime;
		 }else{
		 	p[i].startime=p[i-1].finishtime;
		 	p[i].finishtime=p[i].startime+p[i].servicetime;
		 	p[i].zztime=p[i].finishtime-p[i].arrivetime;
		 	p[i].dqzztime=p[i].zztime/p[i].servicetime;

		 }
	 }
 }
 
 void show(sjf *p,int N) {
 	int i;
 	printf("调用先来先服务算法后进程的运行顺序为:\n");
	for(i=0;i<N;i++){
	 	printf("%s",p[i].name);
	 	printf("---->");
	 } 
	 printf("\n");
	 printf("具体的进程调度信息为\n"); 
	 printf("进程 到达时间 服务时间 周转时间 ....\n");
	for(i=0;i<N;i++){
		printf("%3s",p[i].name);
		printf("%8.3f",p[i].arrivetime);
		printf("%8.3f",p[i].servicetime);
		printf("%8.3f",p[i].zztime);
		printf("\n");
	}
	 
 }
 
int main()
{
 	sjf a[100]; //创建100个结构体 
 	int N; //进程数量
    printf("请输入进程数目");
	scanf("%d",&N);
	input(a,N);//输入每个进程的信息 
	sort_arrivetime(a,N);//对所有进程按到达时间排序 
	sort_servicetime(a,N);//对当前的等待进程按照服务时间排序 
	run(a,N);//排好顺序之后,开学运行,计算结果 
	show(a,N);//展示结果 
	int i;
	float average_zztime=0;
	float average_dqzztime=0;
	for(i=0;i<N;i++){
		average_zztime+=a[i].zztime;
		average_dqzztime+=a[i].dqzztime;
	}
	average_zztime/=N;
	average_dqzztime/=N;
	printf("采用FCFS算法算得平均周转时间为:%f",average_zztime);
	printf("采用FCFS算法算得平均带权周转时间为:%f",average_dqzztime);
	return 0;
	printf("实验一:SJF算法");
}

SJF算法的代码是在FCFS代码的基础上实现的,增加了一个方法,将等待状态的进程按照服务时间进行排序。这样就可以保证下一个运行的是服务时间最短的等待进程
在这里插入图片描述

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐