Advertisement
HoussemNa12

NEW_PREPA

Dec 14th, 2020
1,268
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 6.56 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. #define PARTITION_LIBRE 0
  5. #define PARTITION_ALLOUE 1
  6.  
  7. #define PROCESUS_NONCHARGE 0
  8. #define PROCESUS_CHARGE 1
  9.  
  10. struct Partition {
  11.     int numero;
  12.     int taille;
  13.     int state;
  14. };
  15.  
  16.  
  17. struct Processus {
  18.     int numero;
  19.     int taille;
  20.     int state;
  21. };
  22.  
  23.  
  24. void lireNombreDesPartitions(int *partitionCount) {
  25.     do {
  26.         printf("Veuillez saisir le nombre de partitions :>>");
  27.         scanf("%d", partitionCount);
  28.     } while (*partitionCount < 0);
  29.  
  30. }
  31.  
  32. void lireNombreDesProcessus(int *processCount) {
  33.     do {
  34.         printf("\nVeuillez saisir le nombre de Processus demandant l'allocation d'une Partition :>>");
  35.         scanf("%d", processCount);
  36.     } while (*processCount < 0);
  37.  
  38. }
  39.  
  40. struct Partition creeNouveauPartition(int id, int size) {
  41.     struct Partition newPartition = {id, size, PARTITION_LIBRE};
  42.     return newPartition;
  43. }
  44.  
  45. struct Processus creeNouveauProcessus(int id, int size) {
  46.     struct Processus nvProcesus = {id, size, PROCESUS_NONCHARGE};
  47.     return nvProcesus;
  48. }
  49.  
  50. void lireLesPartitions(struct Partition partitionList[], int partitionCount) {
  51.     for (int i = 0; i < partitionCount; i++) {
  52.         int size;
  53.         printf("La taille de Partition Numero %d =", i + 1);
  54.         scanf("%d", &size);
  55.  
  56.         partitionList[i] = creeNouveauPartition(i + 1, size);
  57.     }
  58. }
  59.  
  60. void lireLesProcessus(struct Processus desProcessus[], int nbProcesus) {
  61.     for (int i = 0; i < nbProcesus; i++) {
  62.         int size;
  63.         printf("La taille de Processus Numero %d =", i + 1);
  64.         scanf("%d", &size);
  65.  
  66.         desProcessus[i] = creeNouveauProcessus(i + 1, size);
  67.     }
  68. }
  69.  
  70. void afficherLesPartitions(struct Partition desPartitions[], int nombreDesPartitions) {
  71.     printf("%-14s %-14s %-14s\n", "Partiton N", "Size(KO)", "State");
  72.     for (int i = 0; i < nombreDesPartitions; ++i) {
  73.         struct Partition cePartition = desPartitions[i];
  74.         printf("%-14d %-14d %-14d\n", cePartition.numero, cePartition.taille, cePartition.state);
  75.     }
  76. }
  77.  
  78. void afficherLesProcessus(struct Processus desProcessus[], int nbProcesus) {
  79.     printf("%-14s %-14s %-14s\n", "Procesus N", "Size(KO)", "State");
  80.     for (int i = 0; i < nbProcesus; ++i) {
  81.         struct Processus ceProcessus = desProcessus[i];
  82.         printf("%-14d %-14d %-14d\n", ceProcessus.numero, ceProcessus.taille, ceProcessus.state);
  83.     }
  84. }
  85.  
  86. struct Partition *creeAnArray(int taille) {
  87.     struct Partition *partitionArray = malloc(taille * sizeof(*partitionArray));
  88.     return partitionArray;
  89. }
  90.  
  91. struct Partition *
  92. addPartitionAt(struct Partition *partitionList, int *partitionCount, struct Partition toAdd, int index) {
  93.     int newPartitionCount = *partitionCount + 1;
  94.     struct Partition *newPartitionList = malloc(newPartitionCount * sizeof(*newPartitionList));
  95.     int j = 0;
  96.     for (int i = 0; i < *partitionCount; i++, j++) {
  97.         if (i == index) {
  98.             newPartitionList[i] = toAdd;
  99.             newPartitionList[i].numero = index + 1;
  100.             newPartitionList[i + 1] = partitionList[i];
  101.             newPartitionList[i + 1].numero = index + 2;
  102.             j++;
  103.         } else {
  104.             newPartitionList[j] = partitionList[i];
  105.             newPartitionList[j].numero = j + 1;
  106.         }
  107.     }
  108.  
  109.     //when adding a partition at the end of the list
  110.     if (index >= *partitionCount) {
  111.         newPartitionList[index] = toAdd;
  112.         newPartitionList[index].numero = index + 1;
  113.     }
  114.  
  115.     *partitionCount = newPartitionCount;
  116.  
  117.     return newPartitionList;
  118. }
  119.  
  120.  
  121. struct Partition
  122. *applyWorstFitAlgorithm(struct Partition *desPartitions, int *nbPartitons, struct Processus *desProcessus,
  123.                         int nbProcessus) {
  124.     printf("\n\n******************************************************* Worst Fit *******************************************************\n");
  125.     struct Partition *partitionArray = malloc(*nbPartitons * sizeof(*partitionArray));
  126.     for (int i = 0; i < *nbPartitons; ++i) {
  127.         partitionArray[i] = desPartitions[i];
  128.     }
  129.  
  130.  
  131.     for (int i = 0; i < nbProcessus; ++i) {
  132.         struct Processus ceProcessus = desProcessus[i];
  133.         int worstFitIndex = 0;
  134.         for (int j = 0; j < *nbPartitons; ++j) {
  135.             struct Partition cePartition = partitionArray[j];
  136.             if (cePartition.state == PARTITION_LIBRE && cePartition.taille >= ceProcessus.taille) {
  137.                 if (partitionArray[worstFitIndex].taille < partitionArray[j].taille) {
  138.                     worstFitIndex = j;
  139.                 }
  140.             }
  141.         }
  142.  
  143.         //This condition will help when no partition can fit the process, this will prevent it from creating a new partition at the default index 0
  144.         if (partitionArray[worstFitIndex].state == PARTITION_LIBRE &&
  145.             partitionArray[worstFitIndex].taille >= ceProcessus.taille) {
  146.             int partititonTaille = partitionArray[worstFitIndex].taille;
  147.             partitionArray[worstFitIndex].taille = ceProcessus.taille;
  148.  
  149.             //cree un nouveau partition de taille part.taille - process.taille
  150.             struct Partition partition = creeNouveauPartition(/*Le id will be assigned by addPartitionAt()*/-1,
  151.                                                                                                             partititonTaille -
  152.                                                                                                             ceProcessus.taille);
  153.  
  154.             partitionArray = addPartitionAt(partitionArray, nbPartitons, partition, worstFitIndex + 1);
  155.  
  156.             partitionArray[worstFitIndex].state = PARTITION_ALLOUE;
  157.             (desProcessus + i)->state = 1;
  158.         }
  159.     }
  160.  
  161.     return partitionArray;
  162. }
  163.  
  164. int main() {
  165.     //Lire les données
  166.     int nbPartitions, nbProcesus;
  167.  
  168.     lireNombreDesPartitions(&nbPartitions);
  169.     struct Partition desPartitions[nbPartitions];
  170.  
  171.     lireLesPartitions(desPartitions, nbPartitions);
  172.     afficherLesPartitions(desPartitions, nbPartitions);
  173.  
  174.     lireNombreDesProcessus(&nbProcesus);
  175.     struct Processus desProcessus[nbProcesus];
  176.  
  177.     lireLesProcessus(desProcessus, nbProcesus);
  178.     afficherLesProcessus(desProcessus, nbProcesus);
  179.  
  180.  
  181.     //Traitement
  182.     struct Partition *structPartition = applyWorstFitAlgorithm(desPartitions, &nbPartitions, desProcessus, nbProcesus);
  183.  
  184.  
  185.     //Affichage du Resultat finale
  186.     printf("\nEtat de la memoire a la fin de l'allocation\n");
  187.     afficherLesPartitions(structPartition, nbPartitions);
  188.  
  189.     printf("\nEtat de processus a la fin de l'allocation\n");
  190.     afficherLesProcessus(desProcessus, nbProcesus);
  191.  
  192.  
  193. }
  194.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement