時間片輪轉調度算法

#include<stdio.h>
#define MAX 10
struct task_struct
{
    char name[10];           /*進程名稱*/
    int number;              /*進程編號*/
    float come_time;         /*到達時間*/
    float run_begin_time;     /*開始運行時間*/
    float run_time;          /*運行時間*/
    float run_end_time;      /*運行結束時間*/
    int priority;           /*優先級*/
    int run_flag;          /*調度標誌*/
    int start_flag;     //是否爲第一次開始調度
} tasks[MAX];
int counter; /*實際進程個數*/
int time_counter=0;
int poutput(); /*調度結果輸出*/
int time();
int charge();//判斷是否所有的進程都被執行過

void main()
{

    pinput();
    printf("時間片輪轉算法。\n\n");
    time();
    poutput();
}

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++)
    {
        copy_task[j++]=tasks[i];//對進程的初始化信息備份
    }

    time_temp=tasks[0].come_time;
    while(charge())
    {
        for(i=0; i<counter; i++)
        {
            if(tasks[i].come_time>time_temp)
            {
                time_temp=tasks[i].come_time;
            }
            if(tasks[i].run_flag==0)//該進程還未結束
            {
                if(tasks[i].start_flag==0)  //該條件成立則說明,該進程是第一次執行,記錄開始執行時間
                {
                    tasks[i].run_begin_time=time_temp;
                    tasks[i].start_flag=1;
                }
                if(tasks[i].run_time/time_counter>1)//至少有兩倍的時間片未執行
                {
                    tasks[i].run_time=tasks[i].run_time-time_counter;
                    time_temp=time_temp+time_counter;
                }
                else if(tasks[i].run_time-time_counter==0)
                {
                    time_temp=time_temp+time_counter;
                    tasks[i].run_end_time=time_temp;
                    tasks[i].run_flag=1;
                    tasks[i].run_time=copy_task[i].run_time;
                }
                else//僅剩下不足一倍的時間片
                {
                    time_temp=time_temp+tasks[i].run_time;
                    tasks[i].run_end_time=time_temp;
                    tasks[i].run_flag=1;
                    tasks[i].run_time=copy_task[i].run_time;
                }
            }
        }
    }
}

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("please input the process counter:\n");
    scanf("%d",&counter);
    printf("please input the length of time:\n");
    scanf("%d",&time_counter);
    for(i=0; i<counter; i++)
    {
        printf("******************************************\n");
        printf("please input the process of %d th :\n",i+1);
        printf("please input the name:\n");
        scanf("%s",tasks[i].name);
        printf("please input the number:\n");
        scanf("%d",&tasks[i].number);
        printf("please input the come_time:\n");
        scanf("%f",&tasks[i].come_time);
        printf("please input the run_time:\n");
        scanf("%f",&tasks[i].run_time);
        printf("please input the priority:\n");
        scanf("%d",&tasks[i].priority);
        tasks[i].run_begin_time=0;
        tasks[i].run_end_time=0;
        tasks[i].run_flag=0;  //運行是否結束
        tasks[i].start_flag=0;//是否首次被執行
    }
    return 0;
}

int poutput() /*調度結果輸出*/
{
    int i;
    float turn_round_time=0,f1,w=0;
    printf("進程名 進程號 到達時間 運行時間 開始時間 結束時間 優先級 週轉時間\n");
    for(i=0; i<counter; i++)
    {
        f1=tasks[i].run_end_time-tasks[i].come_time;
        turn_round_time+=f1;
        printf("%s\t%d\t%5.3f\t%5.3f\t%5.3f\t %5.3f\t   %d\t  %5.3f\n",tasks[i].name,tasks[i].number,tasks[i].come_time,tasks[i].run_time,tasks[i].run_begin_time,tasks[i].run_end_time,tasks[i].priority,f1);
    }
    printf("average_turn_round_timer=%5.2f\n",turn_round_time/counter);
    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章