Programmation concurrente - Définition

Source: Wikipédia sous licence CC-BY-SA 3.0.
La liste des auteurs de cet article est disponible ici.

Introduction

La programmation concurrente est un style de programmation tenant compte, dans un programme, de l'existence de plusieurs piles sémantiques. Ces piles peuvent être appelées threads, processus ou tâches. Elles sont matérialisées en machine par une pile d'exécution et un ensemble de données privées. Les threads disposent d'une zone de mémoire partagée alors que les processus sont strictement isolés.

La concurrence est indispensable lorsque l'on souhaite écrire des programmes interagissant avec le monde réel (qui est concurrent) ou tirant parti de multiples unités centrales (couplées, comme dans un système multiprocesseurs, ou distribuées, éventuellement en grille ou en grappe).

Classification

On distingue trois types de concurrence :

  • disjointe : les entités concurrentes ne communiquent et n'interagissent pas,
  • compétitive : un ensemble d'entités concurrentes en compétition pour l'accès à certaines ressources partagées (par exemple le temps CPU, un port d'entrées/sorties, une zone mémoire),
  • coopérative : un ensemble d'entités concurrentes qui coopèrent pour atteindre un objectif commun. Des échanges ont lieu entre les processus. La coopération est un élément primordial de la programmation concurrente.

La programmation concurrente est plus complexe et difficile que la programmation impérative, fonctionnelle ou encore déclarative. En fait, à chacun de ces modèles de programmation, on peut associer une version concurrente, par extension de la sémantique du langage de programmation associé. Par exemple, Prolog a été étendu en Concurrent Prolog, Haskell avec Concurrent Haskell, Java et Ada sont des langages à objets avec des primitives pour la concurrence, etc.

Les techniques spécifiques pour le traitement de la concurrence peuvent être classées en allant de la moins expressive (mais la plus facile à utiliser) à la plus expressive (et la plus complexe). On peut utiliser les niveaux suivants :

  1. concurrence déclarative (langage fonctionnel étendu avec des threads)
  2. concurrence en programmation logique
  3. concurrence déclarative avec des ports et envoi de messages
  4. concurrence impérative avec ports et envoi de messages
  5. concurrence impérative avec mémoire partagée

Solutions

Pour chaque type de programmation concurrente, on dispose d'abstractions de haut niveau facilitant l'écriture de programmes concurrents :

  • dans le cas de processus en compétition pour des ressources partagées, la notion de transaction a été développée dès les années 70. Les systèmes transactionnels, utilisés principalement pour des bases de données partagées, s'appuient sur la théorie de la sérialisabilité pour garantir un accès concurrent à des ressources partagées (concurrence de type 4 et 5). La mémoire transactionnelle logicielle (STM) est une tentative pour appliquer ce modèle des transactions d'une façon plus générale à toute opération sur la mémoire, elle présente plusieurs avantages sur l'approche classique par verrous et connaît depuis peu un grand regain d'intérêt.
  • dans le cas de processus en coopération en vue d'un but commun, au moins deux techniques ont fait leurs preuves : la communication inter-processus utilisant exclusivement l'envoi de messages, et la synchronisation dataflow (au moyen de variables spéciales de type future ou variable logique). Les langages de programmation Erlang ou Oz permettent d'écrire des applications concurrentes et distribuées, avec un soin particulier apporté aux questions de gestion d'exception. Erlang et Oz exploitent le principe de l'envoi de messages, et Oz offre de plus la synchronisation dataflow (c’est-à-dire l'ordonnancement dynamique des threads en fonction de la disponibilité des données).
Page générée en 0.070 seconde(s) - site hébergé chez Contabo
Ce site fait l'objet d'une déclaration à la CNIL sous le numéro de dossier 1037632
A propos - Informations légales
Version anglaise | Version allemande | Version espagnole | Version portugaise