Portail informatique 2019-2020

Systèmes d'exploitation

Avant de commencez, assurez vous d'avoir terminé le TP précédent. Vous pouvez également vous baser sur le code disponible dans la branche tp2_base du dépôt git :

Lors du précédent TP, nous avons parallélisé le serveur en créant un thread à chaque connexion. Cette solution gaspille des ressources inutilement.

Pour éviter ce gaspillage, nous proposons de créer, au démarrage du serveur, un pool de threads. Ainsi, lorsqu'une nouvelle connexion est détectée, son traitement est délégué à l'un des threads précédemment créé.

Quel est le pattern de synchronisation à mettre en oeuvre ici ?

Il s'agit d'un producteur-consommateur.

  • Le thread principal produit des requêtes à traiter ;
  • Les threads du pool consomment les requêtes.

Implémentez ce mécanisme et évaluez ses performances.

Pour évaluer les performances du serveur, vous pouvez utilise l'outil ab qui mesure le temps de réponse d'un serveur web. Par exemple, avec la commande suivante:

ab -n 100000 -c 4 http://localhost:8080/

Ici, ab envoie 100 000 requêtes à l'adresse http://localhost:8080/ avec un degré de concurrence de 4.

Parmi les fonctionnalités implémentées par le serveur (add_user, list_users, etc.), certaines modifient des structures de données, et d'autres ne font que les consulter.

Quel est le pattern de synchronisation à mettre en oeuvre ici ?

Implémentez ce pattern de synchronisation et évaluez ses performances.

Actuellement, les données (utilisateurs, messages, etc.) sont détruites lorsque le serveur se termine. Cela oblige à récréer tous les utilisateurs et leurs interactions à chaque redémarrage.

Une zone de mémoire partagée IPC permet une persistance des données: tant que l'objet IPC n'est pas détruit, les données sont conservées.

Utilisez un segment de mémoire partagée pour conserver les données (utilisateurs, messages, etc.) lors du redémarrage du serveur.

Le corrigé de cet exercice est disponible dans la branch tp2_corrige du dépôt git.