diff --git a/execution.csv b/execution.csv index 0b49b10..2bc9a35 100644 --- a/execution.csv +++ b/execution.csv @@ -1,10 +1,10 @@ -1,10,0 -2,40,0 -3,50,30 -4,30,20 -5,40,10 -6,50,30 -7,90,40 -8,90,60 -9,50,40 -10,90,30 +1,10,0,0 +2,40,0,0 +3,50,30,0 +4,30,20,0 +5,40,10,0 +6,50,30,0 +7,90,40,0 +8,90,60,0 +9,50,40,0 +10,90,30,0 diff --git a/simulator.c b/simulator.c index 6bc479e..2e98f3e 100644 --- a/simulator.c +++ b/simulator.c @@ -16,6 +16,7 @@ struct pinfo { int arrival_time; int execution_time; int priority; + int nb_time_pre_empted; int wait_time; int turnaround_time; @@ -153,8 +154,8 @@ void free_processes(struct pinfo * next) { void write_file(struct pinfo * process, struct perf_info * perf) { - FILE *myStream_execution = fopen("execution2.csv", "w"); - FILE *myStream_performance = fopen("performance2.csv", "w"); + FILE *myStream_execution = fopen("executionRR.csv", "w"); + FILE *myStream_performance = fopen("performanceRR.csv", "w"); if (myStream_execution == NULL || myStream_performance == NULL) { @@ -163,96 +164,109 @@ void write_file(struct pinfo * process, struct perf_info * perf) { } while (process != NULL) { - fprintf(myStream_execution, "%d,%d,%d,%d\n", // Ajout de la colonne des préemptions + fprintf(myStream_execution, "%d,%d,%d,%d\n", process->id, process->turnaround_time, process->wait_time, - process->execution_time - process->remaining_time); // Nombre de préemptions + process->nb_time_pre_empted); process = process->next_pinfo; } fclose(myStream_execution); + + + fprintf(myStream_performance, "%d,%d,%d\n", perf->total_time, perf->total_nr_ctxt_switch, perf->total_time_ctxt_switch); + fclose(myStream_performance); } -struct perf_info schedule_RR(struct pinfo * processes) { - int current_time = 0; // Temps actuel - int context_switches = 0; // Nombre de changements de contexte +struct pinfo *enqueue(struct pinfo *queue, struct pinfo *process) { + if (queue == NULL) { + return process; + } + struct pinfo *temp = queue; + while (temp->next_pinfo != NULL) { + temp = temp->next_pinfo; + } + temp->next_pinfo = process; + return queue; +} + +struct pinfo *dequeue(struct pinfo **queue) { + if (*queue == NULL) { + return NULL; + } + struct pinfo *process = *queue; + *queue = (*queue)->next_pinfo; + process->next_pinfo = NULL; + return process; +} + + + +struct perf_info schedule_RR(struct pinfo *processes) { struct perf_info perf = {0, 0, 0}; + int current_time = 0; + struct pinfo *queue = NULL; + struct pinfo *current_process = NULL; + int remaining_quantum = RR_QUANTUM; - struct pinfo * queue = processes; // File d'attente de processus - struct pinfo * temp; // Variable temporaire pour itérer + while (processes != NULL || queue != NULL || current_process != NULL) { + // Ajouter les nouveaux processus arrivés à la file d'attente + while (processes != NULL && processes->arrival_time <= current_time) { + processes->state = READY; + queue = enqueue(queue, processes); + printf("Processus %d ajouté à la file d'attente à l'heure %d\n", processes->id, current_time); + processes = processes->next_pinfo; + } - while (1) { - int all_done = 1; // Vérifier si tous les processus sont terminés + // Si aucun processus en cours, prendre le suivant dans la file d'attente + if (current_process == NULL && queue != NULL) { + current_process = dequeue(&queue); + current_process->nb_time_pre_empted++; + remaining_quantum = RR_QUANTUM; // Réinitialiser le quantum + printf("Processus %d pris de la file d'attente pour exécution à l'heure %d\n", current_process->id, current_time); + } - // Itérer sur les processus dans la queue - temp = queue; - while (temp != NULL) { - // Vérifiez si le processus a encore du temps restant - if (temp->remaining_time > 0) { - all_done = 0; // Il y a au moins un processus qui n'est pas terminé + // Exécuter le processus courant + if (current_process != NULL) { + current_process->remaining_time--; + current_process->turnaround_time++; + remaining_quantum--; + printf("Processus %d exécuté à l'heure %d, temps restant: %d, quantum restant: %d\n", current_process->id, current_time, current_process->remaining_time, remaining_quantum); + current_time++; - // Si le temps actuel est inférieur au temps d'arrivée - if (current_time < temp->arrival_time) { - current_time = temp->arrival_time; // Mettez à jour le temps - } - - // Exécutez le processus pendant le quantum - if (temp->remaining_time > RR_QUANTUM) { - current_time += RR_QUANTUM; // Ajoute le quantum au temps - temp->remaining_time -= RR_QUANTUM; // Diminue le temps restant - context_switches++; // Compter le changement de contexte - } else { - // Le processus se termine ici - current_time += temp->remaining_time; // Ajoutez le temps restant à current_time - temp->turnaround_time = current_time - temp->arrival_time; // Calculer le TAT - temp->wait_time += (temp->turnaround_time - temp->execution_time); // Calculer le WT - temp->remaining_time = 0; // Le processus est terminé - temp->state = FINISHED; // Marquez comme terminé - } + // Vérifier si le processus est terminé + if (current_process->remaining_time == 0) { + current_process->state = FINISHED; + printf("Processus %d terminé à l'heure %d\n", current_process->id, current_time); + current_process = NULL; + } else if (remaining_quantum == 0) { + // Si le quantum RR est atteint, remettre le processus en file d'attente + current_process->state = WAITING; + queue = enqueue(queue, current_process); + printf("Processus %d préempté et remis en file d'attente à l'heure %d\n", current_process->id, current_time); + current_process = NULL; } - temp = temp->next_pinfo; // Passer au processus suivant + } else { + // Si aucun processus à exécuter, avancer le temps + printf("Aucun processus à exécuter à l'heure %d, avancer le temps\n", current_time); + current_time++; } - // Réinitialiser la file d'attente - temp = processes; // Revenir au début de la liste - struct pinfo * last = NULL; // Pour maintenir la fin de la queue - - // Créer une nouvelle file d'attente - while (temp != NULL) { - // Ne pas ajouter les processus terminés à la nouvelle queue - if (temp->remaining_time > 0) { - if (last == NULL) { - queue = temp; // Premier processus dans la nouvelle queue - } else { - last->next_pinfo = temp; // Ajouter à la fin - } - last = temp; // Mettre à jour le dernier élément de la queue - } - temp = temp->next_pinfo; // Passer au processus suivant - } - if (last != NULL) { - last->next_pinfo = NULL; // Terminer la liste - } - - // Si tous les processus sont terminés, sortez de la boucle - if (all_done) { - break; - } + // Mise à jour des performances + perf.total_time = current_time; + perf.total_nr_ctxt_switch++; + perf.total_time_ctxt_switch += CNTXT_SWITCH; } - // Mise à jour des statistiques de performance - perf.total_time = current_time; // Total du temps écoulé - perf.total_nr_ctxt_switch = context_switches; // Total des changements de contexte - perf.total_time_ctxt_switch = context_switches * CNTXT_SWITCH; // Temps total pour les changements de contexte - - return perf; // Retournez les performances + printf("Planification RR terminée\n"); + return perf; }