1.实现四种不同及进程调度算法:

先来先服务、时间片轮转调、优先级调度以及短作业优先调度算法。

2.通过实验理解有关进程控制块,进程队列等的概念。

1.运行素材中的代码,观察其执行结果是否正确?各个调度算法的功能是否完善?如果没有,则完善。

2. 按照下表输入3个作业信息,输出使用不同调度算法的结果。

3. 在现有三个调度算法的基础上,进一步实现短作业优先调度

ProcessID

arrivetime

servicetime

priority:

1

1

9

2

2

4

6

3

3

6

3

1

  参数表格2     

ProcessID

arrivetime

servicetime

priority:

1

1

2

2

2

7

2

4

3

5

7

1

4

9

1

3

说明:

  1. 主程序中从键盘得到进程的数量,创建PCB,调用layout()函数显示选择界面。
  2. Layout()函数中选择相应的算法并调用相关函数如:FCFS(),最后打印。

一 设计有N个进程并发的调度算法

   进程调度算法:每个进程有一个进程控制块(PCD)表示。进程控制块下包含:进程ID,         优先级,到达时间,需要运行时间等。

二  在linux系统上输入程序,调试,编译

三  设计输入数据,选择不同的进程调度算法,打印执行结果

四  根据实验要求,填写实验报告

-----贴几张调用算法图,加自己写的一些简单分析

  1. 选择FSFS算法结果

  1. 结果分析:调用先来先服务算法,1号进程先来于是先执行1号,处理机开始时间是1,加上1号服务时间于是结束为10;2号进程来的时间为4,比3号早,于是先执行2号,执行完后时间为16,;最后执行3号,执行完时间为19.

  • 2-调用timesegment算法结果

  • 2-结果分析:调用时间片轮转算法,本例中设置时间片长度为3,1号进程先来,时间为1时候开始,先执行3,然后2来,再执行3,然后3已结到了,再执行3,此时为10,3号进程执行完毕。之后1号和2号轮流执行一个时间片的时间,最后2号执行完为16,1号执行完为19.

  • 3-调用priority算法结果

  • 3-实验结果分析:调用优先级非抢占式进程算法,1号进程先来,于是先执行1号,从1开始,执行9,  1号结束后为10,之后2号进程的优先级比3号高,执行完2号后为16;之后执行3号,结果为19.

  • 4-调用SJF算法结果

  • 4-结果分析:调用非抢占式短作业优先算法,一号进程先来,执行完后为10;然后比较2号和3号,3号的运行时间短,先执行3号,执行完为13,;最后执行完2号,执行完为19.

参考代码:

#include<stdio.h>
#include<malloc.h>
#include <stdbool.h>
#include<stdlib.h>
#define max 50

struct PCB
{
	int name;
	int arrivetime; //到达时间
	int servicetime; //服务时间
	//int starttime[max]; //开始时间
    int finishtime; //完成/结束时间
    int turntime; //周转时间
    int average_turntime; //带权周转时间
	int sign; //标志进程是否完成
	int remain_time; //剩余时间
	int priority;  //优先级
}pcb[max];

void init(int n)  //初始化
{ int i;
	for(i=0;i<n;i++)
	{
		pcb[i].arrivetime=0; 
		pcb[i].servicetime=0; 
	    //pcb[i].starttime=0; 
	    pcb[i].finishtime=0; 
	    pcb[i].turntime=0;
	    pcb[i].average_turntime=0;
		pcb[i].remain_time=0;
		pcb[i].sign=0;
		pcb[i].priority=0;
	}
}
void creat(int n) //创建PCB
{
	int i;
	for(i=1;i<=n;i++)
	{
		printf("\n%d:\n input the information of process\n input processID:",i);
		scanf("%d",&pcb[i].name);
		printf("input the arrivetime:");
		scanf("%d",&pcb[i].arrivetime);
		printf("input the servicetime:");
		scanf("%d",&pcb[i].servicetime);
		printf("input the priority:");
		scanf("%d",&pcb[i].priority);
		pcb[i].remain_time=pcb[i].servicetime;  //初始化剩余时间为服务时间
	}
}

