zoukankan      html  css  js  c++  java
  • 【操作系统】作业调度

    #include<stdio.h>
    
    void readfile(void);
    void input(void);
    void output(void);
    void sort(void);
    void FCFS(void);
    void SJF(void);
    void HRRF(void);
    
    struct job{
    	char name[10];//作业名
    	char status;//作业状态
    	
    	int arrtime;//到达时间
    	int reqtime;//所需时间
    	int startime;//开始时间
    	int finitime;//结束时间
    
    	float TAtime, TAWtime;//周转时间,带权周转时间
    	float prio;//优先级
    } jobarr[24], jobfin[24], job[24], temp;
    
    int systime = 0;
    int intarr, intfin, intjob;//到达作业个数,完成作业个数,未到达作业个数
    
    int main(void)
    {
    	//input();
    	readfile();
    	sort();
    	output();
    	FCFS();
    	SJF();
    	HRRF();
    	return 0;
    }
    
    void readfile(void)
    {	int count = 0; 
    	FILE *fp;
    	if((fp=fopen("data.txt","a+"))!=NULL)
    	{
    		while(!feof(fp)&&fgetc(fp)!=EOF)
    		{
    			fseek(fp,-1L,SEEK_CUR);
    			fscanf(fp,"%s%d%d",&job[count].name,&job[count].arrtime,&job[count].reqtime);
    			count++;
    		}
    	}else
    		printf("fail to open");
    	fclose(fp);
    	intarr = count;
    }
    
    
    void input(void)
    {
    	int i;
    	printf("请输入作业个数:");
    	scanf("%d", &intarr);
    	for(i = 0; i < intarr; i++)
    	{
    		printf("
    第%d个作业:
    ", i+1);
    		printf("输入作业名:");
    		scanf("%s", job[i].name);
    		printf("到达时间:");
    		scanf("%d", &job[i].arrtime);
    		printf("要求服务时间:");
    		scanf("%d", &job[i].reqtime);
    	}
    }
    void sort(void)
    {
    	int i, j;
    	for(i = 0; i < intarr; i++)
    	{
    		for(j = 0; j < intarr-1; j++)
    		{
    			if(job[j].arrtime > job[j+1].arrtime)
    			{
    				temp = job[j]; 
    				job[j] = job[j+1]; 
    				job[j+1] = temp;
    			}
    		}
    	}
    }
    void output(void)
    {
    	int i;
    	printf("经按到达时间排序后
    ");
    	printf("	name	arrtime	rqtime
    ");
    	for(i = 0; i < intarr; i++)
    	{
    		printf("N %d	%s	%d	%d
    ", i, job[i].name, job[i].arrtime, job[i].reqtime);
    	}
    	printf("
    			现在系统时间%d
    ", systime);
    }
    
    void FCFS(void)
    {
    	int i;
    	double sumTAtime = 0;//总周转时间
    	double sumTAWtime = 0;//总带权周转时间
    	double avgTAtime = 0;//平均周转时间
    	double avgTAWtime = 0;//平均带权周转时间
    	job[0].finitime = job[0].arrtime + job[0].reqtime;
    	job[0].startime = job[0].arrtime;
    	for(i = 1; i < intarr; i++)
    	{
    		job[i].startime = job[i-1].finitime;
    		job[i].finitime = job[i-1].finitime + job[i].reqtime;
    	}
    	for(i = 0; i < intarr; i++)
    	{
       		job[i].TAtime = job[i].finitime - job[i].arrtime;
    		sumTAtime += job[i].TAtime;
    		job[i].TAWtime = job[i].TAtime / job[i].reqtime;
    		sumTAWtime += job[i].TAWtime;
    	}
    	avgTAtime = sumTAtime / intarr;
    	avgTAWtime = sumTAWtime / intarr;
    
    	printf("
    FCFS算法作业序列表
    ");
    	printf("-----------------------------------------------
    ");
    	printf("作业名	到达系统时间	cpu所需时间	开始时间	结束时间	周转时间
    ");
    	for(i = 0; i < intarr; i++)
    	{
    		printf("%s	%d		%d		%d		%d		%.2f
    ", job[i].name, job[i].arrtime, job[i].reqtime, job[i].startime, job[i].finitime, job[i].TAtime);
    	}
    	printf("
    平均周转时间=%.2f", avgTAtime);
    	printf("
    平均带权周转时间=%.2f
    ", avgTAWtime);
    }
    
    void SJF(void)
    {
    	int i = 1, j = 1;
    	double sumTAtime = 0;//总周转时间
    	double sumTAWtime = 0;//总带权周转时间
    	double avgTAtime = 0;//平均周转时间
    	double avgTAWtime = 0;//平均带权周转时间
    	
    	job[0].finitime = job[0].arrtime + job[0].reqtime;
    	job[0].startime = job[0].arrtime;
    	
    	for(i = 1; i < intarr; i++)
    	{
    		for(j = 1; j < intarr-1; j++)
    		{
    			if(job[j].reqtime > job[j+1].reqtime)
    			{
    				temp = job[j]; 
    				job[j] = job[j+1]; 
    				job[j+1] = temp;
    			}
    		}
    	}
    	for(i = 1; i < intarr; i++)
    	{
    		job[i].startime = job[i-1].finitime;
    		job[i].finitime = job[i-1].finitime + job[i].reqtime;
    	}
    	for(i = 0; i < intarr; i++)
    	{
       		job[i].TAtime = job[i].finitime - job[i].arrtime;
    		sumTAtime += job[i].TAtime;
    		job[i].TAWtime = job[i].TAtime / job[i].reqtime;
    		sumTAWtime += job[i].TAWtime;
    	}
    	avgTAtime = sumTAtime / intarr;
    	avgTAWtime = sumTAWtime / intarr;
    
    	printf("
    SJF算法作业序列表
    ");
    	printf("-----------------------------------------------
    ");
    	printf("作业名	到达系统时间	cpu所需时间	开始时间	结束时间	周转时间
    ");
    	for(i = 0; i < intarr; i++)
    	{
    		printf("%s	%d		%d		%d		%d		%.2f
    ", job[i].name, job[i].arrtime, job[i].reqtime, job[i].startime, job[i].finitime, job[i].TAtime);
    	}
    	printf("
    平均周转时间=%.2f", avgTAtime);
    	printf("
    平均带权周转时间=%.2f
    ", avgTAWtime);
    }
    
    void HRRF(void)
    {
    	int i = 1, j = 1, k = 0;
    	double sumTAtime = 0;//总周转时间
    	double sumTAWtime = 0;//总带权周转时间
    	double avgTAtime = 0;//平均周转时间
    	double avgTAWtime = 0;//平均带权周转时间	
    	job[0].finitime = job[0].arrtime + job[0].reqtime;
    	job[0].startime = job[0].arrtime;
    	sort();
    	for(i = 1; i < intarr; i++)
    	{
    		for(j = 1; j < intarr-1; j++)
    		{
    			if(job[j].prio < job[j+1].prio)
    			{
    				if(job[j].arrtime == job[j+1].arrtime)
    				{
    					temp = job[j]; 
    					job[j] = job[j+1]; 
    					job[j+1] = temp;
    				}
    			}
    		}
    	}
    	printf("
    HRRF算法作业序列表
    ");
    	printf("-----------------------------------------------
    ");
    	output();
    	printf("id	最高响应比
    ");
    
    	for(j = 0; j < intarr; j++)
    	{
    		k = j +1;
    		systime = job[j].finitime;
    		for(i = 1; i < intarr; i++)
    		{
    			job[i].prio = 1 + (systime - job[i].arrtime)*1.0 / job[i].reqtime;
    			job[i].finitime = job[i-1].finitime + job[i].reqtime;
    		}
    		for(k; k < intarr; k++)
    		{
    			printf("%s	%.2f
    ", job[k].name, job[k].prio);
    		}
    		printf("-----------------------------------------------
    ");
    	}
    	for(i = 0; i < intarr; i++)
    	{
       		job[i].TAtime = job[i].finitime - job[i].arrtime;
    		sumTAtime += job[i].TAtime;
    		job[i].TAWtime = job[i].TAtime / job[i].reqtime;
    		sumTAWtime += job[i].TAWtime;
    	}
    	avgTAtime = sumTAtime / intarr;
    	avgTAWtime = sumTAWtime / intarr;
    
    
    
    	printf("作业名	到达系统时间	cpu所需时间	开始时间	结束时间	周转时间
    ");
    	for(i = 0; i < intarr; i++)
    	{
    		printf("%s	%d		%d		%d		%d		%.2f
    ", job[i].name, job[i].arrtime, job[i].reqtime, job[i].startime, job[i].finitime, job[i].TAtime);
    	}
    	printf("
    平均周转时间=%.2f", avgTAtime);
    	printf("
    平均带权周转时间=%.2f
    ", avgTAWtime);
    }
    


  • 相关阅读:
    【BZOJ 2324】 [ZJOI2011]营救皮卡丘
    【BZOJ 2809】 [Apio2012]dispatching
    网络流小结
    复活
    终结
    11.7模拟赛
    codevs 2173 忠诚
    P3386 【模板】二分图匹配
    Leetcode 大部分是medium难度不怎么按顺序题解(上)
    ATP的新博客!
  • 原文地址:https://www.cnblogs.com/xiseven/p/5416078.html
Copyright © 2011-2022 走看看