📄 1.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 + -