⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 1.c

📁 单道多道 程序的实现 不带输入
💻 C
字号:
/*							操作系统实验一
	测试时请注意:
	在主函数定义赋初值一栏中 
	  res[],a[],wait_time[],stopNum[]下标,以及resNum,num,seat都要随着具体值而改变
	  
	  方法:
		res[],a[],wait_time[],stopNum[]下标,resNum等于资源数(即 结构体中job[]的下标)
	  	num等于每个资源中的任务数(即 结构体中queue[]的下标)
		stopNum[]中每个数的初值为"queue[]的下标"	
		seat的值取比较大的数,不能在时间轴的范围内

*/


#include <stdio.h>
int devNum=3;       /*设置设备数*/

/*------------------------定义结构体------------------------------*/

struct step				/*表示程序每步对资源的需要*/
{
		int start;		/*起始时间*/
		int end;	 	/*结束时间*/
		int resID;		/*需要的资源ID*/
};

struct task				/*程序对应的数据结构*/
{
		int nextStep;	/*下一个要执行的步骤,为queue的下标*/
		struct step queue[4];	
}job[3]=
{
		{0,{{0,3,-1},{3,6,2},{6,7,1}}},
	{0,{{0,4,1},{4,8,2},{8,12,-1}}},
	{0,{{0,3,-1},{3,8,2},{8,12,1}}},
};

struct resource			/*表示资源的使用状态*/
{
		int curTask;	/*当前占用资源的程序,为-1表示没有被占用*/
		int releaseTime;
};

/*------------------------定义函数----------------------------*/
void find(int a)
{
	if(a==0)
		printf("CPU");
	else if(a<devNum && a>0)
		printf("DEV%d",a);
	else 
		printf("wait!!");
}

void process()
{
	printf("    ---------------------ALL THE PROCESS------------------\n\n");
}

void result(int max,float cpu,float dev[])
{
	int i;
	char word_cpu[]={"CPU  use "};
	printf("    -----------------------THE RESULT---------------------\n\n");
	printf("\t\t\t%s %.1f%\n",word_cpu,100*(cpu/max));
	for(i=0;i<devNum;i++)
	printf("\t\t\tDEV%d use  %.1f%\n",i+1,100*(dev[i]/max));
}

/*----------------------------主函数---------------------------*/
void main()
{
	/****************定义变量,赋初值**********************/	
	struct resource res[3]; 		
	int i,j,k,m,n,temp;
	int resNum=3,num=3;    /*resNum 等于资源数  num等于queue[]的下标*/
	int totalStep=0,door=1,key=0,max=0,seat=100;
	float cpu=0,dev[3]={0};     /*dev[]下标跟devNum值一样*/
	int a[3],wait_time[3]={0},stopNum[3]={4,4,4};
	char word1[]={"Res_"};
	char word2[]={"wait time is "};
	
	/*************计算cpu dev[]的总时间**************/
	for(i=0;i<resNum;i++)
		for(j=0;j<num;j++)
		{
			if(job[i].queue[j].resID==0)
				cpu=cpu+job[i].queue[j].end-job[i].queue[j].start;
			else 
			{
			    for(k=0;k<devNum;k++)
			    {
			        if(job[i].queue[j].resID==k+1)
			            dev[k]=dev[k]+job[i].queue[j].end-job[i].queue[j].start;
			    }
			}
		}
	
	
	/**********将各个资源的首任务赋给资源,并输出*********/
	process();
	for(i=0;i<resNum;i++)
	{
		int m=job[i].nextStep;
		res[i].curTask=job[i].queue[m].resID;
		res[i].releaseTime=job[i].queue[m].end-job[i].queue[m].start;
		job[i].nextStep++;
	}
	
	for(i=0;i<resNum;i++)
			{
				printf("%s%d  ",word1,i+1);
				printf("  %d   ",res[i].releaseTime);
				find(res[i].curTask);
				printf("\t");
			}
			printf("\n");
			
	/****************找到第一个最小时间轴*******************/
	/****************a[0]中存放最小时间**********************/	
	for(i=0;i<resNum;i++)
		a[i]=res[i].releaseTime;
		
	for(i=0;i<resNum-1;i++)
		for(j=0;j<resNum-i-1;j++)
			if(a[j]>a[j+1])
			{
				temp=a[j];
				a[j]=a[j+1];
				a[j+1]=temp;	
			}

	while(totalStep!=resNum*num)						/*控制任务数量,只有当3个资源的3个任务都执行完时,才结束循环*/
	{		
		totalStep=0;					
		for(i=0;i<resNum;i++)					/*i代表当前时间最少的资源*/
		{
			if(a[0]==res[i].releaseTime)	/*根据最小时间找到当前资源*/
			{
				if(i==stopNum[i])			/*判断是否有任务已停止*/
				{
					res[i].curTask=devNum+1;
					key=1;
				}
				else
				{
					n=job[i].nextStep;
					for(j=0;j<resNum;j++)		/*j代表其他资源*/
						if(job[i].queue[n].resID==res[j].curTask && res[j].releaseTime!=res[i].releaseTime)
						{
							m=job[j].nextStep-1;
							wait_time[i]=job[j].queue[m].end-job[i].queue[n].start;  	/*计算资源i的等待时间*/	
							for(k=n;k<num;k++)		/*根据等待时间将之后的时间轴整体往后移*/						
							{
								job[i].queue[k].end=job[i].queue[k].end+wait_time[i];
								job[i].queue[k].start=job[i].queue[k].start+wait_time[i];
							}
							printf("%s%d %s %d\n\n",word1,i+1,word2,wait_time[i]);		/*打印等待时间*/
						}
					
					res[i].releaseTime=job[i].queue[n].end;		
					res[i].curTask=job[i].queue[n].resID;		/*将当前资源的当前任务改成下一个*/
					job[i].nextStep++;
					if(job[i].nextStep==num)		/*判断此任务是否为当前资源的最终任务,随resNum变*/
						stopNum[i]=i;
				}			
			}	
		}
		
		/********输出 资源名,资源已运行到的时间轴,当前任务********/
			for(i=0;i<resNum;i++)  
			{
				printf("%s%d  ",word1,i+1);
				printf("  %d   ",res[i].releaseTime);
				find(res[i].curTask);
				printf("\t");
			}
			printf("\n");
				
				
				
			/*再一次寻找最小值*/
			for(i=0;i<resNum;i++)
			{
				a[i]=res[i].releaseTime;
				if(i==stopNum[i] && key==1) /*如果当前任务已经是资源的最后任务 将此时a[i]赋最大值*/
					a[i]=seat;				
			}
			
			for(i=0;i<resNum-1;i++)
				for(j=0;j<resNum-i-1;j++)
					if(a[j]>a[j+1])
					{
						temp=a[j];
						a[j]=a[j+1];
						a[j+1]=temp;	
					}
					
	/**********判断是否所有任务都已完成,随resNum变*********/
		for(i=0;i<resNum;i++)
			totalStep=totalStep+job[i].nextStep;
	}
	printf("\n");
	
	
	/*********************输出结果**********************/
	/*找到此时res[].releaseTime的最大值max*/
	for(i=0;i<resNum;i++)
		if(res[i].releaseTime>max)
			max=res[i].releaseTime;
	
	result(max,cpu,dev);
	getch();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -