Vous êtes sur la page 1sur 33

Programmation

concurrente avec Python


Chargé de cours : Laya Yibé GUINDO
Email : layayibeguindo@gmail.com
L3 – IRT - ITMA
© Novembre 2023
Plan
1. Notions et concepts de bases
1. Programme
2. Processus
3. Thread
4. Multiprocessing
5. Multithreading
6. Notion de concurrence
2. Introduction à la programmation concurrente
1. Programmation concurrente
2. Parallélisme vs. Concurrence
2
Programme : Quelques définitions

Qu’est-ce qu’un programme ?


 Un programme est un ensemble d’instructions et d’opérations destinées à
être exécutées par un ordinateur. (Cf. Wikipédia)
 En informatique, un programme est une suite d'opérations pré-déterminées
destinées à être exécutées de manière automatique par un appareil
informatique en vue d'effectuer des travaux, des calculs arithmétiques ou
logiques, ou simuler un déroulement. (Techno Science)
3
Programme : Quelques définitions

4
Programme : Quelques définitions

5
Un processus

Qu’est-ce qu’un Processus ?


 En informatique, un processus est un programme en cours d’exécution sur
un ordinateur ou un serveur.
 il peut aussi être définis comme :
 un ensemble d'instructions à exécuter ;
 un espace d'adressage en mémoire vive pour stocker la pile ;
 des ressources permettant des entrées-sorties de données, comme des ports réseau.

6
Les états d’un processus

Source : Diagramme d’état d’un processus :


Wikipédia 7
Un Thread

Qu’est-ce qu’un Thread ?


 Un thread est un processus léger.
 C’est aussi une instance de programme (par exemple, notebook Jupyter,
interpréteur Python).
 Les processus génèrent des threads (sous-processus léger) pour gérer des sous-
tâches telles que la lecture des frappes au clavier, le chargement de pages HTML,
l'enregistrement de fichiers. Les threads vivent à l’intérieur des processus et
partagent le même espace mémoire..

8
Un Thread

Qu’est-ce qu’un Thread ?


 Les threads vivent à l’intérieur des processus et partagent le même espace mémoire.
 Les threads sont comme des mini-processus qui vivent à l'intérieur d'un processus.
 Ils partagent l'espace mémoire et lisent et écrivent efficacement dans les mêmes variables.
 Deux threads ne peuvent pas exécuter de code simultanément dans le même
programme Python (bien qu'il existe des solutions de contournement*)

9
Un Thread

On qualifie aussi les fils d’exécution de «processus légers» car leur création
s’avère beaucoup plus rapide que celle d’un processus normal. En effet, comme
ils s’exécutent dans un espace d’adresses existant, aucune opération d’allocation
d’espace ni de chargement de code n’est requise.
Il suffit de leur allouer un bloc de contrôle (descripteur) et quelques autres
ressources indispensables telles que la pile et l’amas (données dynamiques).

10
Un Thread

GIL (Globale interpreter Lock)


 En python le GIL empêche deux threads de s'exécuter simultanément dans
le même programme.

11
Thread & Processus

Les processus et les threads sont des séquences d’exécution indépendantes.


 Les Threads s’exécutent sur un espace de mémoire partagée et sont des processus légers.
 Les Processus s’exécutent dans des mémoires différentes.

12
Avantages des Threads
• Partage des ressources système
• Gérer l’exécution de traitements long sans bloquer les autres (Calculs, affichage, programmes démons)
• Permettre l’annulation de tâches indépendantes
• Lancer plusieurs exécutions du même code simultanément sur des données différentes
• Répondre à plusieurs requêtes en même sur un serveur
• Traiter deux flux sonores en parallèle
• Simuler le parallélisme nécessaire à certaines classes d’applications
• Exploiter la structure multiprocesseur des ordinateurs modernes
• Nécessaire dans certains API

13
Terminologie

Système multitâche
Un système multitâche, c'est la possibilité d’avoir plusieurs programmes
travaillant en même temps: impression de parallélisme du point de vue de
l’utilisateur.

14
Terminologie

Processus / processus lourd


Un processus (en anglais, process), est un programme en cours d'exécution par
un ordinateur..

15
Terminologie

Thread / processus légers / tâche


Les programmes utilisent le concept de thread : un fil d'instructions (un chemin
d’exécution) à l'intérieur d'un processus. Un programme peut avoir plusieurs
threads.

16
Terminologie

Multithreading / multitâche
Un programme qui exécute plusieurs threads en même temps est appelé
programme multithread ou encore multithreadé.

17
Terminologie

La pile (stack)
Structure de données fondée sur le principe « dernier arrivé, premier sorti ».
Stockage des données de travail.
Le tas(heap)
Le tas est une zone où est réalisée l’allocation dynamique.

18
Terminologie

Ordonnanceur
L’ordonnanceur est un composant du système d'exploitation qui choisit l'ordre
d'exécution des processus. En anglais, l'ordonnanceur est appelé scheduler.

19
Notion de concurrence

Qu’est-ce qu’un système concurrent ?


« C’est un système dans lequel plusieurs activités s’exécutent simultanément
tout en ayant des interactions les unes avec les autres ».
« Plusieurs activités logicielles partagent une ou plusieurs ressources
matérielles »
« Exécution sur la même machine ou sur des machines différentes »
20
Notion de concurrence

