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 zcmb<-^>JfjWMqH=W(GS35buBxM8p9?F--7=G8h;b92hJZco`fR<Qe1`*cccXSioWs zd6;?_eS--i4x>3BTn1*SJ_!(mfq?;?mVv5+(I7X0gg`XNJ`ful{=o$ih0zQG5I#sB zD~Ji@!^B~9s31s^fdNLt#6kMN_8CCr8PI44up|Qmj7HW63L6Dmh&}~hRQdxnTvkB+ z57P${2I(_^>N9}qgV7&A4q{+nfYGq<1UUnQEuiM1(`e3SK-ZT6)rU^IK%C70qd|6n zgo2-zq=4Ay_Q3eK><fVE<1hx9!oYw|!|Z|4AUi-R1D}?pfWigDCI-WzIS6VWu6TF= z3UCGn1{e(uUIzV~%p@}t{hSotoXot^3f&3|GhH(iz2ba5Be3-#cPTJ1Fo4pOyI&{+ z69dBmkQg)=8JHR%e3*G4IS~d1aJmPn=Ut}rVA+e5zV>YvbIYCLK3H<E{0~wCayLj1 zNDas$ka<uig18`i7$g}Oz<CrL9*m73aVC(M6axdp#nf}TmY=#|*#;zsf^`@e7@%1j zMZ6t{xDq1+1IV8!iWwLfR^U+2i$h!*hxkGq;?6k4Z{iT&h(mk<4skmi{xZa&{t*uG z1{~s`Fa}}taErvDz8Z(PFAjH_;ZT1Jhd3xrVRKIg4)vRGh;L_LU{FH$6axdpOa=x9 zK?W%Xg#d^otbAc8PR)%^Ni8lZ%CBT7C@m=l3uNYHmN3M}7ndX^XU8XJWXGo^X67)Y z6{V&!lw{_nG8B|#6s0Dn#AoGa=D|6+r6s8q2(zF{l8aIkOAtCBigNOkvl$Xg@-rE7 z6LWI%lNsXUb25{XK^7L3#OEev<}nnPq@)%VF{Bj~W#*Nnfn8Oem|4P5T$GrX!Vn*y zT#*=`mYJ8BlUapsI@t9fe--2xm!LVXG!JYy$Tm=6VaDL@<LTraZ=`1eXBi`yMtY_U z@tz^R@hPcAsp*-;C8<RrzRo%Md8r|ZNja$u@$u=o`FT)h$3v82Rmi}=z{J4Jz{tSN zz{J49zy#)jNJcOlBnOg#$b(oQIZ(L*68X-+0IPl&L^3mZK{Yz4NdPK~woIJH1}e3< z86j#)r7}4|c8P%!6axbTtX_k~_X1%^{A)n#Etq%$RGb4XeZcrP{2}^4Wg5s`5FP`= z10-=!SqKw<fh5iY69m<ZNa9c{!LmP)#6e{xSP<lXsCz)=IH>%DiCaL`vqQ^Tn79Ly zIH<gaiF+W4gUo`72Ox=q{00+`KoSSp0TWL^5{HEyNG=0OoD(Df#RW*>(54SqrUFTv z8!Q4L8j!?6Wi>>UfuRFQoDU|*z`!s8Nt_=^d<K#@D4oEh79fd3n^a(_6-eU9<<JHs zaZvpTR?NV_umee46eh^Pz;FObTntJ41d_NolK2HAaS0^xQRZj}jE2By2#oX)_{=Z& z%cJ=XhetQ-O?w6gkJbYvO#d%<G#}wO3=W$ArcCw>4F6SG>=_vN<sBG6>OpNrhL?~2 z|Noyh0n7)r1zui4@Ie*$%R>l0sN#OP3Bd<doG%w4_@D~&<s<|jR8hWcLhwNq<jW!i zA5<~EOhWKM72?Yv1RqopzH~zHK^5RjBLpARV0fv7;Dai{mqG|Wr~-V+gy4fJzL%f= z!Tk%W@LoPb@Ie*b%S#A8sDgWW2*C$6L|$%!^Z%>X*)cGr@yoj~fWz~@>N;Cg{xUTF zJT(3^G=3i%zYUFFhsG~M<L9CA)6n>FX#6lVz8@Oj4UKPy#y3Ob>!I=0(D-s_d@&Th z;aktni*X*Ek35>6d<Y0}H9TN=(xcZljgx`lzvyQh28J(bdi?S&;PmX#Yb$BXz~Ir# zDg>e|f0T%NbhBQwfh2v-{}1@(L0vkA!%*6z*Y+hyve)zxh|>J$(fPsS;5&PdgFl!( z7>{{e{8u94(apLPB-whPgya7MNW8-IgYrj%?Oq!O28L4YP>*KYCJ@u3^Jxi>N4IU8 z4FkiAmw*5Nf06S4|NmpGQ*9U+7-J9f%fsyl>3>=N|NnmwBh;hwsYml01&_|!7arZN zFS;2zU4OiI`S1V#Zr)-W28Nm6e|Cm`0LgfC9)Gd$@BjbDUB7_5{c;vF1H+30V1-^V zg@3wT|5&?zD0%MD&FgBzz|igb!6W&CN9P5PgAbTJG(i-L2jdBk<^vue<BI<M|L@Vw zD~(%acYsUtA;!)C7mse<FV+MN1i7y}^h3AnkIrKry{uKz3=AHf$9I6-`$F|E*s^ta zOzAxS;`|@5st!D=ppM@PF)t3c%I*M%=2wiJ0S+GByyp0nxqy{{{3w8187$ED{`vnO z$&bgRko@Qfas4SPd?BR(3VL&h$^~GRfAB@pS%}Iq+$xbH$se~em<Rs+26^BQERsx- zJ<#wQ9Q>SkO#ypA4WjbCCCICIJ-`F;z*gKUK@kN?WuS=a!>0@pQR%pq!Tc!#aiJ|9 zm7T|5towx$8u^k)(OCqNbN$ol`oW`@mDLg~^THMse5~@83=GW&7&}?TK*GJO&n+Ob z^MC#S-|YH@v72?T1p|Yn>lgl>@IU|mgR{WN!$>*az@xMF#&K8hAf-ny>vE|6`yeYt zYb_WUx>>6&7#R51U+8At1TyMSy|PCyYdut*`LF-~J$hL`NI<Mz@$>)xmyRspQZNRp zMC2E!uy_K>d@s$I85lgec@074x<0{|+~PnUsC~f9-(SrLa>Orl28P}OP%-hv92C`9 zHFrBWSRUi=_hbayavHC~ZqeoD3=GY$m^3eRy1v)}YB*@SKCpCsQO6DAbh^Iq=;m#~ zYmBAqiyC#0Zr(V&s+wOgcDlYe?)nB43a{%ux_R|*s|V#v{~zECz=2y8D6xV|m1frm zj2_**cg=7Hi%0VTa9;8H0ZJ5a7`t8HSi8R9?<xHcN^=joU7vu9$!u|OB!bh(i+|t$ z|9=??3CJegMt3_nH2+}a@7HH!U}&y=z`)<93en?-SI;g`J5KXZC#a16VD0*#j;-7E zL8t47ZeAfXP~4gF<JA74+rdHeVCSjM&_CU-AFN&ffb@d$2DCx~hwcSaf`Re&8#siQ z;Z_L>VQ_KKoC^-&YTQaeQTFB=D0IItcDsJDcKv`6y1rsap}PQLxh5VHq1DSZu&GZN zyIJ3ufHLwE{+`{Sf~=R-#uRMe3zP5v|2Nk@V5+n1c74zr@UNSd&y<0I@j@pnn<)bW zG;4RW{xo4=07o+mvO~nb{r~?up_}!#2?Imxfx58f+6RpF0Xsm^qYa9YAKk16!1n&A z<LqYL3Npj>M>p#l69xut*B_m%i%mcQ{e#i<K{xAkkSwUaeIyEY86+WX{R%E2`b@xL zFWA2Q|KBZ|1J?Ec?4B>ks@uQ*|NpY&H%3Vn?9u!tqO*35M`!7R6pwBeRSgD^d9E)E z4|sGw@aR0;T)T#~MBk&^b%95>fJZm$JY!HH#CsoX_&Ip(pZ@j#{~h2?MF*&q0x54k zz~RviY9G8<_4WV%PSzHXPKbm6RAM4nA|D|k0hOo#OGF_g6rd9EU<p@a28R8hEdS#F zm;e7ekH5I_<^TU~Rwa;njP_9H@fSb8{QvLK$tq+FD)AVgs+wOhdUS?f@R;GzD{>TM z*bY!9!K3*FqX*-KeIWKOkf_J^ZywnP1UxzqdNe*{_y98Kk%#6f56dehLLQB8K*O*e z%{?kVKs}DvFFiUBH9q>!&%ofJc?H34y;LHg3KngC!QsL9z@wRi0TjH=2iQFhzF-Eo z-a1`x9CzISvhn3R29P@wj2IZ2UodqZ^XTS{Fajlq4cH3y&QJS5nm{>43FOUgUTxfp zK_wQrjDYKT_ZggBzZ>GT094<?mH+<?YPlXY1Q#ZUaBBL{8~6{>Fq?-{&57d<;3>mq z*A0x_tZ9azT)2V1hxtFKTH6Bh(`)bjpz7m=708X9t`9uAT_1FZZs`>0cHM%AHji%C z8y>wjOdwfMEcLQBgTkTn5ZKW#WIuz7k1dSdtn6Sbw$!Zh=yg4@6J&u$uc+sb|Np@X zK>_&j6Uc6G{(3DBGPgT)hez@yk8YL=a5Zl~fy~>%*v-1#0OaHyHP<}4T~EN}&wc_W z#m5E=44tlfj=LTJ+4DNdqnme%0Vs$MV2i_U2M0#iJs#b>1$fj1ICQ%n0O#x}LZCbf zZFjHz2y)K>#%@++uzL>FOm24F!_>{HV8FltF1EN0K<$h}y#Y+!u6w`+6e1gt^ATK- zKn;Ci`w<idN5Iam1J!@}AZH)J=4?=q{R8Rl=G~4*6||PT0#VtES0%XL^6CS~OGg;H zSp)PzL41V2r}#hEkqP=>pT9T(%7?wI6QSIlAZ|CS5tJMC0b0&^bl&mk4t<g0p)CR~ z*h*Mm<bjpO{(v;rz~d<JkrR-gNAYL~jE2By2#kinXb6mkz-S1JhQMeDjE2By2#kin zXb23B5CE+Y1i3`R-8Dp0!6Pv#vm`OEL_sx0A+e++H7`Y>G*6-I@XDNgg~U>Y;>?m% z1=SSL^g5>cf+9T188iYyv74Wwo>-QjS)`DdoP2mivBKd63Z;3e3Q74zd8rC1C{}`; ziN&0h!z&B&i&Jqp)HyLXGe1uuv8d?qs*+TN;`}^?lA^@2#LOHWg_8WzVuhU4VvtBy zYDqCjwnQN{EiE;<r1bF0Vm$^12B?0B=TcIOA%Rhh6dDQ|VW99SR!B+AD^^Gb+h?Vq znxY8`CYXMhBS|&^YJXW~N-Ef?;J5%=4>I!bmJ+!2sd)-eA%yL?-JenlQ;pvMsQqb) znI)hQF3B$~(t(9RQED+Lu@r;sgA1ZM0~`jRhzl)FOi#5^P%T!l3HA(e4YpIT@o;qV z3~}@e0kK1Z9KBq@EGPdUKi6P8E{0%8VpB-Y&nrpH%qs?^$)w8c)MBuie)+jcMX3rU z`6Y=t3Mr{DCmmj(kdvs8mYJsja+HEbN`7XE!r@gVMWA%62{JUdG$*kHlq5=0i*hsb z4zElFMKc4VG_y5m01>p*MB?uM{}l`j3>o+S{|Bufueb*p0orl@|NjIA28M+X{{O$g zz`!v1$^ZW!7#J9AU;h6u02;1lU|@i)VPvcdVqmNgV3g)z=a|3<5eF^G54ivTzZxh& zT-ZT_!VD@53=Ad=3=A{w{Qn;SGJ{XRjZeahpSzr+fx%wNQp;EcyxbaOZVYJs<K6%N z!5TqkK<z65t(Uy}|GxuBKU5rKR}TXN!^!*q|9=9lzj5UgXk&8bWn+HH%)`#X0FqzB zz`!v3@&Es;K;xot`GqVXdC;2wGYkw2sxSWkX9lg$fyuizGc$h$D}mZHN{xoVXb6mk zz-S1JhQMeDjE2DQ3IW)DCfNQZSQ87hXA0y~&{AR$4Vt+J(V(ToAlgF_L^6Q)YJyk_ z(EU)LeUKnNXbCfjhV40m?Uw?z%Ru5V`LF-}=Y#kgKy5haep3)X0klS%fdRb#8pOW= zl?OMD85kJSp$-KteFn+H_P!wRr2&aUwJ|6__sM|Plz_w^K=p&#oghA_T@0dOdut>> zYpxj>7+~TKPzOUPh8rNo3=9lVWehO;<)Gp)b-({Z{Kv=u*^>MZ%7^e682&@~Q0IV_ zOn}4V1k~c6P<fa?pvF^;g6+FTH_!mu2zP+e0Z=*tN*6%s1}HrNN-u!Y8=&+7D18A+ zKY-F7pfm$$Z8>Ov9+Xyq(gsl40ZIoz=>#Z^?p{KC*giaWXJ;z~jnJghypmD{Lt{N- zJp)~{QZU!3&d5a1z(f-&jNe31e6cWm{Ew~*lpYuvSQvVs5eDjKfYgAN$YWCvN-s<d z0t_EOYwAG?p%|nOB(4C`2o(cSpl#(Kaaeu@iGi>ucpsk>g9dcJAIN<m@lde17y~T- zfy6+#2E3zEfB}~OL1G}>0ah;x-}eX-1L5W1^9(Tk3vwPde}Vd5j0_?SHlWTQ$N(ga zO+9G!5F>*)1A2Od?9vd1@1utqa}DfH33$GSiG$WQq6H;b>MxG{zEX^keZ2|La09LA z0%_2|u`l^ASX`2U0jeIP7KCG%Am;Qy#X((8khlvY_WkG)IK(r-`%onr1fb@C%mCp6 zka{LT23WZZ5(D8fsQX=@>S6XafYgH&pkYoX?CzP3L;YSH;uoRzcA(k&7>D|=Q1uRI z>VHH1iyodFINT}2gnhrhHYog=BpG1&9Oi8cusH$@v!Mk$cr1W{fx#W59&}Ow^dJXV zxP^hmr5F}K-3dz%8DMi@rXuJ{9OAQZh_7V=?K75QH~}>uW)dS<y#NF3ToUjY3IhYf zCaCyIP)1{5U;vMGFfcIehPpEVY7VTvIS4f$woe^q{#mFwuFwh?Jm$f`z;FpH4pW7o zpWzS(9q<6!2k!&57Zz^p%#if&fhNw+j6J<6fYdW#rgI%;?D6Y{!<;xA;<e1!_wmmF zsb}H=MFPUJ3=9nOK;kGO5YAQ{;!kj-^D7{KVLK-vIJv0AP%ob$K0YxiGrlA-ogulX zq`0IsEln?(0kJ(kz9ct38MHyZm?1tsB|knrCqF4MCqAVlzo<Aqv9y9AIX|}`C$%Is zMb7}c3ec|p%=pBjqQuJh)Vz|SN`|ze#N5>Ql+xVXN{0A&Bwjpdr$36)k^()@VFGSJ zj=rw(u6{1@@eJ`Uk$#T8p3V&M@$P=1@va{65LpkGAclB%AAcuDpLl;aw_w+h_z*`Y zAJ=&BIR_4~a{<6d0HB{v0GBm3VSt=yP*Ri#8lr|A0e}b&l+yx0M-qU}FhJG~I&uNd z2iujJl30?+01gEP_z*0{VGM9RCTIs7K+kf3%Y)1WSqwT00WN54!T@z}JajlcwHR`; z0$d45A9y4f6ibOEiI77M7@+4dpeRE>1tC7AI6pokF)t-2l_5Q~7&Mw24;go7i1+l5 zFD^;R%!@BAPECP^U0G^QesO$CYC(Pp_;?8v!(m5FK!O=^d;^LC$O#fCLh-42DGV9V zxe^A@tOzJICKVS$JpnmjA~hGBe&9Nd5kUz#v;tWMGVIL&9R~-WT>+N{1yy`}h_5p& z#eq(Yz<LY>%rl^KGvL~h?1gv|l&ayf5W|sAyFir!DF&a8fgbS~#)1yMK+y|1Vgp5p zL9e(nw<Ix%L9e)^2tsGTSebbxsYL}0dU^RJse0*orFsQL`30#(C6!1*Nu`-NDY}^{ zP$5SrPhC(^0al)oSe(J2mr|KmT$u}@ONto4GG(bn#hLkeD4h5r2EC%xoJ5cYD61f+ zgh3DNU%i5y620{N5(Y4%I5n9;uOzjigh4MYGcS`tuP7g!hxAf2pru7dN)ZE`2QdRu zY(R9t*eR8HiMg4{40;glNyWtsddc~@xv6=eA$&-IN+AjAUxM1Uuznn_bG2aBfYid+ zAX*vPr-SK-o#zCjq0Ir1QZR<qt6&ZT0|V$>8c^2^rXT%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