Introduction
On appelle concurrence l'indépendance causale entre plusieurs
actions, comme l'exécution de plusieurs instructions en << même
temps >>. C'est la définition que nous donnions du terme
<< parallèle >> en introduction de cette quatrième partie. Les
processus de la bibliothèque Unix présentés au chapitre
précédent peuvent être qualifiés de concurrents dans la mesure
où le système Unix donne l'apparence de la simultanéité de
leur exécution sur une machine mono-processeur. Mais la notion de
processus et de concurrence ne s'applique pas qu'à ceux obtenus par
l'appel système fork.
Le langage Objective CAML possède une bibliothèque pour les processus légers
(threads). La principale différence entre un processus léger et
un processus engendré par un fork vient du partage ou du
non partage de la mémoire entre les différents processus issus du même
programme. Entre deux processus légers, seul le contexte d'exécution
diffère; le code et la zone mémoire des données sont partagés. Les
processus légers n'améliorent pas les temps d'exécution d'une
application. Leur principal intérêt est de pouvoir exprimer dans un
langage de programmation des algorithmes concurrents.
La nature du langage choisi, impératif ou fonctionnel, fait varier le
modèle de concurrence. Pour un programme impératif, comme chaque
processus léger peut modifier la mémoire commune, on est dans un
modèle à mémoire partagée. La communication entre processus peut se
faire par valeurs écrites et lues dans cette mémoire. Pour un
programme purement fonctionnel, c'est-à-dire sans effet de bord, et
bien que la mémoire soit commune, les calculs qu'exécute
chaque processus n'agissent pas sur l'état mémoire partagé. Dans ce
cas le modèle utilisé est celui à mémoire distincte et l'interaction
entre processus doit s'effectuer par la communication de valeurs via
des canaux.
Le langage Objective CAML implante dans sa bibliothèque sur les processus
légers les deux modèles. Le module Thread permet de lancer
de nouveaux processus correspondants à l'appel d'une fonction avec son
argument. Les modules Mutex et Condition apportent
les outils de synchronisation que sont les verrous de zone d'exclusion
mutuelle et les attentes sur condition. Le module Event
implante un mode de communication de valeurs du langage par
événements. Ces valeurs peuvent elles-mêmes être fonctionnelles,
permettant ainsi d'échanger entre processus légers des calculs à
effectuer. Comme souvent en Objective CAML il est possible de mélanger les
deux modèles.
Cette bibliothèque est portable sur les différents systèmes sur
lesquels fonctionne Objective CAML. À la différence du module
Unix, la bibliothèque Thread permet l'utilisation
de processus sur des machines ne tournant pas sous Unix.