From 7141ac6052aeb06b47739773d748357c8dc2bc09 Mon Sep 17 00:00:00 2001
From: Lou Davila <lou.davilapr@hes-so.ch>
Date: Thu, 10 Apr 2025 16:12:08 +0200
Subject: [PATCH] Lou Final version code+doc

---
 TP3_rapport_bykes.txt |  99 ++++++++++++++++++++++++++++++++++++++++++
 byke_simulation       | Bin 0 -> 21368 bytes
 tp                    | Bin 21328 -> 0 bytes
 tp.c                  |  88 +++++++++++++++++++++++++++----------
 4 files changed, 163 insertions(+), 24 deletions(-)
 create mode 100644 TP3_rapport_bykes.txt
 create mode 100755 byke_simulation
 delete mode 100755 tp

diff --git a/TP3_rapport_bykes.txt b/TP3_rapport_bykes.txt
new file mode 100644
index 0000000..07531e4
--- /dev/null
+++ b/TP3_rapport_bykes.txt
@@ -0,0 +1,99 @@
+TP3 : Gestion d’un parc de vélos
+
+Nom : El Ajeri				     Nom : Davila Prado 
+Prénom : Khalil Mokhtar    Prénom : Lou
+		
+Groupe : 14
+
+--------------------------------------------------
+Statut du projet
+--------------------------------------------------
+Projet fonctionnel.
+
+- Le programme gère correctement la concurrence entre threads à l’aide de mutex et sémaphores.
+- Tous les trajets sont effectués sans blocage (tests répétés).
+- Le nombre total de vélos reste constant à la fin de la simulation : S * (N - 2) + 2.
+- Chaque site possède entre 0 et N vélos à la fin.
+- Les affichages reflètent bien les prises, dépôts, attentes et les actions du camion.
+- La logique du dépôt et du rééquilibrage est bien gérée.
+- Les délais usleep ont été désactivés pour les tests de performance/stabilité.
+- On a eu un bug avec un grand nombre d'habitants donc à cause de la concurrence au niveau de la gestion des vélos
+  qu'on a pu régler par la suite.
+
+--------------------------------------------------
+Algorithme de gestion des habitants
+--------------------------------------------------
+Chaque habitant est un thread. Il effectue M trajets :
+
+1. Il attend passivement qu’un vélo soit disponible sur son site actuel (sémaphore velos), en incrémentant personnes_attente.
+2. Une fois le vélo obtenu, il décrémente le compteur local velos_dispo du site, puis libère une borne (bornes).
+3. Il choisit un autre site (aléatoirement) et attend passivement qu’une borne soit libre (sémaphore bornes) pour y déposer le vélo.
+4. Il incrémente alors velos_dispo de ce site, poste sur le sémaphore velos, et libère ainsi le vélo pour un autre utilisateur.
+
+Toutes les modifications des variables critiques (velos_dispo, personnes_attente) sont protégées par un mutex par site.
+
+Un mutex global (mutex_trajets) est utilisé pour suivre le nombre total de trajets réalisés par tous les habitants.
+
+
+--------------------------------------------------
+Gestion de la concurrence
+--------------------------------------------------
+- Les accès partagés (velos_dispo, bornes, velos, personnes_attente, variables utilisées dans les printf) sont protégés par des mutex individuels.
+- Les accès globaux (trajets_effectues, velos_depot) sont protégés par des mutex globaux.
+- Les sémaphores assurent des attentes passives :
+  - velos pour prendre un vélo.
+  - bornes pour déposer un vélo.
+- Les sections critiques sont réduites au strict minimum.
+- Chaque affichage est fait après la section critique pour limiter la contention.
+
+--------------------------------------------------
+Fonctions codées:
+--------------------------------------------------
+
+void *habitant(void *arg)
+---------------------------------
+Cette fonction représente le comportement d’un habitant modélisé par un thread.
+- Chaque habitant commence à un site choisi aléatoirement.
+- Il effectue TRAJETS fois la séquence de prise et dépôt de vélo entre deux sites différents.
+- Il utilise les sémaphores pour attendre passivement la disponibilité d’un vélo ou d’une borne.
+- Les compteurs internes (velos_dispo, personnes_attente) sont mis à jour dans des sections critiques protégées par mutex.
+- Le compteur global trajets_effectues est également protégé par un mutex.
+- À chaque dépôt de vélo, le site actuel est mis à jour.
+- Les affichages indiquent les actions de l’habitant et les situations d’attente.
+
+void *gestion_camion(void *arg)
+---------------------------------
+Cette fonction modélise la camionnette de maintenance qui équilibre les vélos entre les sites.
+- Elle tourne tant que tous les trajets ne sont pas effectués (condition vérifiée avec mutex_trajets).
+- Pour chaque site :
+    a. Si trop de vélos : enlève jusqu’à CAMION_CAPACITE - velos_camion vélos pour atteindre N - 2.
+    b. Si trop peu de vélos : ajoute jusqu’à 2 vélos selon disponibilité du camion et bornes.
+- Après la boucle des sites :
+    a. Dépôt des vélos excédentaires si velos_camion > 2.
+    b. Recharge depuis le dépôt si velos_camion < 2.
+- L’accès au dépôt est protégé par mutex_velos_depot.
+- Le comportement respecte la capacité max du camion (4 vélos).
+
+int main(int argc, char *argv[])
+---------------------------------
+Fonction principale qui :
+- Récupère les paramètres SITES, HABITANTS, TRAJETS et BORNES depuis la ligne de commande.
+- Initialise les sémaphores et mutex de chaque site.
+- Lance les threads pour chaque habitant et un thread pour le camion.
+- Attend la fin de tous les threads avec pthread_join.
+- Affiche les vélos par site et la vérification du total global à la fin de l’exécution.
+- Détruit les sémaphores et mutex à la fin.
+
+--------------------------------------------------
+Bugs résiduels
+--------------------------------------------------
+
+Lorsqu'un trop grand nombre d'habitants est spécifié au lancement du programme, le programme finit par se bloquer après un certain temps d'exécution.
+Nous pensons que ceci est dû à un trop grand nombre de threads concurrents crées par rapport à la capacité de la machine.
+Il faudrait probablement limiter le nombre de threads créés simultanement pour éviter ce genre de problème.
+
+--------------------------------------------------
+Conclusion
+--------------------------------------------------
+
+Le programme respecte toutes les exigences du TP : cohérence des vélos, absence de blocage, affichages pertinents, gestion propre de la concurrence.
\ No newline at end of file
diff --git a/byke_simulation b/byke_simulation
new file mode 100755
index 0000000000000000000000000000000000000000..d298e633a2e0004481d7f67a985035fc5c59da0c
GIT binary patch
literal 21368
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
TSZanBm|_5pn?P6)5?wz41wSCy

