Вот вопрос
Первоначально набор заданий дается с его идентификатором 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.