操作系统 作业调度实验报告(进程调度-先到先服务FCFS 最短作业优先SJF 高相应比优先 优先权调度 时间片轮转)

完成五个进程调度的模拟包括:1.先到先服务调度(FCFS) 2.最短作业优先调度(SJF)
3.高响应比优先调度 4.(抢占式)优先权调度 5.时间片轮转调度

  1. FCFS算法:按照作业/进程进入队列的先后顺序进行挑选,先进入的将先进行后续步骤的处理。
  2. SJF算法:以进入系统的作业所要求的CPU运行时间的长短为挑选依据,优先选取预计所需服务时间最短的作业进行调度,可以分别用于高级调度和低级调度。
  3. 高响应比优先调度算法:既考虑作业等待时间又考虑作业运行时间把CPU分配给就绪队列中响应比最高的进程。
  4. (抢占式)优先权调度:可抢占优先权调度,系统把处理机分配给优先权最高的进程,使之执行但在其执行期间,只要又出现了另一个其优先权更高的进程,进程调度程序就立即停止当前进程(原优先权最高的进程)的执行,重新将处理机分配给新到的优先权最高的进程。
  5. 时间片轮转算法:将所有的就绪进程按先来先服务的原则排成一个队列,每次调度时,把处理机分配给队首进程,并令其执行一个时间片。
    设计流程图如下:
#include<stdio.h>
#include<string.h>
#include <stdlib.h>
#define N 10				//允许最大进程个数
#define M 100				//进程名长度
int n;						//进程个数
char name[N][M]; 			//进程名
int Arival[N]={0};			//到达时间
int Go[N]={0};				//运行时间
int Start[N]={0};			//开始时间
int End[N]={0};				//结束时间
int Timer[N]={0};			//周转时间
float DTimer[N]={0};		//带权周转时间
int Check[N]={0};			//判断作业是否完成,完成值为1
int prio[N]={0};           //优先权,初始化为100,优先权=100-运行时间,运行时间越短优先级越高,先进行调度
int left[N]={0};            //剩余时间,抢占、轮转调度时剩余时间
void input(){
        int i;
		printf("输入进程的个数:");
		scanf("%d",&n);
		for(i=0;i<n;i++){
			printf("输入 进程名:");
			scanf("%s",&name[i]);
			printf("第%d个进程的到达时间:",i+1);
			scanf("%d",Arival+i);
			printf("第%d个进程的运行时间:",i+1);
			scanf("%d",Go+i);
			prio[i]=100-Go[i];
			left[i]=Go[i];
		}
}
/*先来先服务调度算法*/
 /**选出先到达的作业
 *a[] 到达时间
 *n 进程个数
 **/
int Select1(int a[],int n){
	int i=0;
	for(int k=0;k<n;k++){
		if(Check[k]==0){
			i=k;
			break;
		}
	}
	for(int j=0;j<n;j++){
		if(a[i]>a[j]&&Check[j]==0){
			i=j;
		}
	}
	Check[i]=1;
	return i;
}
/*短作业优先调度算法*/
/**选出短作业
 *a[] 运行时间
 *n 进程个数
 *local 当前时间
 **/
int Select2(int a[],int n,int local){
	int i=0;
	for(int k=0;k<n;k++){
		if(Check[k]==0){
			i=k;
			break;
		}
	}
	for(int j=0;j<n;j++){
		if(a[i]>a[j]&&Check[j]==0&&Arival[j]<=local){
			i=j;
		}
	}
	Check[i]=1;
	return i;
}
/*高响应比优先调度算法*/
/**选出响应比最高作业
 *优先权=等待时间+要求服务时间/要求服务时间
 *a[] 到达时间
 *b[] 要求服务时间
 *n 进程个数
 *local 当前时间
 **/
 int Select3(int a[],int b[],int n,int local){
	int i=0;
	double rate;
	for(int k=0;k<n;k++){
		if(Check[k]==0){
			i=k;
			break;
		}
	}
	rate=(local-a[i]+b[i])/b[i];
	for(int j=0;j<n;j++){
            double temp=(local-a[j]+b[j])/b[j];
		if(temp>rate&&Check[j]==0&&Arival[j]<=local){
			i=j;
            rate=temp;
		}
	}
	Check[i]=1;
	return i;
}
void diaodu(int x){
	int k=0;			//每次选出即将服务的进程
	int l=0;			//本次服务的进程
	int Atimer=0;		//周转时间之和
	float timer=0;		//带权周转时间之和
	int localtime=0;	//当前时间
	memset(Check,0,sizeof(Check));//每次开始之前Check数组要全部置0
	if(x==1)
	 k=Select1(Arival,n);
	if(x==2)
	 k=Select2(Go,n,localtime);
	if(x==3)
	 k=Select3(Arival,Go,n,localtime);
	Start[k]=Arival[k];
	End[k]=Start[k]+Go[k];
	Timer[k]=End[k]-Arival[k];
	DTimer[k]=(float)Timer[k]/Go[k];
	localtime=End[k];
	printf("作业  提交时间  运行时间  开始时间  结束时间  周转时间  带权周转时间\n");
	for(int m=0;m<n;m++){
		l=k;
		if(x==1)
	     k=Select1(Arival,n);
	    if(x==2)
         k=Select2(Go,n,localtime);
	    if(x==3)
	     k=Select3(Arival,Go,n,localtime);
		Start[k]=End[l];
		End[k]=Start[k]+Go[k];
		Timer[k]=End[k]-Arival[k];
		DTimer[k]=(float)Timer[k]/Go[k];
		Atimer=Timer[l]+Atimer;
		timer=timer+DTimer[l];
		printf(" %s     %2d        %2d         %2d        %2d        %2d         %.2f\n",name[l],Arival[l],Go[l],Start[l],End[l],Timer[l],DTimer[l]);
	}
	printf("平均周转时间:%.2f\n",(float)Atimer/n);
	printf("平均带权周转时间:%.2f\n",(float)timer/n);
}
/*抢占式优先权调度算法*/
/**选出该时刻前优先级最高的进程
 *a[] 优先级
 *left[] 剩余时间
 *n 进程个数
 *local 当前时间
 **/
 int Select4(int a[],int left[],int n,int local){
	int i=0;
	for(int k=0;k<n;k++){
		if(Check[k]==0){
			i=k;
			break;
		}
	}
	for(int j=0;j<n;j++){
		if(a[j]>a[i]&&left[j]!=0&&Arival[j]<=local){
			i=j;
		}
	}
	return i;
}
void p_prio(){
    int k=0;			//每次选出即将服务的进程
	int l=0;			//本次服务的进程
	int Atimer=0;		//周转时间之和
	float timer=0;		//带权周转时间之和
	int localtime=0;	//当前时间
	memset(Check,0,sizeof(Check));//每次开始之前Check数组要全部置0
    k=Select4(prio,left,n,localtime);
    Start[k]=Arival[k];
	int sum=0;         //记录完成进程数
	printf("作业  提交时间  运行时间  开始时间  剩余运行时间  结束时间  周转时间  带权周转时间\n");
	while(sum<n){
	    localtime++;
        left[k]--;
        prio[k]++;
        if(left[k]==0){
        sum++;
        Check[k]=1;
	    End[k]=localtime;
	    Timer[k]=End[k]-Arival[k];
	    DTimer[k]=(float)Timer[k]/Go[k];
            printf(" %s     %2d        %2d         %2d        %2d        %2d        %2d         %.2f\n",name[k],Arival[k],Go[k],Start[k],left[k],End[k],Timer[k],DTimer[k]);
        }
        else
            printf(" %s     %2d        %2d         %2d        %2d         未完成     未完成    未完成\n",name[k],Arival[k],Go[k],Start[k],left[k]);

        l=Select4(prio,left,n,localtime);//有新进程抢占
        if(l!=k){
            if(left[l]==Go[l])//第一次被选中记录开始时间
                Start[l]=localtime;
            k=l;
        }
	}
    for(int i=0;i<n;i++){
        Atimer=Timer[i]+Atimer;
		timer=timer+DTimer[i];
    }
	printf("平均周转时间:%.2f\n",(float)Atimer/n);
	printf("平均带权周转时间:%.2f\n",(float)timer/n);
}
/*时间片轮转调度算法*/
void lun(){
    int k=0;			//每次选出即将服务的进程
	int l=0;			//本次服务的进程
	int Atimer=0;		//周转时间之和
	float timer=0;		//带权周转时间之和
	int localtime=0;	//当前时间
	memset(Check,0,sizeof(Check));//每次开始之前Check数组要全部置0
    //k=Select4(prio,left,n,localtime);
    Start[k]=Arival[k];
	int sum=0;         //记录完成进程数
	printf("作业  提交时间  运行时间  开始时间  剩余运行时间  结束时间  周转时间  带权周转时间\n");
	while(true){
	    localtime++;
        left[k]--;
        if(left[k]==0){
        sum++;
        Check[k]=1;
	    End[k]=localtime;
	    Timer[k]=End[k]-Arival[k];
	    DTimer[k]=(float)Timer[k]/Go[k];
            printf(" %s     %2d        %2d         %2d        %2d        %2d        %2d         %.2f\n",name[k],Arival[k],Go[k],Start[k],left[k],End[k],Timer[k],DTimer[k]);
            if(sum==n)
                break;
        }
        else
            printf(" %s     %2d        %2d         %2d        %2d         未完成     未完成    未完成\n",name[k],Arival[k],Go[k],Start[k],left[k]);
        while(true){
            k++;
            if(k==n)
            k=k-n;
            if(left[k]!=0)
                break;

        }
        if(left[k]==Go[k]){
            Start[k]=localtime;
        }
	}
    for(int i=0;i<n;i++){
        Atimer=Timer[i]+Atimer;
		timer=timer+DTimer[i];
    }
	printf("平均周转时间:%.2f\n",(float)Atimer/n);
	printf("平均带权周转时间:%.2f\n",(float)timer/n);
}
void menu(){
	int choice;
	while(1){
		printf("              请选择调度算法           \n\t1、先来先服务(FCFS)\n\t2、短作业优先(SJF)\n\t3、高响应比优先\n\t4、(抢占式)优先权调度\n\t5、时间片轮转调度\n\t0、退出\n请输入:");//
		scanf("%d",&choice);
		if(choice==0){
			break;
		}
        else if(choice<=3){
            diaodu(choice);
        }
        else if(choice==4){
            p_prio();
        }
        else{
            lun();
        }
	}
}
int main(){
	input();
	menu();
	return 0;
}

你可能感兴趣的:(作业们)