2.2.1 Stratégies de concurrence

Pour mieux répondre aux besoins des clients qui accèdent simultanément à leurs ressources, les serveurs Web doivent traiter plusieurs requêtes à la fois. Pour cette raison ils doivent utiliser une politique de concurrence qui permette l'exécution simultanée de plusieurs tâches. Par rapport à cette politique de concurrence, on peut distinguer plusieurs types de serveurs Web ([Hu98], [McGrath96]) :

  • itératif : un serveur Web qui n'implémente aucune stratégie de concurrence au niveau applicatif; chaque tâche est traitée jusqu'à la fin.

  • concurrent avec un seul fil d'exécution (single-threaded concurrent) : un serveur Web avec un fil d'exécution de contrôle servant chaque tâche en attente jusqu'à ce qu'une quantité prédéterminée de travail soit réalisée ou qu'un timer ait expiré.

  • un fil d'exécution par requête (thread-per-request) : chaque tâche s'exécute avec son propre fil d'exécution de contrôle.

  • groupement pré-établi de fils d'exécution (thread-pool) : le nombre de fils d'exécution est établi d'avance, et les tâches sont reparties aux fils d'exécution disponibles.

  • un processus par requête (process-per-request) : pour chaque nouvelle requête un nouveau processus est crée (l'équivalent de la commande UNIX fork).

Les politiques de concurrence présentées ci-dessus ont des avantages et des inconvénients, et en fonction de leurs performances on a plusieurs générations de serveurs Web ([mcgrath96]):

  1. serveurs Web de la première génération : les serveurs qui démarrent un nouveau processus pour chaque nouvelle requête (20 requêtes par seconde – rps - sur un SPARCstation20 à 75 MHz – performances mesurées en [mcgrath96-2]).

  2. serveurs Web de la deuxième génération : les serveurs de type thread-per-request ou thread-pool (performances : 100 rps).

  3. serveurs Web de la troisième génération : les serveurs de type thread-per-request ou thread-pool qui utilisent les connexions persistantes du HTTP1.1 (performances : 300 rps).