Réentrance

Un article de Wikipédia, l'encyclopédie libre.

En informatique, la réentrance est la propriété pour un morceau de programme d'être utilisé simultanément par plusieurs tâches utilisatrices. La réentrance permet d'éviter la duplication en mémoire vive d'un programme utilisé simultanément par plusieurs utilisateurs.

L'écriture de code réentrant était autrefois une tâche très ardue. Elle s'est simplifiée avec les langages actuels qui autorisent :

Le noyau d'un système d'exploitation comporte souvent des parties non-réentrantes afin d'éviter des complications fâcheuses (incohérence de données critiques, perte de performances). L'écriture de modules destinés à être exécutés dans l'espace noyau reste, pour cette raison, délicate.

[modifier] Réentrance et langages de programmation

La réentrance des programmes n'est pas forcement garantie par tous les langages de programmation. Ainsi, par exemple, un code écrit en Ada sera toujours réentrant alors qu'un code écrit en C ne l'est pas par défaut. La non-réentrance d'un code n'est pas problématique dans le cas de la programmation mono-tâches, mais peut produire des résultats désastreux en programmation concurrente.

[modifier] Relation à "thread-safe"

Les deux concepts de réentrance et de thread-safe sont à propos de la manière dont les fonctions gèrent les ressources. Le concept de réentrance a un impact sur l'interface externe de la fonction, alors que le concept de thread-safe concerne l'implémentation de la fonction en elle même et non ses interfaces externes.

  • Dans la plupart des cas, pour transformer une fonction non-réentrante en une fonction réentrante on doit modifier son interface externe pour que toutes les données soient fournies par l'appelant de la fonction (pas de variable globale utilisée dans la fonction mais uniquement des variables locales).
  • Pour rendre thread-safe une fonction non thread-safe, un changement d'implémentation seul suffit. De manière usuelle l'ajout d'un point de synchronisation tel qu'une section critique ou un sémaphore est utilisé pour protéger l'accès a une ressource partagée d'un accès concurrent d'une autre tâche/thread.

La réentrance est une propriété plus forte que le thread-safe et par définition il apparaît que:

  • toute fonction réentrante est thread-safe.
  • une fonction thread-safe n'est pas forcément réentrante.

[modifier] Voir aussi