Situation de compétition

Un article de Wikipédia, l'encyclopédie libre.
Aller à : navigation, rechercher

Une situation de compétition (ou concurrence critique, course critique, séquencement critique, situation de concurrence ou accès concurrent[1] ; race condition en anglais, littéralement « situation de course »), est un défaut dans un système caractérisé par un résultat différent selon l'ordre dans lequel agissent les acteurs du système.

Une situation de compétition peut survenir dès que plusieurs acteurs ont accès à une ressource et qu'au moins l'un d'entre eux est susceptible de modifier son état. Cette définition implique que les systèmes dont les ressources partagées sont immuables (dont l'état ne peut pas changer) sont immunisés contre ce problème.

Les situations de compétition sont des problèmes particulièrement difficiles à identifier et à corriger puisqu'ils ne surviennent que suite à l'ordonnancement particulier et difficilement reproductible d'une séquence d'événements.

Logiciel multitâche[modifier | modifier le code]

Une situation de compétition peut survenir dans un logiciel multitâche lorsque des données (mutables) sont partagées sans précautions entre plusieurs tâches. Prenons l'exemple d'un système industriel qui comptabilise la production d'une machine. À chaque fois qu'une pièce est fabriquée, la routine ci-dessous est exécutée:

QUAND nouvelle_piece
  total_pièce := total_pièce + 1
FIN QUAND

Cette routine incrémente le nombre total de pièces fabriquées. Mais si d'une manière ou d'une autre le logiciel est susceptible de réagir à la production concurrente de deux pièces, une situation de compétition survient. En effet, bien que sur une seule ligne de code, l'instruction qui modifie le nombre total de pièces n'est pas atomique et se décompose en instructions élémentaires de chargement, incrémentation et stockage un peu comme ceci:

QUAND nouvelle_piece
  CHARGER accumulateur  ← total_pièce
  INCREMENTER accumulateur
  STOCKER accumulateur  → total_pièce
FIN QUAND

Ainsi, quand deux pièces sont fabriquées à peu près simultanément, la séquence des instructions peut être la suivante:

nouvelle pièce
machine A
nouvelle pièce
machine B

CHARGER accumulateur ← total_pièce

INCREMENTER accumulateur

CHARGER accumulateur ← total_pièce

INCREMENTER accumulateur

STOCKER accumulateur → total_pièce

STOCKER accumulateur → total_pièce

En déroulant les instructions dans ces conditions - même en supposant les deux accumulateurs distincts - on se rend compte qu'à la fin, le nombre total de pièces a augmenté de un seulement alors que deux pièces ont été fabriquées. Ce problème ne survient que si les deux routines sont exécutées selon un timing très précis. On comprend donc dans ces conditions qu'un problème de situation de compétition peut rester caché longtemps avant de survenir.

Cette classe de défaut n'existe que chez les systèmes multitâches, mais il faut inclure dans cette définition les systèmes monotâches qui sont susceptibles de recevoir des stimuli extérieurs (« interruptions ») de façon imprévisible. Une situation de compétition peut avoir des effets néfastes pendant une longue période, et le système peut nécessiter d'être réinitialisé.

Pour éliminer les compétitions, il faut s'assurer que les opérations que l'on veut effectuer successivement sont atomiques ou autrement protégées.

Sécurité informatique[modifier | modifier le code]

Dans un programme informatique qui aurait besoin d'une authentification avant d'effectuer une action, il s'écoule un laps de temps entre la réussite de l'authentification et l'action proprement dite. C'est dans ce laps de temps qu'une compétition peut se produire. Par exemple, un attaquant peut exploiter ce laps de temps pour détourner l'action prévue par le logiciel à ses propres fins.

La concurrence critique peut être utilisée pour prendre le contrôle d'un système au moment précis où une brèche éphémère est ouverte, c'est-à-dire au moment où il est vulnérable.

Référence[modifier | modifier le code]

  1. Grand Dictionnaire terminologique

Articles connexes[modifier | modifier le code]