#include<stdio.h>
#define N 3//进程个数,可以任意修改,这里设置为3个进程
int time=0;//时间轴
int sumTime=0;
void init();
void orderByReachTime();
int search_Shortest_Remain_Job();
void update(int);
int finishOrNot();
void SRTF();
void show();
struct JobStruct
{
int reachTime;//到达时间
int remainTime;//剩余时间
int needTime;//需要运行的总时间
int No;//进程号
int flag;//标志位,1标示已做完该作业,0标示未做完,初始化为0
}Job[N];
void init()//输入结构体数组Job[]数据
{
printf("Process ReachTime NeedTime\n");
for(int i=0;i<N;i++)
{
scanf("%d%d%d",&Job[i].No,&Job[i].reachTime,&Job[i].needTime);
Job[i].remainTime=Job[i].needTime;//刚开始时剩余时间=所需时间
Job[i].flag=0;
sumTime+=Job[i].needTime;
}
}
void orderByReachTime()//按到达时间先后排序数组
{
for(int i=0;i<N;i++)
for(int j=i+1;j<N;j++)
{
if(Job[i].reachTime>Job[j].reachTime)//按到达时间升序排序
{
struct JobStruct temp=Job[i];
Job[i]=Job[j];
Job[j]=temp;
}
}
}
int search_Shortest_Remain_Job()//寻找最短剩余时间的作业的下标并返回下标
{
int index=-1;
int remain=32767;
for(int i=0;i<N;i++)
{
if(Job[i].flag==0)
{
if(time>=Job[i].reachTime)//该作业已到达,可以对其进行判断
{
if(Job[i].remainTime<remain)//该作业未做完
{
remain=Job[i].remainTime;
index=i;
}
}
}
}
return index;//返回最短剩余时间的作业的下标
}
void update(int index)//被调度的作业剩余时间减1,时间轴加1,参数index为被调度的作业的下标
{
if(index==-1)
{
printf("%d ",index);
time++;
//return;
}
else
{
printf("%d ",index);
Job[index].remainTime--;
if(Job[index].remainTime==0)//如果作业剩余时间为0,说明作业已做完,置标志位为1
{
Job[index].flag=1;
}
time++;
}
}
int finishOrNot()//判断数组中是否还有没完成的作业,有则返回1,否则返回0
{
for(int i=0;i<N;i++)
{
if(Job[i].flag==0)
{
return 1;//说明此时还有作业未做完
}
}
return 0;
}
void SRTF()//最短剩余时间优先算法 Shortest Remaining Time First
{
init();
show();
printf("Process:");
while(finishOrNot())
{
int index=search_Shortest_Remain_Job();//返回最少剩余时间的作业的下标
update(index);
//display();
}
}
void show()
{
printf("Time ");
for(int i=0;i<sumTime;i++)//输出时间轴,每个单位为一个时间片,时间轴的长度可以自己设置的长一
//点,每个时间片对应的是主存中正在运行的一个进程号
{
printf("%d ",i);
}
printf("\n");
}
void main()
{
SRTF();
printf("\n");
}
- 1
- 2
- 3
- 4
前往页