void FCFS(int n) //先来先服务
{
	int starttime;
	printf("input the start time:\n");
	scanf("%d",&starttime);
	if(starttime>=pcb[1].arrivetime)
	{
		pcb[1].finishtime=pcb[1].servicetime+starttime;
	}
	else
	{
		pcb[1].finishtime=pcb[1].arrivetime+ pcb[1].servicetime;
	}
         int i;
         pcb[1].turntime=pcb[1].finishtime-pcb[1].arrivetime;
	pcb[1].average_turntime=pcb[1].turntime/pcb[1].servicetime;
	for(i=1;i<n;i++)
	{
		if(pcb[i].finishtime>pcb[i+1].arrivetime)
		pcb[i+1].finishtime=pcb[i].finishtime+pcb[i+1].servicetime;
		else
			pcb[i+1].finishtime=pcb[i+1].arrivetime+pcb[i+1].servicetime;
		pcb[i+1].turntime=pcb[i+1].finishtime-pcb[i+1].arrivetime;
		pcb[i+1].average_turntime=pcb[i+1].turntime/pcb[i+1].servicetime;
	}
}

void print_FCFS(int n)
{
		//printf("ProcessID, arrivetime\t Servicetime\t finishtime\t turntime\t:,,%s\t%d\t%d\t%d\t%d\t%d\t"); //进程名,到达时间,服务时间,完成时间,周转时间,周转时间
	printf("process ID  arrivetime servicetime finishtime turntime , averageturntime  .\n");
         int i;
	for(i=1;i<=n;i++)
	{
		printf("%d  ,%d  ,%d  ,%d  ,%d  ,%d  ",pcb[i].name  ,pcb[i].arrivetime  ,pcb[i].servicetime  ,pcb[i].finishtime  ,pcb[i].turntime  ,pcb[i].average_turntime);
		printf("\n");
	}

}
void time_segment(int n) //时间片轮转
{
	int i,j;
	int T;   //时间片
	int flag=1;   //就绪队列中是否还有进程,0为没进程,1为有进程
	//int time=pcb[0].arrivetime;   //当前的时间
	int time=0;
	int sum=0;   //已经完成的进程数

	//按各进程的arrivetime进行升序排列
	for(i=1;i<=n;i++)
	for(j=i+1;j<=n;j++)  
	{
		if(pcb[j].arrivetime<pcb[i].arrivetime)
		{
			pcb[0]=pcb[j];
			pcb[j]=pcb[i];
			pcb[i]=pcb[0];	
		}
	}
	// 新加上的
	time=pcb[1].arrivetime;
	    //printf("output the sort result:\n");
		//for(i=1;i<=n;i++)    //检查排序是否正确
     	//printf("%d\t",pcb[i].name);
	printf("input the slicetime:\n");
	scanf("%d",&T);
	//printf("\n running processID runtime resttime finishtime\n”) //  开始运行时间   运行时间   剩余服务时间   结束时间

	while(sum<n) 
	{
		flag=0;   //当前就绪队列中没有进程
		int i;
                for(i=1;i<=n;i++)
		{
          //标志进程是否完成
			if(pcb[i].sign==1) continue; //表示该进程已完成
			else
			{


	           //没有完成的进程需要的时间大于一个时间片
				if(pcb[i].remain_time > T)
				{
					flag=1;
				if(time<pcb[i].arrivetime)
				time=pcb[i].arrivetime;
				else{
				time=time+T;
				}	
					
                 // remain是剩余时间
					pcb[i].remain_time=pcb[i].remain_time-T;
          
					//printf("%10d%16d%12d%12d%12d\n",pcb[i].name,time-T,T,pcb[i].remain_time,time);
				}

				//没有完成的进程需要的时间小于或等于一个时间片
				else if(pcb[i].remain_time <= T)
				{
					flag=1;  //加入就绪队列
					if(time<pcb[i].arrivetime)
				time=pcb[i].arrivetime;
					time=time+pcb[i].remain_time;
					pcb[i].finishtime=time;
                    pcb[i].sign=1;
					//printf("%10d%16d%12d%12d%12d\n",pcb[i].name,time-pcb[i].remain_time,pcb[i].servicetime,0,time); 
		 	        pcb[i].remain_time=0;
				}
				
				if(pcb[i].sign==1) sum++;
			}

		}//for


	if(flag==0&&sum<n)   // 还有没执行的进程,且没进入就就绪队列 
	{
        int i;
	for(i=1;i<=n;i++)
	if(pcb[i].sign==0) {time=pcb[i].arrivetime;break;}
	}


	}//while

}
void print_time(int n)
{       int i;
	for(i=0;i<n;i++)
	{
	printf("\n processID servicetime finishtime\n");  //进程名   服务时间   完成时间
	printf("%6d%10d%10d",pcb[i+1].name,pcb[i+1].servicetime,pcb[i+1].finishtime);
	printf("\n");
	}
}

void Priority(int n)
{
	int i,j;
	int time = pcb[1].arrivetime;
	//按各进程的arrivetime进行升序排列,最早到达的进程先执行
	for(i=1;i<=n;i++)
	for(j=i+1;j<=n;j++)  
	{
		if(pcb[j].arrivetime < pcb[i].arrivetime)
		{
			pcb[0]=pcb[j];
			pcb[j]=pcb[i];
			pcb[i]=pcb[0];	
		}
	}
	
	    //printf("output the sort result: \n"); //输出排序结果
	    //for(i=1;i<=n;i++)    //检查排序是否正确
     	//printf("%d\t",pcb[i].name);

	printf("\n processID runtime priority fihishtime \n");//进程名   服务时间   优先级  完成时间
	//先到达的进程第一个执行
	if(i=1)
	{
		pcb[i].finishtime=pcb[i].arrivetime + pcb[i].servicetime;
		time =pcb[i].arrivetime + pcb[i].servicetime;
		printf("%6d%10d%10d%10d",pcb[i].name,pcb[i].servicetime,pcb[i].priority,pcb[i].finishtime);
		printf("\n");
		//测试第一个进程输出正确
	/*	printf("output the first process:\n");//输出第一个程序的
		printf("processID arrivetime finishtime\n");//名称  到达时间  完成时间
		printf("%4d%8d%8d",pcb[i].name,pcb[i].arrivetime,pcb[i].finishtime);
		printf("\n"); */
		i++; 
	}
	
	

/*
	//按各进程的priority进行降序排列,优先级最高的进程先执行
	for(i=2;i<=n;i++)
	for(j=i+1;j<=n;j++)  
	{
		if(pcb[j].priority > pcb[i].priority)
		{
			pcb[0]=pcb[j];
			pcb[j]=pcb[i];
			pcb[i]=pcb[0];	
		}
	}
	
	for(i=2;i<=n;i++)
	{
		time = time + pcb[i].servicetime;
		pcb[i].finishtime = time;
		printf("%6d%10d%10d%10d",pcb[i].name,pcb[i].servicetime,pcb[i].priority,pcb[i].finishtime);
		printf("\n");
	}//for
	
*/

int num=2;
	for(i=2;i<=n;i++)
	{
//按各进程的priority进行降序排列,优先级最高的进程先执行

	for(i=num;i<=n;i++)
	for(j=i+1;j<=n;j++)  
	{
		if(pcb[j].priority > pcb[i].priority)
		{
			pcb[0]=pcb[j];
			pcb[j]=pcb[i];
			pcb[i]=pcb[0];	
		}
	}
//在优先级调整后判断此时最先到达的进程号
for(i=num;i<=n;i++)
	for(j=i+1;j<=n;j++)  
	{
		if(pcb[j].arrivetime< pcb[i].arrivetime)
		{
			pcb[0]=pcb[j];
			pcb[j]=pcb[i];
			pcb[i]=pcb[0];	
		}
	}




i=num;
  if(time<pcb[i].arrivetime)
{
  time=pcb[i].arrivetime;
pcb[i].finishtime = time+pcb[i].servicetime;
}
else
{
time = time + pcb[i].servicetime;
pcb[i].finishtime = time;
}
printf("%6d%10d%10d%10d",pcb[i].name,pcb[i].servicetime,pcb[i].priority,pcb[i].finishtime);
printf("\n");
time=pcb[i].finishtime;

num++;
	}//for

}//void

