From 5509743101146b5edb250159c7cdf6be59f5ee04 Mon Sep 17 00:00:00 2001 From: "florian.sauzeat" Date: Tue, 15 Oct 2024 10:27:35 +0200 Subject: [PATCH] RR fait --- execution.csv => executionFCFS.csv | 0 executionRR.csv | 10 ++ performance.csv => performanceFCFS.csv | 0 performanceRR.csv | 1 + results.csv | 11 ++ simulator.c | 239 +++++++++++-------------- tempCodeRunnerFile | Bin 0 -> 16824 bytes 7 files changed, 122 insertions(+), 139 deletions(-) rename execution.csv => executionFCFS.csv (100%) create mode 100644 executionRR.csv rename performance.csv => performanceFCFS.csv (100%) create mode 100644 performanceRR.csv create mode 100644 results.csv create mode 100755 tempCodeRunnerFile diff --git a/execution.csv b/executionFCFS.csv similarity index 100% rename from execution.csv rename to executionFCFS.csv diff --git a/executionRR.csv b/executionRR.csv new file mode 100644 index 0000000..7c4c0c1 --- /dev/null +++ b/executionRR.csv @@ -0,0 +1,10 @@ +1,10,0,4 +2,84,44,19 +3,42,24,9 +4,22,14,4 +5,94,66,14 +6,66,48,9 +7,148,100,24 +8,98,70,14 +9,30,22,4 +10,90,32,29 diff --git a/performance.csv b/performanceFCFS.csv similarity index 100% rename from performance.csv rename to performanceFCFS.csv diff --git a/performanceRR.csv b/performanceRR.csv new file mode 100644 index 0000000..fc78dc5 --- /dev/null +++ b/performanceRR.csv @@ -0,0 +1 @@ +290,130,0 diff --git a/results.csv b/results.csv new file mode 100644 index 0000000..1f04bcb --- /dev/null +++ b/results.csv @@ -0,0 +1,11 @@ +PID,Arrival Time,Execution Time,Wait Time,Turnaround Time,Remaining Time +1,0,10,6,14,0 +2,20,40,545,129,0 +3,30,20,123,54,0 +4,60,10,42,33,0 +5,80,30,709,140,0 +6,90,20,295,90,0 +7,100,50,2016,196,0 +8,130,30,739,131,0 +9,180,10,60,46,0 +10,200,60,1694,143,0 diff --git a/simulator.c b/simulator.c index 2e98f3e..b999e86 100644 --- a/simulator.c +++ b/simulator.c @@ -4,6 +4,7 @@ #define RR_QUANTUM 2 #define CNTXT_SWITCH 1 +#define MAX_PROCESSES 10 enum pstate { WAITING, @@ -16,11 +17,11 @@ struct pinfo { int arrival_time; int execution_time; int priority; - int nb_time_pre_empted; int wait_time; int turnaround_time; int remaining_time; + int nb_time_pre_empted; // Ajouté pour compter les préemptions enum pstate state; struct pinfo * next_pinfo; @@ -67,11 +68,13 @@ struct pinfo * create_process(int id, int arrival_time, int execution_time, int info->wait_time = 0; info->turnaround_time = 0; info->remaining_time = execution_time; + info->nb_time_pre_empted = 0; // Initialiser le nombre de préemptions info->state = WAITING; info->next_pinfo = NULL; return info; } +// Méthode de planification FCFS struct perf_info schedule_FCFS(struct pinfo * processes) { int current_time = 0; struct pinfo * process = processes; @@ -94,6 +97,97 @@ struct perf_info schedule_FCFS(struct pinfo * processes) { return perf; } +struct perf_info schedule_RR(struct pinfo *processes) { // Déclaration de la fonction schedule_RR qui prend un pointeur vers une liste de processus + struct perf_info perf = {0, 0, 0}; // Initialisation de la structure de performance avec des valeurs à zéro + int current_time = 0; // Variable pour suivre le temps actuel + int finished_processes = 0; // Compteur pour le nombre de processus terminés + + while (finished_processes < MAX_PROCESSES) { // Boucle principale jusqu'à ce que tous les processus soient terminés + int process_found = 0; // Indicateur pour savoir si un processus prêt a été trouvé + struct pinfo *current_process = processes; // Pointeur pour parcourir la liste des processus + + while (current_process != NULL) { // Boucle pour parcourir tous les processus + // Vérifiez si le processus est prêt à s'exécuter + if (current_process->state != FINISHED && current_process->arrival_time <= current_time) { // Vérifie si le processus n'est pas fini et est arrivé + process_found = 1; // Un processus prêt à s'exécuter a été trouvé + + int time_slice = (current_process->remaining_time < RR_QUANTUM) ? current_process->remaining_time : RR_QUANTUM; // Calcule la tranche de temps à exécuter + + // Simuler l'exécution + current_time += time_slice; // Incrémente le temps actuel par la tranche de temps + current_process->remaining_time -= time_slice; // Diminue le temps restant du processus + + // Calculer les temps d'attente pour les autres processus + struct pinfo *other_process = processes; // Pointeur pour parcourir à nouveau la liste des processus + while (other_process != NULL) { // Boucle pour parcourir tous les autres processus + if (other_process->state != FINISHED && other_process != current_process && other_process->arrival_time <= current_time) { // Vérifie si l'autre processus est prêt + other_process->wait_time += time_slice; // Augmente le temps d'attente des autres processus + } + other_process = other_process->next_pinfo; // Passe au processus suivant + } + + // Gérer les statistiques de préemption + if (current_process->remaining_time == 0) { // Vérifie si le processus est terminé + current_process->state = FINISHED; // Met à jour l'état du processus à fini + finished_processes++; // Incrémente le compteur de processus terminés + current_process->turnaround_time = current_time - current_process->arrival_time; // Calcule le temps de turnaround + } else { + // Incrémenter le nombre de préemptions + current_process->nb_time_pre_empted++; // Incrémente le compteur de préemptions pour le processus actuel + perf.total_nr_ctxt_switch++; // Incrémente le nombre total de commutations de contexte + } + + // Débogage : Afficher les informations du processus + printf("Processus %d: remaining_time=%d, nb_time_pre_empted=%d\n", // Affiche les informations de débogage pour le processus actuel + current_process->id, current_process->remaining_time, current_process->nb_time_pre_empted); + } + + current_process = current_process->next_pinfo; // Passe au processus suivant dans la liste + } + + if (!process_found) { // Vérifie si aucun processus prêt n'a été trouvé + // Aucun processus prêt, avancer le temps + current_time++; // Incrémente le temps actuel si aucun processus n'est prêt + } + } + + perf.total_time = current_time; // Enregistre le temps total écoulé dans la structure de performance + return perf; // Renvoie la structure de performance +} + + +void write_file(struct pinfo * process, struct perf_info * perf) { + FILE *myStream_execution = fopen("executionRR.csv", "w"); + FILE *myStream_performance = fopen("performanceRR.csv", "w"); + + if (myStream_execution == NULL || myStream_performance == NULL) { + perror("Erreur à l'ouverture des fichiers"); + return; + } + + while (process != NULL) { + fprintf(myStream_execution, "%d,%d,%d,%d\n", + process->id, + process->turnaround_time, + process->wait_time, + 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 pinfo * read_file() { FILE * file = fopen("tasks.csv", "r"); @@ -121,12 +215,12 @@ struct pinfo * read_file() { atoi(prio_str) ); - // If linked list not initialized + // Si la liste n'est pas initialisée if (first == NULL) { first = process; } - // If there is an element in list + // Si un élément est déjà dans la liste if (last != NULL) { last->next_pinfo = process; } @@ -139,9 +233,6 @@ struct pinfo * read_file() { return first; } - - - void free_processes(struct pinfo * next) { struct pinfo * cur; while (next != NULL) { @@ -152,146 +243,16 @@ void free_processes(struct pinfo * next) { } -void write_file(struct pinfo * process, struct perf_info * perf) { - - FILE *myStream_execution = fopen("executionRR.csv", "w"); - FILE *myStream_performance = fopen("performanceRR.csv", "w"); - - - if (myStream_execution == NULL || myStream_performance == NULL) { - perror("Erreur à l'ouverture des fichiers"); - return; - } - - while (process != NULL) { - fprintf(myStream_execution, "%d,%d,%d,%d\n", - process->id, - process->turnaround_time, - process->wait_time, - 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 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; - - 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; - } - - // 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); - } - - // 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++; - - // 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; - } - } 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++; - } - - // Mise à jour des performances - perf.total_time = current_time; - perf.total_nr_ctxt_switch++; - perf.total_time_ctxt_switch += CNTXT_SWITCH; - } - - printf("Planification RR terminée\n"); - return perf; -} - - - - - - - - - int main() { struct pinfo * processes = read_file(); - //struct perf_info perf = schedule_FCFS(processes); - - struct perf_info perf = schedule_RR(processes); + //struct perf_info perf = schedule_FCFS(processes); // Remise en place de FCFS + struct perf_info perf = schedule_RR(processes); write_file(processes, &perf); - //print_processes(processes); - //print_perf(&perf); free_processes(processes); - - return 0; -} \ No newline at end of file +} diff --git a/tempCodeRunnerFile b/tempCodeRunnerFile new file mode 100755 index 0000000000000000000000000000000000000000..58ee3b3341c474e284056edcb48b3087c01befd6 GIT binary patch literal 16824 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 literal 0 HcmV?d00001