Exemple de système concurrent ?


• serveur (web, base de données, jeu en ligne, etc.) répondant à plusieurs
clients (simultanément).
• Application E-commerce en ligne, permettant l’affichage de l’état du stock de
chaque produits.

21
Programmation parallèle
1. Programmation parallèle
 Exécution d’un programme sur plusieurs unités (Cores, processeurs, ordinateurs)
2. Programmation distribué ou répartie
 C’est la répartition de l’exécution d’un programme sur plusieurs machines distinctes
 Programmation parallèle sur plusieurs machines
3. Programmation concurrente
 Style de programmation prenant en compte les différentes unités d’exécutions offertes :
Thread, Processus...

22
Synchronisation : Compétition
 Nous avons deux tâches (A et B) et une variable partagée (TOTAL)
 La tâche A doit additionner 1 à TOTAL
 La tâche B doit multiplier TOTAL par 2
 Chaque tâche accomplit son opération en utilisant le processus suivant :
• Chercher la valeur dans TOTAL
• Effectuer l’opération arithmétique
• Remettre la nouvelle valeur dans TOTAL

• TOTAL a une valeur originale de 3

23
Synchronisation : Compétition
• Sans synchronisation, 4 valeurs peuvent résulter de l’exécution des deux tâches :
• Si A s’accomplit avant que B ne commence ) TOTAL=8
• Si A et B cherchent le TOTAL avant que l’un ou l’autre remette la nouvelle valeur, alors :
• Si A remet la nouvelle valeur dans TOTAL en premier ) TOTAL=6
• Si B remet la nouvelle valeur dans TOTAL en premier ) TOTAL=4

• Si B s’accomplit avant que A ne commence ) TOTAL=7

• Ce genre de situation s’appelle un état de course parce plusieurs tâches font la course
pour utiliser les ressources partagées et le résultat dépend de l’ordre de l’exécution des
tâches.

24
Synchronisation : Coopération
• Le programme 1 produit des données ; Le
programme 2 utilise ces données
• La synchronisation est nécessaire :
• L’unité du consommateur ne doit pas prendre des
données si la mémoire partagée (mémoire tampon) est
vide ;
• L’unité du producteur ne peut pas placer de nouvelles
données dans la mémoire partagée si elle n’est pas vide.

25
Multiple Threads dans une application
• Chaque Thread possède sa file d’exécution privée
• Si deux Threads exécutent la même méthode, chacun aura sa copie des variables
locales que la méthode utilise.
• Cependant, tous les Thread voient la même mémoire dynamique
• Deux Threads peuvent agir sur le même objet et les mêmes champs 𝑠𝑡𝑎𝑡𝑖𝑐
simultanément
• Inconvénients
• Gestion des problèmes de synchronisation
• Débogage difficile
26
Exemple
Considérons le processus suivant :
Si 𝑥=0 et 𝑦=7 initialement alors 𝑥=1 et 𝑦=5 après exécution de 𝛼 et 𝛽 quelque
soit l’ordre.

27
Exemple
• L’indépendance des actions est cruciale, par exemple pour
𝑥≔𝑥+1|||𝑥≔2.𝑥 avec 𝑥0=0, la valeur de 𝑥 dépend de l’ordre d’exécution
• Nous sommes dans le cas d’une communication avec 𝑥 comme variable
partagée
• Nous verrons la communication avec variables partagées dans la suite du
cours

28
Comment travailler sans les threads
• Il est possible de travailler qu’avec les processus !
• La duplication est coûteuse car il faut recopier le tas et les registres
• L’échange des données est plus complexe.

29
Pourquoi travailler avec des threads ?
 Avec plusieurs processeurs, il est possible de réaliser plus de calcul à chaque
instant,
 Parallélisation des algorithmes (si possible), acquisition des données,
 Simplification de la structure logiciel (chaque fonctionnalité est gérée par un
thread),
 Architecture plus robuste (une partie de l’application ne met plus en péril
tout le reste),
 Tâche de surveillance en parallèle d’une tâche de traitement,
30
Pourquoi travailler avec des threads ?
 L’OS n’a pas besoin de créer de nouveau emplacement dans la mémoire
comme dans le cas des processus,
 L’OS n'a pas besoin également d'allouer de nouvelles structures pour assurer
le suivi de l'état des fichiers ouverts et incrémenter le nombre de références
sur les descripteurs de fichiers ouverts,

31
Pourquoi travailler avec des threads ?
 Il est trivial de partager des données entre les threads . Les mêmes variables
globales et statiques peuvent être lues et écrites entre tous les threads d'un
processus. Avec un processus mono-thread , le système d'exploitation ne
peut rien faire pour faire laisser le processus tirer parti de plusieurs
processeurs,
 L'ordonnanceur peut programmer différents threads pour une exécution en
parallèle sur différents cœurs de processeurs.

32
Bibliographie
• [Hartley 1998] S. J . Hartley. Concurent Programming: Th,e Java
Prograrrinzinq Languuge. Oxford, New York, NY, 1998.
• [Farley 1998]J. Farley. Java Distributed Computing. O’Reilly, Sebastopol,
CA, 1998.
• [Lead 1999]D. Lea. Concurrent Programming in Java: Design principles
and Putterns. The Java Series. Addison Wesley, Reading, MA, 2nd edition,
1999.

33

Vous aimerez peut-être aussi