void SJF(int n)
{
int i,j;
	int time = pcb[1].arrivetime;
	//按各进程的arrivetime进行升序排列,最早到达的进程先执行
	for(i=1;i<=n;i++)
	for(j=i+1;j<=n;j++)  
	{
		if(pcb[j].arrivetime < pcb[i].arrivetime)
		{
			pcb[0]=pcb[j];
			pcb[j]=pcb[i];
			pcb[i]=pcb[0];	
		}
	}
	
	    

	printf("\n processID runtime priority fihishtime \n");//进程名   服务时间   优先级  完成时间
	//先到达的进程第一个执行
	if(i=1)
	{
		pcb[i].finishtime=pcb[i].arrivetime + pcb[i].servicetime;
		time =pcb[i].arrivetime + pcb[i].servicetime;
		printf("%6d%10d%10d%10d",pcb[i].name,pcb[i].servicetime,pcb[i].priority,pcb[i].finishtime);
		printf("\n");
		
	
		i++; 
	}
	
	



int num=2;
	for(i=2;i<=n;i++)
	{
//按各进程的servicetime进行降序排列

	for(i=num;i<=n;i++)
	for(j=i+1;j<=n;j++)  
	{
		if(pcb[j].servicetime < pcb[i].servicetime)
		{
			pcb[0]=pcb[j];
			pcb[j]=pcb[i];
			pcb[i]=pcb[0];	
		}
	}
	if(pcb[num-1].finishtime<pcb[num].arrivetime)
	{
//在优先级调整后判断此时最先到达的进程号
for(i=num;i<=n;i++)
	for(j=i+1;j<=n;j++)  
	{
		if(pcb[j].arrivetime< pcb[i].arrivetime)
		{
			pcb[0]=pcb[j];
			pcb[j]=pcb[i];
			pcb[i]=pcb[0];	
		}
	}
	}




i=num;
  if(time<pcb[i].arrivetime)
{
  time=pcb[i].arrivetime;
pcb[i].finishtime = time+pcb[i].servicetime;
}
else
{
time = time + pcb[i].servicetime;
pcb[i].finishtime = time;
}
printf("%6d%10d%10d%10d",pcb[i].name,pcb[i].servicetime,pcb[i].priority,pcb[i].finishtime);
printf("\n");
time=pcb[i].finishtime;

num++;
	}//for


}

void layout(int n) 
{

while(true)
{
	int ch=0;
	printf("\t\t************schedule algorithm************\n");
	printf("\t\t1.FSFS\n");
	printf("\t\t2.timesegment\n");
	printf("\t\t3.priority\n");
	printf("\t\t4.SJF\n");
	printf("\t\t5表示退出\n");
	printf(" choose the algorithm:\n");
	scanf("%10d",&ch);
	switch(ch)
	{
	case 1:
		    FCFS(n);
		    print_FCFS(n); break;
	case 2:
		    time_segment(n);
		    print_time(n); break;
	case 3:
		    Priority(n); break;
        case 4:
		    SJF(n); break;
	case 5:     exit(0);	    
	default:printf("enter error data!\n");
	//P:int类型的变量,case后面不要加''
	}
}
}

int main()
{ 
	int n;
	printf("input the number of process\n");
	scanf("%d",&n);
	init(n);
	creat(n);
	layout(n);
	//FCFS(n);
	//print_FCFS(n);
	//time_segment(n);
	//print_time(n);
	//Priority(n);
	return 0;
}

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