时间片算法改进版

(1)按先来先服务算法将进程排成就绪队列。

(2)执行一个时间片后,系统时间加上时间片长度。

(3)按照队列进行时间片相加,当有进程完成结束时此进程跳出不参与接下来的时间片分配。

(5)当到了所有运行进程完成后进行输出。

(6)主要的判断函数。

  char name[10];           /*进程名称*/

    int number;              /*进程编号*/

    float arrivetime;         /*到达时间*/

    float starttime;     /*开始运行时间*/

    float servicetime;          /*运行时间*/

    float finishtime;      /*运行结束时间*/

    int run_flag;          /*调度标志*/

int start_flag;     //是否为第一次开始调度



#include<stdio.h>
#define MAX 10
struct task_struct
{
    char name[10];           /*进程名称*/
    int number;              /*进程编号*/
    float arrivetime;         /*到达时间*/
    float starttime;     /*开始运行时间*/
    float servicetime;          /*运行时间*/
    float finishtime;      /*运行结束时间*/
    int run_flag;          /*调度标志*/
    int start_flag;     //是否为第一次开始调度
	float x ;          //剩余时间
	char state ;      //进程状态
	
	
} tasks[MAX];
int counter; /*实际进程个数*/
int time_counter=0;
int poutput(); /*调度结果输出*/
int time();
int charge();//判断是否所有的进程都被执行过
int pput();


int time()
{
    float time_temp=0;
    int i;
    int j=0;
    int k=0;

    struct task_struct  copy_task[MAX];//备份
    for(i=0; i<counter; i++)
    {   	tasks[i].state='w';//初始化为wait
        copy_task[j++]=tasks[i];//对进程的初始化信息备份
    }

    time_temp=tasks[0].arrivetime;
    while(charge())
    {
        for(i=0; i<counter; i++)
        {
            if(tasks[i].arrivetime>time_temp)
            {
                time_temp=tasks[i].arrivetime;
            }
            if(tasks[i].run_flag==0)//该进程还未结束
            {
                if(tasks[i].start_flag==0)  //该条件成立则说明,该进程是第一次执行,记录开始执行时间
                {
                    tasks[i].starttime=time_temp;
                    tasks[i].start_flag=1;
				    tasks[i].state='w';

                }
                if(tasks[i].servicetime/time_counter>1)//至少有两倍的时间片未执行
                {   
                    tasks[i].servicetime=tasks[i].servicetime-time_counter;
                    time_temp=time_temp+time_counter;
					tasks[i].x=tasks[i].servicetime;
					tasks[i].state='R';
				   pput();
				   tasks[i].state='w';
				  
                }
                else if(tasks[i].servicetime-time_counter==0)
                {   	tasks[i].x=0;
                    time_temp=time_temp+time_counter;
                    tasks[i].finishtime=time_temp;
                    tasks[i].run_flag=1;
                    tasks[i].servicetime=copy_task[i].servicetime;
						tasks[i].state='E';
                	pput();
				
					 
                }
                else//仅剩下不足一倍的时间片
                {	tasks[i].x=0;
                    time_temp=time_temp+tasks[i].servicetime;
                    tasks[i].finishtime=time_temp;
                    tasks[i].run_flag=1;
                    tasks[i].servicetime=copy_task[i].servicetime;
					tasks[i].state='E';
			        pput();
					
					
                }
            }
        } 
    }
	return 0;
}

int charge()//判断是否全部进程都执行完毕
{
    int k;
    int super_flag=0;//判断是否全部的进程都执行完毕
    for(k=0; k<counter; k++)
    {
        if(tasks[k].run_flag==0)
        {
            super_flag=1;
            return super_flag;
            break;
        }
        else
        {
            super_flag=0;
        }
    }
    return super_flag;
}

int pinput() /*进程参数输入*/
{
    int i;
    printf("请输入进程数:\n");
    scanf("%d",&counter);
    printf("请输入时间片:\n");
    scanf("%d",&time_counter);
    for(i=0; i<counter; i++)
    {
        printf("******************************************\n");
        printf("请输入第 %d 个进程 :\n",i+1);
        printf("请输入进程名称,到达时间,服务时间:\n");
        scanf("%s%f%f",tasks[i].name,&tasks[i].arrivetime,&tasks[i].servicetime);
        tasks[i].starttime=0;
        tasks[i].finishtime=0;
        tasks[i].run_flag=0;  //运行是否结束
        tasks[i].start_flag=0;//是否首次被执行
    }
    return 0;
}
int pput()
{
	int i;
   printf("进程名    剩余时间      运行状态 \n");
   for(i=0; i<counter; i++)
   {
	   printf("%s\t   %5.3f\t      %c\n",
      tasks[i].name,tasks[i].x,tasks[i].state);
   } 
   return 0;

}

int poutput() /*调度结果输出*/
{
    int i; 
    printf("进程名   到达时间       运行时间         开始时间            结束时间             \n");
    for(i=0; i<counter; i++)
    {
      printf("%s\t   %5.3f\t    %5.3f\t    %5.3f\t      %5.3f\n    ",
      tasks[i].name,tasks[i].arrivetime,tasks[i].servicetime,tasks[i].starttime,tasks[i].finishtime);
    }
    
    return 0;
}

void main()
{

    pinput();
    printf("时间片轮转算法。\n\n");
    time();
	poutput();
   
}
 
 
 
 


猜你喜欢

转载自blog.csdn.net/qq_42070071/article/details/80489907