短进程优先调度算法(基于抢占式)
#include
"stdio.h"
typedef
struct PCB//进程号,到达时间和服务时间
{
int ID;
int ReachTime;
int TotalTime;
}PCB;
PCB
a[100];//定义数组保存进程
int
sort(PCB *p,int N)//基于到达时间对进程进行排序
{
int i;
for(i=0;i<=N-1;i++)
for(int
j=0;j<=i;j++)
if(p[i].ReachTime<p[j].ReachTime)
{
PCB temp;
temp=p[i];
p[i]=p[j];
p[j]=temp;
}
for(i=0;i<N;i++)//对排序后的进程进行输出:这里不是必须的
{
printf("|-
",p[i].ID);
}
printf("\n");
return
0;
}
int
main()
{
int i,M,total=0;
int queue[50];//定义输出队列
printf("plaese input the number of the process:\n");
scanf("%d",&M);//提示用户输入进程的数目
for(i=0;i<M;i++)//输入进程的各项信息
{
printf("please input the
ID&ReachTime&TotalTime of the
processes:");
scanf("%d%d%d",&a[i].ID,&a[i].ReachTime,&a[i].TotalTime);
total=total+a[i].TotalTime;//在输入的同时统计所有进程总的执行时间
}
for(i=0;i<50;i++)//初始化输出队列
{
queue[i]=-1;
}
sort(a,M);//基于到达时间进行排序
int pg=0,q=0;//pg:按照时间排序后,第pg个进程的到来(相当于执行时新进程到来)
while(pg<M)//
{
int t=a[pg+1].ReachTime-a[pg].ReachTime;//前后两个进程到来的时间间隔
printf("the distance of two time point:%d\n",t);
total=total-t;//在这一个循环里,总的执行时间总是会减少那两个进程到来的时间间隔的时间
while(t>0)//主要是针对这段时间间隔里面有多个进程可以执行完
{
PCB min;
for(i=0;i<=pg;i++)
if(a[i].TotalTime>0)
{
min=a[i];
break;
}
for(i=0;i<=pg;i++)
if((a[i].TotalTime<min.TotalTime)&&(a[i].TotalTime>0))
min=a[i];
printf("the min_total_time process:-
-\n",min.ID,min.TotalTime);//上面的这一小段代码是找出执行时间最小的进程
if(t>=min.TotalTime)//如果这个进程能够在这段时间间隔里面执行完,相应的局部时间间隔要缩短,a[i].TotalTime=0;表示已经执行完,输出队列也要做相应的记录
{
for(int i=0;i<M;i++)
{
if(a[i].ID==min.ID)
{
t=t-min.TotalTime;
queue[q++]=min.ID;
a[i].TotalTime=0;
break;
}
}
}
if(t<min.TotalTime)//如果该进程不能在这段时间间隔执行完
{
for(int i=0;i<M;i++)
{
if(a[i].ID==min.ID)
{
queue[q++]=min.ID;
a[i].TotalTime=a[i].TotalTime-t;//它的执行时间减少了一个时间间隔
break;
}
}
break;
}
}
pg++;//相当于又有一个新的进程到来
}
while((total>0)&&(pg==M))//没有新的进程到来,只剩下没有执行完的进程,找最短进程一次性执行完毕,重复这样的操作,直到最后所有的进程都执行完
{
PCB min;
for(i=0;i<M;i++)
if(a[i].TotalTime>0)
{
min=a[i];
break;
}
for(i=0;i<M;i++)
if((a[i].TotalTime<min.TotalTime)&&(a[i].TotalTime>0))
min=a[i];//找到最短执行时间的进程
printf("the min_total_time process with no new
process:-
\n",min.ID);
total=total-min.TotalTime;
for(int i=0;i<M;i++)
{
if(a[i].ID==min.ID)
{
a[i].TotalTime=0;
a[i].ID=-1;
queue[q++]=min.ID;
break;
}
}
}
printf("\n");
printf("the sequence of the process being
scheduled:\n");//输出最终的结果
for(i=0;i<50;i++)
{
if(queue[i]!=-1)
printf("|- ",queue[i]);
}
printf("\n ");
return 0;
}
短进程优先调度算法(基于抢占式)
#include
<stdio.h>
#define M
3
//物理页数
#define PN
50 //存储进程ID号的数组的大小
typedef
struct PCB
{
int ID;
int ReachTime;
int TotalTime;
}PCB;
//进程号,到达时间和服务时间
PCB
A[M];
//3个进程
PCB
a[M];
PCB
temp;
int
queue[50]; //记录调度的进程
static int
K=0; //调度进程数组的标识
void
INIT()//初始化,所有进程的ID均为-1
{
int i;
for(i=0;i<M;i++)
{
A[i].ID=-1;
}
}
int
GetNum()//计算进程数,通过判断进程的ID是否为-1实现
{
int i,j=0;
for(i=0;i<M;i++)
{
if(A[i].ID!=-1)
{
j++;
}
}
return j;
}
void
Forward(int num)//前移:在前一个进程执行完以后,将队列里面的其他进程前移,并将最后一个空出来的进程id置为无效,如果有其他进程来的话,可以进行存储
{
int i;
for(i=0;i<num-1;i++)
{
A[i].ID=A[i+1].ID;
A[i].TotalTime=A[i+1].TotalTime;
}
A[num-1].ID=-1;
}
int
sort(PCB *p,int N)//基于到达时间对进程进行排序
{
int i;
for(i=0;i<=N-1;i++)
for(int j=0;j<=i;j++)
if(p[i].ReachTime<p[j].ReachTime)
{
PCB temp;
temp=p[i];
p[i]=p[j];
p[j]=temp;
}
for(i=0;i<N;i++)//对排序后的进程进行输出:这里不是必须的
{
printf("|----- ",p[i].ID,
p[i].TotalTime);
}
printf("\n");
return
0;
}
int
main()
{
static
int t=0;
int i;
int num;
printf("RR\n");
INIT();
int rr_time;
printf("please input the RR_time:");
scanf("%d",&rr_time);
for(i=0;i<M;i++)
{
printf("please input the
ID&ReachTime&TotalTime of the
processes:");
scanf("%d%d%d",&a[i].ID,&a[i].ReachTime,&a[i].TotalTime);
t=t+a[i].TotalTime;//运行时间:t保存了所有进程总的执行时间
}
for(i=0;i<50;i++)//初始化
{
queue[i]=-1;
}
int y=t;//保存总的运行时间t,以控制循环的结束
sort(a,M);
for(i=0;i<M;i++)
{
A[i]=a[i];
}
printf("%d\n",t);
while(t>0)//在总的执行时间里
{
num=GetNum();
printf("the number of process:%d\n",num);
queue[K]=A[0].ID;
K++;
if (A[0].TotalTime>rr_time)
{
A[0].TotalTime=A[0].TotalTime-rr_time;//执行完一个时间片以后,对应的进程的总的剩余
//执行时间要减少一个时间片
t=t-rr_time;
}
else
{
t=t-A[0].TotalTime;
A[0].TotalTime=0;
A[0].ID=-1;
}
printf("%d\n",t);
temp.ID=A[0].ID;//备份当前执行进程的ID号
temp.TotalTime=A[0].TotalTime;//备份当前执行进程的剩余的总的时间
Forward(num);
if(temp.TotalTime!=0)//如果temp.TotalTime==0则表示该进程已经完成,无需再保存到就绪队
//列中,否则保存到队尾
{
A[num-1].ID=temp.ID;
A[num-1].TotalTime=temp.TotalTime;
}
if(temp.TotalTime==0)
A[num-1].ID=-1;
num=GetNum();
for(i=0;i<num;i++)//输出显示当前就绪队列中的进程及其执行时间
printf("%d:%d----",A[i].ID,A[i].TotalTime);
}
printf("\n");
printf("the sequence of the process being
scheduled:\n\n");
for(i=0;i<50;i++)
{
if(queue[i]!=-1)
printf("|- ",queue[i]);
}
printf("\n
");
return
0;
}
加载中,请稍候......