<divid="doc"class="markdown-body container-fluid"style="position: relative;"><h1id="Rapport-projet-LO41-Bartuccio-Antoine-et-Amalvy-Arthur"><aclass="anchor hidden-xs"href="#Rapport-projet-LO41-Bartuccio-Antoine-et-Amalvy-Arthur"title="Rapport-projet-LO41-Bartuccio-Antoine-et-Amalvy-Arthur"data-vivaldi-spatnav-clickable="1"><spanclass="octicon octicon-link"></span></a>Rapport projet LO41 Bartuccio Antoine et Amalvy Arthur</h1><h1id="Interprétation-du-sujet"><aclass="anchor hidden-xs"href="#Interprétation-du-sujet"title="Interprétation-du-sujet"data-vivaldi-spatnav-clickable="1"><spanclass="octicon octicon-link"></span></a>Interprétation du sujet</h1><p>Ce sujet de LO41 étant volontairement vague pour permettre de nombreuses implémentations différentes, et la contrainte vis à vis du temps étant importante, il était impossible d’ajouter toutes les fonctionnalitées proposées. Il a donc fallu opérer un choix pragmatique afin de rendre un travail le plus complet possible tout en s’approchant un maximum de la vision originelle du sujet.</p><p>Dans un premier temps, nous avons répertorié les contraintes auxquelles nous ne pouvions nous soustraire. C’est donc bien évidemment que nous avons conservé le bâtiment de 25 étages ainsi que les 3 ascenseurs et la borne interactive au pied de ce dernier. C’est à ce moment là que se sont posées les questions les plus importantes et pouvant potentiellement modifier complètement le résultat du projet : est-ce seulement la borne qui permet d’appeler les ascenseurs ? Auquel cas, puisqu’elle est au pied de l’immeuble personne ne peut redescendre autrement qu’en prenant les escaliers. Devons nous utiliser un bouton par ascenseur ou un système d’appel centralisé ? Si on ajoute un bouton pour les ascenseurs à chaque étage, à quoi sert donc la borne au final ? Est-elle uniquement dédiée aux visiteurs ou est-elle utilisable par les résidents ? Est-elle vraiment pertinente ? La rendre indépendante est-il vraiment un choix intéressant ? Allons nous empêcher certains ascenseurs d’accéder à certains étages ou faire en sorte qu’ils aient tous accès à l’entièreté de l’immeuble ? Comment faire pour le dépannage ? Comment peut-on déterminer qu’un technicien est plus à même d’intervenir ? Doit-on avoir plusieurs types de pannes nécessitant différents outils ? Combien tout ceci va-t-il coûter à la copropriété ?</p><p>Nous avons donc commencé par trancher sur l’utilisation de la borne. Cette borne aura une utilité assez limitée et sera cantonée à la recherche de l’étage d’un résident par un visiteur. Globalement, elle sera simulée par une fonction renvoyant l’étage d’un résident à partir de son nom. L’appel des ascenseur se fera en interrogeant directement le bâtiment qui se chargera tout seul d’indiquer un ascenseur à partir simplement de l’étage de départ et de l’étage d’arrivée souhaité. L’ordonancement des ascenseurs se fera donc directement depuis le bâtiment.</p><p>Nous en arrivons donc logiquement à une distinction visiteurs et résidents. Les visiteurs démarrent à leur étage d’habitation et se déplacent ou non selon leur envie. Les visiteurs, quand à eux, souhaitent rejoindre l’étage d’un résident dont ils connaissent uniquement le nom, ils demandent donc à la borne où celui-ci réside, et tentent d’y accéder en utilisant les ascenceurs.</p><p>Enfin, pour les réparations, il a été décidé, afin d’éviter de peser trop fortement sur le budget de la copropriété, d’engager un seul réparateur prêt à répondre à tous les cas pratique et toutes les pannes. Il sera appelé par les ascenseurs qui détecteront automatiquement les pannes et attendront leur réparation selon la disponibilité de cette ressource critique.</p><h1id="Mise-en-place-de-l’architecture"><aclass="anchor hidden-xs"href="#Mise-en-place-de-l’architecture"title="Mise-en-place-de-l’architecture"data-vivaldi-spatnav-clickable="1"><spanclass="octiconocticon-l
</code></pre><h2id="L’introduction-des-agents"><aclass="anchor hidden-xs"href="#L’introduction-des-agents"title="L’introduction-des-agents"data-vivaldi-spatnav-clickable="1"><spanclass="octicon octicon-link"></span></a>L’introduction des agents</h2><p>De l’objet à l’agent il n’y a qu’un pas, l’indépendance. Enfin, pas vraiment, mais presque. Nous avons eu l’occasion lors de notre cursus de travailler sur un langage orienté agent : le SARL. Même si celui-ci reste perfectible, il a su nous inspirer lors de la conception de ce projet. Même si nous n’avons pas le temps d’implémenter de la communication entre agents dans des contextes séparés le tout en architecture holonique, nous avons repris l’idée de l’agent et l’avons adaptée à notre architecture et notre projet.</p><p>Globalement, il existe 4 types d’agents dans ce projet : les ascenseurs, les visiteurs, les résidents et le casseur d’ascenseur (pour casser les ascenseurs de temps en temps). Ils sont chacun lancés dans leur propre thread et tentent d’atteindre leur objectif indépendamment tout en interagissant avec les autres. Ils réagissent également lorsqu’ils reçoivent un signal d’apoptose les invitant à mettre fin à leur existence dans le but de libérer les ressources, dans le cadre d’une fin prévue ou non du programme.</p><p>Pour y parvenir, nous avons attaché à chacun de ces trois objets une méthode <code>runnable</code>, qui prend en paramètre une référence vers l’objet lui même et qui configure le thread de manière à répondre de manière normalisée aux signaux. En effet, chaque agent se doit de répondre correctement aux signaux d’apoptose (attachés à SIGUSR1) et d’ignorer les signaux d’arrêt (SIGINT) pour ne pas qu’ils l’interceptent à la place du thread principal puisque la réception de signal dans un environnement multithread n’est pas predictive.</p><p>Attention en utilisant l’API pthread, envoyer un signal (avec <code>pthread_kill</code>) vers un thread terminé a un comportement non défini d’après la spécification du standard. On observe ainsi des comportements très variés selon l’OS. Pour pallier à cela, nous avons mis en place un système de déréférencement des threads terminés.</p><h2id="Le-choix-des-scénarios-prétirés"><aclass="anchor hidden-xs"href="#Le-choix-des-scénarios-prétirés"title="Le-choix-des-scénarios-prétirés"data-vivaldi-spatnav-clickable="1"><spanclass="octicon octicon-link"></span></a>Le choix des scénarios prétirés</h2><p>Dans ce projet, nous avons fait le choix de ne pas effectuer de génération aléatoire de clients. En effet, le programme opère vis-à-vis de scénarios pré-tirés injectables directement à l’exécution du programme. Cela permet notamment de facilement reproduire en phase de développement les différents situations pratiques non souhaitées par le développeur dans une optique d’amélioration de la stabilité du programme… Ces scenarios se présentent sous la forme de fichiers textes au format csv où les différentes données sont séparées par des points virgule.</p><h1id="Architecture"><aclass="anchor hidden-xs"href="#Architecture"title="Architecture"data-vivaldi-spatnav-clickable="1"><spanclass="octicon octicon-link"></span></a>Architecture</h1><h2id="Diagramme-des-classes"><aclass="anchor hidden-xs"href="#Diagramme-des-classes"title="Diagramme-des-classes"data-vivaldi-spatnav-clickable="1"><spanclass="octicon octicon-link"></span></a>Diagramme des classes</h2><p>Puisque nous respectons aussi rigoureusement que possible une architecture objet, nous sommes en mesure de vous fournir un diagramme de classe du projet.</p><p>Nous avons tout d’abord commencé par faire une liste chaînée afin de tester notre architecture objet.<br>
<imgsrc="https://i.imgur.com/0QwVT5k.png"alt=""></p><p>On observe en particulier la singularité de l’objet SharedData, vis-à-vis en tout cas de ses pairs. En effet, celui-ci opère en tant que singleton et permet notamment de référencer et déréférencer tous les threads, et ce quelque soit le contexte dans lequel opère le programme.</p><h2id="Réseau-de-Pétri"><aclass="anchor hidden-xs"href="#Réseau-de-Pétri"title="Réseau-de-Pétri"data-vivaldi-spatnav-clickable="1"><spanclass="octicon octicon-link"></span></a>Réseau de Pétri</h2><p>Même si notre architecture initiale limite déjà fortmenet les possibilités d’interblocages, il était judicieux de modéliser de manière abstraite le fonctionnement théorique et basique de l’attente d’un utilisateur à un étage à l’aide d’un réseau de Pétri. La priorité est ici simulée par un nombre d’étapes plus ou moins faible pour chaque ascenseur. Il faut cependant ne pas oublier que les ascenseurs devant être intelligents et autonomes, il est impossible avec un outil tel que le réseau de pétri de modéliser fidèlement leur comportement. Ce réseau ne donne donc qu’une vision simplifiée du principe et l’implémentation s’en éloigne parfois.</p><p><imgsrc="https://i.imgur.com/nbTpyfB.png"alt=""></p><h1id="Guide-d’utilisation"><aclass="anchor hidden-xs"href="#Guide-d’utilisation"title="Guide-d’utilisation"data-vivaldi-spatnav-clickable="1"><spanclass="octicon octicon-link"></span></a>Guide d’utilisation</h1><h2id="Phase-de-compilation"><aclass="anchor hidden-xs"href="#Phase-de-compilation"title="Phase-de-compilation"data-vivaldi-spatnav-clickable="1"><spanclass="octicon octicon-link"></span></a>Phase de compilation</h2><p>Le logiciel utilise la technologie cmake pour gérer le projet. Voici donc les étapes nécessaires à sa compilation.</p><pre><codeclass="shell hljs"><spanclass="token function">mkdir</span> out
</code></pre><h2id="Exécution"><aclass="anchor hidden-xs"href="#Exécution"title="Exécution"data-vivaldi-spatnav-clickable="1"><spanclass="octicon octicon-link"></span></a>Exécution</h2><p>Ce programme peut s’exécuter avec ou sans arguments. Sans arguments, le logiciel ouvre automatiquement les fichiers …/residents.txt et …/visitors.txt. Avec arguments, il est possible de choisir de lancer des scénarios personnalisés.</p><pre><codeclass="shell hljs">./LO41 <spanclass="token punctuation">[</span>fichier_residents fichier_visiteurs<spanclass="token punctuation">]</span>
./LO41 <spanclass="token comment"># -> correspond à ./LO41 ../residents.txt ../visitors.txt </span>
<aid="tocLabel"class="ui-toc-label btn btn-default"data-toggle="dropdown"href="#"role="button"aria-haspopup="true"aria-expanded="false"title="Table of content">
<divclass="toc"><ulclass="nav"><liclass=""><ahref="#Rapport-projet-LO41-Bartuccio-Antoine-et-Amalvy-Arthur"title="Rapport projet LO41 Bartuccio Antoine et Amalvy Arthur"data-vivaldi-spatnav-clickable="1">Rapport projet LO41 Bartuccio Antoine et Amalvy Arthur</a></li><liclass=""><ahref="#Interprétation-du-sujet"title="Interprétation du sujet"data-vivaldi-spatnav-clickable="1">Interprétation du sujet</a></li><li><ahref="#Mise-en-place-de-l’architecture"title="Mise en place de l’architecture"data-vivaldi-spatnav-clickable="1">Mise en place de l’architecture</a><ulclass="nav"><li><ahref="#Le-choix-des-moniteurs-et-des-threads"title="Le choix des moniteurs et des threads"data-vivaldi-spatnav-clickable="1">Le choix des moniteurs et des threads</a></li><li><ahref="#Une-architecture-orientée-objet"title="Une architecture orientée objet"data-vivaldi-spatnav-clickable="1">Une architecture orientée objet</a></li><li><ahref="#L’introduction-des-agents"title="L’introduction des agents"data-vivaldi-spatnav-clickable="1">L’introduction des agents</a></li><li><ahref="#Le-choix-des-scénarios-prétirés"title="Le choix des scénarios prétirés"data-vivaldi-spatnav-clickable="1">Le choix des scénarios prétirés</a></li></ul></li><liclass=""><ahref="#Architecture"title="Architecture"data-vivaldi-spatnav-clickable="1">Architecture</a><ulclass="nav"><liclass=""><ahref="#Diagramme-des-classes"title="Diagramme des classes"data-vivaldi-spatnav-clickable="1">Diagramme des classes</a></li><liclass=""><ahref="#Réseau-de-Pétri"title="Réseau de Pétri"data-vivaldi-spatnav-clickable="1">Réseau de Pétri</a></li></ul></li><liclass=""><ahref="#Guide-d’utilisation"title="Guide d’utilisation"data-vivaldi-spatnav-clickable="1">Guide d’utilisation</a><ulclass="nav"><li><ahref="#Phase-de-compilation"title="Phase de compilation"data-vivaldi-spatnav-clickable="1">Phase de compilation</a></li><liclass=""><ahref="#Exécution"title="Exécution"data-vivaldi-spatnav-clickable="1">Exécution</a></li></ul></li></ul></div><divclass="toc-menu"><aclass="expand-toggle"href="#"data-vivaldi-spatnav-clickable="1">Expand all</a><aclass="back-to-top"href="#"data-vivaldi-spatnav-clickable="1">Back to top</a><aclass="go-to-bottom"href="#"data-vivaldi-spatnav-clickable="1">Go to bottom</a></div>
<divclass="toc"><ulclass="nav"><liclass=""><ahref="#Rapport-projet-LO41-Bartuccio-Antoine-et-Amalvy-Arthur"title="Rapport projet LO41 Bartuccio Antoine et Amalvy Arthur"data-vivaldi-spatnav-clickable="1">Rapport projet LO41 Bartuccio Antoine et Amalvy Arthur</a></li><liclass=""><ahref="#Interprétation-du-sujet"title="Interprétation du sujet"data-vivaldi-spatnav-clickable="1">Interprétation du sujet</a></li><li><ahref="#Mise-en-place-de-l’architecture"title="Mise en place de l’architecture"data-vivaldi-spatnav-clickable="1">Mise en place de l’architecture</a><ulclass="nav"><li><ahref="#Le-choix-des-moniteurs-et-des-threads"title="Le choix des moniteurs et des threads"data-vivaldi-spatnav-clickable="1">Le choix des moniteurs et des threads</a></li><li><ahref="#Une-architecture-orientée-objet"title="Une architecture orientée objet"data-vivaldi-spatnav-clickable="1">Une architecture orientée objet</a></li><li><ahref="#L’introduction-des-agents"title="L’introduction des agents"data-vivaldi-spatnav-clickable="1">L’introduction des agents</a></li><li><ahref="#Le-choix-des-scénarios-prétirés"title="Le choix des scénarios prétirés"data-vivaldi-spatnav-clickable="1">Le choix des scénarios prétirés</a></li></ul></li><liclass=""><ahref="#Architecture"title="Architecture"data-vivaldi-spatnav-clickable="1">Architecture</a><ulclass="nav"><liclass=""><ahref="#Diagramme-des-classes"title="Diagramme des classes"data-vivaldi-spatnav-clickable="1">Diagramme des classes</a></li><liclass=""><ahref="#Réseau-de-Pétri"title="Réseau de Pétri"data-vivaldi-spatnav-clickable="1">Réseau de Pétri</a></li></ul></li><liclass=""><ahref="#Guide-d’utilisation"title="Guide d’utilisation"data-vivaldi-spatnav-clickable="1">Guide d’utilisation</a><ulclass="nav"><li><ahref="#Phase-de-compilation"title="Phase de compilation"data-vivaldi-spatnav-clickable="1">Phase de compilation</a></li><liclass=""><ahref="#Exécution"title="Exécution"data-vivaldi-spatnav-clickable="1">Exécution</a></li></ul></li></ul></div><divclass="toc-menu"><aclass="expand-toggle"href="#"data-vivaldi-spatnav-clickable="1">Expand all</a><aclass="back-to-top"href="#"data-vivaldi-spatnav-clickable="1">Back to top</a><aclass="go-to-bottom"href="#"data-vivaldi-spatnav-clickable="1">Go to bottom</a></div>