加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

短进程优先调度算法(基于抢占式)&&短进程优先调度算法(基于抢占式)

(2011-12-10 21:38:21)
标签:

it

短进程优先调度算法(基于抢占式)

#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;

}

      

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有