literal 0
HcmV?d00001

diff --git a/tp b/tp
deleted file mode 100755
index 11586c6855566ccba201f878ee9431e295a73610..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 21328
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%0DbRceOf86p)sG-H2!q<`
z$ogUZ1Q-o!_k+~IFuMM51_p+2|NrO1?1%N6VKl700_{G-x|uNJ7!ny67`VZ0e~1vQ
zUk#%>paz572nsux|6%>xOz0U;P-P6TemabX^~)iqL(Xx6u|aep1EkLj(+}(C!e~(V
zg4Ds>4^s!D>lhdqKz(Q!AMQb@Lt*E#p}QYsCJ6U}`!S#sUO+qs23WryM#K8`F#Dm#
z!u$8rq57R5+8JQu1TY#lt^m>x3Nv*5p!1+W;R=!m8v*MFLupX@28%-p^!T3x?)M<Z
zMHHa=U^IA+4XPJJL8W2CHw>VD9J2id(Ec=xhN%bX1z{K;MuYZTAnR{{>W9(Db9C7B
zgLV=i>xZ>>VRQ#*Z#qaL6vOO=a={x}koCj*LogaPJ_S>c9)6&`D<J*w^aIQAP?{Cm
zZ-?oJ#UG4+78?FA{kYC|gQ-Wi|2CTb08odXfq?-=gXUXddO<Y0{ZAPf7(hV;b0%!u
z4R-z;x_THNMt@{rVBm-5VUYQ-aRCkJd3-Q+AUP0*@nJNm9}P;oF#BQsb=Y}+uygxB
z`43q?EFM=w{SVU*8<$hC2dQRYcmSc`B+OnI&Bh2RQ(*ex{YGfUhuH%&0HzPd=YbBy
z!SuuWNdi#)pmX0~YC$x5c`OLEADUc1O28PVUmMIr5TLXM;vv(pv;z`{VF#%F9-zQw
zU|^7ij#t3k4=PJQYC+>mFt>yFFx=q=VLeBagxL#`WdIMip(z1N<$HlC2GDp2gaskd
G^#cITqy^{z

diff --git a/tp.c b/tp.c
index b37678f..70e4f8f 100644
--- a/tp.c
+++ b/tp.c
@@ -1,3 +1,6 @@
+/*Authors: Lou Davila Prado, Khalil El Ajeri
+  Groupe: 14*/
+
 #include <stdio.h>
 #include <stdlib.h>
 #include <pthread.h>
@@ -14,7 +17,7 @@ typedef struct
     int velos_dispo;
     int personnes_attente;
     pthread_mutex_t mutex;
-} Site;
+}Site;
 
 int SITES,HABITANTS,TRAJETS,BORNES;
 Site *sites;
@@ -36,38 +39,46 @@ void *habitant(void *arg)
         {
             site_suivant = rand()%SITES;
         } 
-        while (site_suivant == site_actuel);
+        while (site_actuel == site_suivant);
 
         pthread_mutex_lock(&sites[site_actuel].mutex);
         sites[site_actuel].personnes_attente++;
+        int velos = sites[site_actuel].velos_dispo;
+        int attente = sites[site_actuel].personnes_attente;
         pthread_mutex_unlock(&sites[site_actuel].mutex);
         
-        printf("(GET) Habitant %d attend un vélo au site %d\n",habitant_id,site_actuel);
+        printf("(GET) Habitant %d attend un vélo au site %d (%d vélos, %d personnes en attente)\n", habitant_id, site_actuel, velos, attente);
         sem_wait(&sites[site_actuel].velos);
         
         pthread_mutex_lock(&sites[site_actuel].mutex);
         sites[site_actuel].velos_dispo--;
         sites[site_actuel].personnes_attente--;
+        velos = sites[site_actuel].velos_dispo;
+        attente = sites[site_actuel].personnes_attente;
         pthread_mutex_unlock(&sites[site_actuel].mutex);
         
-        printf("(GET) Habitant %d prend un vélo au site %d\n",habitant_id,site_actuel);
+        printf("(GET) Habitant %d prend un vélo au site %d (%d vélos, %d personnes en attente)\n", habitant_id, site_actuel, velos, attente);
         sem_post(&sites[site_actuel].bornes);
         //usleep((rand()%1000+1000));
     
         pthread_mutex_lock(&sites[site_suivant].mutex);
         sites[site_suivant].personnes_attente++;
+        velos = sites[site_suivant].velos_dispo;
+        attente = sites[site_suivant].personnes_attente;
         pthread_mutex_unlock(&sites[site_suivant].mutex);
         
-        printf("(PUT) Habitant %d attend d'avoir accès à une borne du site %d\n",habitant_id,site_suivant);
+        printf("(PUT) Habitant %d attend d'avoir accès à une borne du site %d (%d vélos, %d personnes en attente)\n", habitant_id, site_suivant, velos, attente);
         sem_wait(&sites[site_suivant].bornes);
         
         pthread_mutex_lock(&sites[site_suivant].mutex);
         sites[site_suivant].velos_dispo++;
         sites[site_suivant].personnes_attente--;
+        velos = sites[site_suivant].velos_dispo;
+        attente = sites[site_suivant].personnes_attente;
         pthread_mutex_unlock(&sites[site_suivant].mutex);
         
         sem_post(&sites[site_suivant].velos);
-        printf("(PUT) Habitant %d dépose un vélo au site %d\n",habitant_id,site_suivant);
+        printf("(PUT) Habitant %d dépose un vélo au site %d (%d vélos, %d personnes en attente)\n", habitant_id, site_suivant, velos, attente);
         //usleep((rand()%1000+1000));
         
         site_actuel = site_suivant;
@@ -96,6 +107,8 @@ void *gestion_camion(void *arg)
         for (int i = 0; i < SITES; i++) 
         {
             pthread_mutex_lock(&sites[i].mutex);
+            int velos = sites[i].velos_dispo;
+            int attente = sites[i].personnes_attente;
             
             if (CAMION_CAPACITE > velos_camion && sites[i].velos_dispo > BORNES-2) 
             {
@@ -110,15 +123,23 @@ void *gestion_camion(void *arg)
                     aRetirer = sites[i].velos_dispo-1;
                 }
                 
+                pthread_mutex_unlock(&sites[i].mutex);
+                
                 for (int j = 0; j < aRetirer; j++) 
                 {
                     sem_wait(&sites[i].velos);
+                    
+                    pthread_mutex_lock(&sites[i].mutex);
                     sites[i].velos_dispo--;
+                    velos = sites[i].velos_dispo;
+                    attente = sites[i].personnes_attente;
+                    pthread_mutex_unlock(&sites[i].mutex);
+                    
                     velos_camion++;
                     sem_post(&sites[i].bornes);
                 }
                 
-                printf("Camion prend des vélos au site %d (Vélos dans camion: %d)\n",i,velos_camion);
+                printf("Camion prend %d vélos au site %d (%d vélos, %d personnes en attente) (Vélos dans le camion: %d)\n", aRetirer, i, velos, attente, velos_camion);
             } 
             else if (sites[i].velos_dispo < 2 && velos_camion > 0) 
             {
@@ -134,18 +155,29 @@ void *gestion_camion(void *arg)
                     aAjouter = spotsDisponibles;
                 }
                 
+                pthread_mutex_unlock(&sites[i].mutex);
+                
                 for (int j = 0; j < aAjouter; j++) 
                 {
                     sem_wait(&sites[i].bornes);
+                    
+                    pthread_mutex_lock(&sites[i].mutex);
                     sites[i].velos_dispo++;
+                    velos = sites[i].velos_dispo;
+                    attente = sites[i].personnes_attente;
+                    pthread_mutex_unlock(&sites[i].mutex);
+                    
                     velos_camion--;
                     sem_post(&sites[i].velos);
                 }
                 
-                printf("Camion dépose des vélos au site %d (Vélos dans camion: %d)\n",i,velos_camion);
+                printf("Camion dépose %d vélos au site %d (%d vélos, %d personnes en attente) (Vélos dans le camion: %d)\n", aAjouter, i, velos, attente, velos_camion);
+            }
+            else 
+            {
+                pthread_mutex_unlock(&sites[i].mutex);
             }
             
-            pthread_mutex_unlock(&sites[i].mutex);
             //usleep((rand()%100+100));
         }
         
@@ -154,7 +186,7 @@ void *gestion_camion(void *arg)
         {
             velos_depot+= (velos_camion-2);
             velos_camion = 2;
-            printf("Camion vide les vélos au dépôt (Vélos en dépôt: %d)\n",velos_depot);
+            printf("Camion vide les vélos au dépôt (Vélos en dépôt: %d)\n", velos_depot);
         } 
         else if (velos_depot > 0 && velos_camion < 2) 
         {
@@ -165,11 +197,11 @@ void *gestion_camion(void *arg)
             }
             velos_depot-= requis;
             velos_camion+= requis;
-            printf("Camion prend des vélos du dépôt (Vélos en dépôt: %d)\n",velos_depot);
+            printf("Camion prend des vélos au dépôt (Vélos en dépôt: %d)\n", velos_depot);
         }
         pthread_mutex_unlock(&mutex_velos_depot);
         
-        printf("Camion fait un tour, vélos restants: %d, vélos en dépôt: %d\n",velos_camion,velos_depot);
+        printf("Camion fait un tour, Vélos restants: %d, vélos en dépôt: %d\n", velos_camion, velos_depot);
         //usleep((rand()%100+100));
     }
     return NULL;
@@ -179,23 +211,31 @@ int main(int argc, char *argv[])
 {
     if (argc != 5) 
     {
-        fprintf(stderr, "Usage: %s <SITES> <HABITANTS> <TRAJETS> <BORNES>\n",argv[0]);
+        fprintf(stderr, "Usage: %s <SITES> <HABITANTS> <TRAJETS> <BORNES>\n", argv[0]);
         return 1;
     }
     SITES = atoi(argv[1]);
     HABITANTS = atoi(argv[2]);
     TRAJETS = atoi(argv[3]);
     BORNES = atoi(argv[4]);
+
+    if (SITES <= 2 || HABITANTS <= 2 || TRAJETS <= 0 || BORNES <= 4)
+    {
+        printf("Les contraintes suivantes doivent être respectées:\n");
+        printf("SITES > 2, HABITANTS > 2, TRAJETS > 0, BORNES > 4\n");
+        exit(EXIT_FAILURE);
+    }
+    
     
     srand(time(NULL));
     sites = malloc(SITES * sizeof(Site));
     
-    pthread_t habitants[HABITANTS],camion;
+    pthread_t habitants[HABITANTS], camion;
     
     for (int i = 0; i < SITES; i++) 
     {
-        sem_init(&sites[i].velos,0,BORNES-2);
-        sem_init(&sites[i].bornes,0,2);
+        sem_init(&sites[i].velos, 0, BORNES-2);
+        sem_init(&sites[i].bornes, 0, 2);
         pthread_mutex_init(&sites[i].mutex, NULL);
         sites[i].velos_dispo = BORNES-2;
         sites[i].personnes_attente = 0;
@@ -204,24 +244,24 @@ int main(int argc, char *argv[])
     {
         int *habitant_id = malloc(sizeof(int));
         *habitant_id = i;
-        pthread_create(&habitants[i],NULL,habitant,habitant_id);
+        pthread_create(&habitants[i], NULL, habitant, habitant_id);
     }
-    pthread_create(&camion,NULL,gestion_camion,NULL);
+    pthread_create(&camion, NULL, gestion_camion, NULL);
     
     for (int i = 0; i < HABITANTS; i++) 
     {
-        pthread_join(habitants[i],NULL);
+        pthread_join(habitants[i], NULL);
     }
-    pthread_join(camion,NULL);
+    pthread_join(camion, NULL);
     
     int total_velos = velos_depot;
     for (int i = 0; i < SITES; i++) 
     {
-        total_velos+= sites[i].velos_dispo;
-        printf("Site %d contains %d bykes\n",i,sites[i].velos_dispo);
+        total_velos += sites[i].velos_dispo;
+        printf("Site %d contient %d vélos\n", i, sites[i].velos_dispo);
     }
-    total_velos+= 2;
-    printf("Nombre total de vélos à la fin : %d (doit être %d)\n",total_velos,SITES*(BORNES-2)+2);
+    total_velos += 2;
+    printf("Nombre total de vélos à la fin : %d (doit être %d)\n", total_velos, SITES*(BORNES-2)+2);
     printf("Simulation terminée.\n");
     
     for (int i = 0; i < SITES; i++) 
-- 
GitLab