обработка заданий из очереди заданий в C - PullRequest
0 голосов
/ 06 сентября 2018

Вот вопрос Первоначально набор заданий дается с его идентификатором job_id, прибытие (которое будет 0) и время выполнения. Существует один процессор, который можно использовать для выполнения этих заданий. Каждое задание получит фиксированное количество времени (скажем, d) для выполнения в процессоре. По истечении этого промежутка времени у следующего задания появится возможность выполнить, и текущее задание, если оно еще не выполнено, перейдет в конец очереди заданий. Это время переключения работы считается незначительным. Новые задания могут также появиться после запуска процесса планирования заданий. В этом случае время прибытия считается больше 0. Как только приходит новая работа; он будет добавлен в очередь заданий. Если в какой-то момент приходит новое задание, а существующее задание выполняет в процессоре определенное количество времени 'd', то сначала новое задание будет добавлено в очередь заданий, а затем существующее задание будет добавлено в очередь на работу. Выполните планирование работы и покажите статус планирования работы через определенный момент времени. Отобразите каждое задание с помощью job_id, времени прибытия, времени исполнения, времени начала, времени окончания, оставшегося времени, состояния (выполнено или не завершено).

Ниже моя реализация.

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

struct job{
        int pid;
        int at;
        int et;
        };

//Node for creating a jobq
struct jobq{
        int pid;
        int at;
        int et;
         struct jobq *next;
        };
struct Queue
{
    struct jobq *front, *rear;
};

struct jobq* newNode(int k,int l, int j)
{
    struct jobq *temp = (struct jobq*)malloc(sizeof(struct jobq));
    temp->pid = k;
    temp->at = l;
    temp->et = j;
    temp->next = NULL;
    return temp;
}

// A utility function to create an empty queue
struct Queue *createQueue()
{
    struct Queue *q = (struct Queue*)malloc(sizeof(struct Queue));
    q->front = q->rear = NULL;
    return q;
}

void enQueue(struct Queue *q, int k, int l, int j)
{
    // Create a new LL node
    struct jobq *temp = newNode(k,l,j);

    // If queue is empty, then new node is front and rear both
    if (q->rear == NULL)
    {
    q->front = q->rear = temp;
       return;
    }

    // Add the new node at the end of queue and change rear
    q->rear->next = temp;
    q->rear = temp;
}

struct jobq *deQueue(struct Queue *q)
{
    // If queue is empty, return NULL.
    if (q->front == NULL)
       return NULL;

    // Store previous front and move front one node ahead
    struct jobq *temp = q->front;
    q->front = q->front->next;

    // If front becomes NULL, then change rear also as NULL
    if (q->front == NULL)
       q->rear = NULL;
    return temp;
}

void schedule(struct job rec[], struct job rec2[], int n1,int n2,int inst,int tq)
{
        struct Queue *q = createQueue();
        //Putting the jobs with AT=0 into jobq initially.
        for(int a=0 ; a<n1 ; a++)
        {
                enQueue(q , rec[a].pid, rec[a].at, rec[a].et);
        }

        struct jobq *j;
        j = q->front;

        struct ansjob{
                int apid;
                int aat;
                int start;
                int end ;
                int rem;
                int status;
                };

        struct ansjob instance[100];
      int start, end, rem, status,clock=0,i=0;
        while(1)
        {
                if(j->et < tq)
                {
                        start = clock;
                        end = start + j->et;
                        rem = 0 ;
                        clock = clock + j->et;
                        instance[i].apid = j->pid ;
                        instance[i].aat = j->at ;
                        instance[i].start = start ;
                        instance[i].end = end ;
                        instance[i].rem = rem ;
                        instance[i].status = 0 ; //COMPLETED
                        i++;
                        deQueue(q);
                        for(int k=0 ; k<n2 ; k++)
                        {       if(rec2[k].at <= clock)
                                {enQueue(q,rec2[k].pid,rec2[k].at,rec2[k].et);}
                        }

                        if(clock==(inst))
                        {break;}
                        else if(clock<(inst))
                        {
                          j = q->front;
                          continue;
                        }
                        else if(clock>(inst))
                        {break;}
                }
                        else if(j->et == tq)
                {
                          start = clock;
                          end = start + tq;
                          rem = 0 ;
                          clock = clock + tq ;
                          instance[i].apid = j->pid ;
                          instance[i].aat = j->at ;
                          instance[i].start = start ;
                          instance[i].end = end ;
                          instance[i].rem = rem ;
                          instance[i].status = 0 ;//COMPLETED
                          i++;
                          deQueue(q);
                          for(int k=0 ; k<n2 ; k++)
                        {     if(rec2[k].at <= clock)
                                {enQueue(q,rec2[k].pid,rec2[k].at,rec2[k].et);}
                          }
                          if(clock==(inst))
                          {break;}
                          else if(clock < (inst))
                          {
                          j = q->front;
                          continue;
                          }
                          else if(clock > (inst))
                          {break;}
                }

                else
                {
                        j->et = j->et -tq;
                        start = clock ;
                        end = -1 ;
                        rem = j->et ;
                        clock = clock + tq ;
                        instance[i].apid = j->pid ;
                        instance[i].aat = j->at ;
                        instance[i].start = start ;
                        instance[i].end = end ;
                        instance[i].rem = rem ;
                        instance[i].status = 1 ;//NOT COMPLETED
                        i++;
                        deQueue(q);
                        for(int k=0 ; k<n2 ; k++)
                        {       if(rec2[k].at <= clock)
                                {enQueue(q,rec2[k].pid,rec2[k].at,rec2[k].et);}
                        }
                        enQueue(q,j->pid,j->at,j->et);
                        if(clock==(inst))
                        {break;}
                        else if(clock < (inst))
                        {
                          j = q->front;
                          continue;
                        }
                        else if(clock > (inst))
                        {break; }


                }
        }
                                                                         printf("\n--------JOB STATUS------------\n");
        printf("PID\tAT\tSTART\tEND\tREM\tSTATUS\n");

        for(int s=0 ; s<i ; s++)
        {
                printf("%d\t%d\t%d\t%d\t%d\t",instance[s].apid ,instance[s].aat, instance[s].start, instance[s].end, instance[s].rem);
                if(instance[s].status == 0)
                {printf("COMPLETED");}
                else if(instance[s].status == 1)
                {printf("NOT COMPLETED");}
                printf("\n");
        }

}



void main()
{
        int tq,n,n1;
        printf("Enter the processor alloted time= ");
        scanf("%d" , &tq);
        printf("\nEnter the initial set of jobs at time = 0");
        printf("\nEnter number of jobs");
        scanf("%d" ,&n);
        struct job record[n] ;
        for(int i=0 ; i<n ; i++)
        {
                printf("PID = ");
                scanf("%d" , &record[i].pid);
                printf("Arrival Time = ");
                scanf("%d" , &record[i].at);
                printf("Execution Time = ");
                scanf("%d" , &record[i].et);
        }

        char flag[4];
        printf("Any more jobs at later time :");
        scanf("%s" , flag);
        struct job latrec[n1];
        if((strcmp(flag , "YES")) == 0)
        {       printf("\nEnter number of jobs");
                scanf("%d" ,&n1);

                for(int j=0 ; j<n1 ; j++)
                {
                printf("PID = ");
                                                                                        printf("PID = ");
                scanf("%d" , &latrec[j].pid);
                printf("Arrival Time = ");
                scanf("%d" , &latrec[j].at);
                printf("Execution Time = ");
                scanf("%d" , &latrec[j].et);
                }
        }

        else if((strcmp(flag , "NO")) == 0)
        {}
        int instance ;
        printf("Enter the time instance for displaying the job scheduling result:");
        scanf("%d" , &instance);
        schedule(record, latrec, n, n1,instance, tq);

}

Теперь, когда я выполняю этот код

Enter the processor alloted time= 3

Enter the initial set of jobs at time = 0
Enter number of jobs6
PID = 1
Arrival Time = 3
Execution Time = 24
PID = 2
Arrival Time = 6
Execution Time = 10
PID = 3
Arrival Time = 5
Execution Time = 12
PID = 4
Arrival Time = 8
Execution Time = 20
PID = 5
Arrival Time = 2
Execution Time = 40
PID = 6
Arrival Time = 1
Execution Time = 22
Any more jobs at later time :no
Enter the time instance for displaying the job scheduling result:7

--------JOB STATUS------------
PID     AT      START   END     REM     STATUS
1       3       0       -1      21      NOT COMPLETED
2       6       3       -1      7       NOT COMPLETED
3       5       6       -1      9       NOT COMPLETED

Я не могу проверить результаты, если это правильный вывод в соответствии с вопросом. Может ли кто-нибудь помочь мне

1) проверить результат, если выходные данные неверны, то, что пошло не так в моей реализации, это то, что я хотел бы знать. 2) Есть ли лучший способ решения этой проблемы? Я имею в виду лучший алгоритм, чем тот, который находится в реализации, если да, то как подходить к таким проблемам, чтобы уменьшить сложность, может быть на другом языке, отличном от C, некоторые встроенные функции существуют для реализации того же самого Я немного знаю Python и основы Java, но я чувствую себя более комфортно в C.

...