• Aucun résultat trouvé

Conception et Programmation Orientées Objet

N/A
N/A
Protected

Academic year: 2022

Partager "Conception et Programmation Orientées Objet"

Copied!
60
0
0

Texte intégral

(1)

Conception et Programmation Orientées Objet

La Programmation concurrente en Java

2A DUT Informatique - Cursus de formation en apprentissage IUT d’Orsay - Université Paris-Saclay - 2021/2022

Présenté par :

Idir AIT SADOUNE

[email protected]

(2)

1 Systèmes multitâches

2 Les processus et les threads en Java 3 Quelques méthodes de la classe Thread

4 Gestion des ressources et des sections critiques

234§

(3)

1 Systèmes multitâches

2 Les processus et les threads en Java 3 Quelques méthodes de la classe Thread

4 Gestion des ressources et des sections critiques

(4)

Systèmes multitâches

Un système multitâches permet d’exécuter plusieurs programmes informatiques en parallèle.

434§

(5)

Systèmes multiprocesseurs

Vrai-parallélisme : les systèmes multiprocesseurs permettent

un parallélisme, où chaque tâche est exécutée par un processeur différent.

Processeur P1 Tâche T1

Processeur P2 Tâche T2

(6)

Systèmes monoprocesseur

Pseudo-parallélisme : les systèmes monoprocesseur permettent

un parallélisme, où toutes les tâches s’exécutent sur le même processeur.

• Systèmes à traitement par lots

Processeur P1 Tâche T1 Tâche T2

• Systèmes à temps partagé

Processeur P1 T1 T2 T1 T2 T1 T2 T1

634§

(7)

Systèmes monoprocesseur

Pseudo-parallélisme : les systèmes monoprocesseur permettent

un parallélisme, où toutes les tâches s’exécutent sur le même processeur.

• Systèmes à traitement par lots

Processeur P1 Tâche T1 Tâche T2

• Systèmes à temps partagé

Processeur P1 T1 T2 T1 T2 T1 T2 T1

(8)

Systèmes monoprocesseur

Pseudo-parallélisme : les systèmes monoprocesseur permettent

un parallélisme, où toutes les tâches s’exécutent sur le même processeur.

• Systèmes à traitement par lots

Processeur P1 Tâche T1 Tâche T2

• Systèmes à temps partagé

Processeur P1 T1 T2 T1 T2 T1 T2 T1

634§

(9)

La programmation concurrente

Un paradigme de programmation qui tient compte, dans un programme, de l’existence de plusieurs unités d’exécution de base :

les processus et les threads.

(10)

La notion de processus

• Les processus sont considérés comme synonymes de programmes.

Ü un processus est un programme en cours d’exécution.

• Un processus possède un environnement d’exécution autonome : Ü chaque processus a son propre espace mémoire.

• Pour gérer la communication entre les processus, la plupart des OS utilisent les IPC (Inter Process Processing) : les pipes et les sockets. (

à étudier dans le cours suivant

)

834§

(11)

La notion de processus

• Les processus sont considérés comme synonymes de programmes.

Ü un processus est un programme en cours d’exécution.

• Un processus possède un environnement d’exécution autonome : Ü chaque processus a son propre espace mémoire.

• Pour gérer la communication entre les processus, la plupart des OS

utilisent les IPC (Inter Process Processing) : les pipes et les sockets.

(

à étudier dans le cours suivant

)

(12)

La notion de processus

• Les processus sont considérés comme synonymes de programmes.

Ü un processus est un programme en cours d’exécution.

• Un processus possède un environnement d’exécution autonome : Ü chaque processus a son propre espace mémoire.

• Pour gérer la communication entre les processus, la plupart des OS utilisent les IPC (Inter Process Processing) : les pipes et les sockets.

(

à étudier dans le cours suivant

)

834§

(13)

La notion de thread

• Les threads sont aussi appelés processus légers

Ü la création d’un thread nécessite moins de ressources qu’un processus.

• Les threads sont créés par des processus. Les threads partagent

les ressources du processus, y compris la mémoire et les fichiers ouverts.

• Cela rend la communication efficace mais potentiellement problématique

(synchronisations et gestion des ressources partagées).

(14)

La notion de thread

• Les threads sont aussi appelés processus légers

Ü la création d’un thread nécessite moins de ressources qu’un processus.

• Les threads sont créés par des processus. Les threads partagent

les ressources du processus, y compris la mémoire et les fichiers ouverts.

• Cela rend la communication efficace mais potentiellement problématique (synchronisations et gestion des ressources partagées).

934§

(15)

La notion de thread

• Les threads sont aussi appelés processus légers

Ü la création d’un thread nécessite moins de ressources qu’un processus.

• Les threads sont créés par des processus. Les threads partagent

les ressources du processus, y compris la mémoire et les fichiers ouverts.

• Cela rend la communication efficace mais potentiellement problématique

(synchronisations et gestion des ressources partagées).

(16)

Processus vs Thread

1034§

(17)

1 Systèmes multitâches

2 Les processus et les threads en Java 3 Quelques méthodes de la classe Thread

4 Gestion des ressources et des sections critiques

(18)

Les processus en Java

• La description du comportement d’un processus en Java se fait en implémentant la méthode main() dans une classe.

1 public class ProcessInstanciation {

2 public static void main(String[] args) { 3 System.out.println("Run with main method");

4 }

5 }

• La création d’un processus se fait en exécutant la méthode main().

Run with main method

1234§

(19)

Les processus en Java

• La description du comportement d’un processus en Java se fait en implémentant la méthode main() dans une classe.

1 public class ProcessInstanciation {

2 public static void main(String[] args) { 3 System.out.println("Run with main method");

4 }

5 }

• La création d’un processus se fait en exécutant la méthode main().

Run with main method

(20)

Les threads en Java

• La création d’un thread se fait de deux manières :

1

En dérivant la classe Thread et en implémentant la méthode run().

2

En dérivant de l’interface Runnable et en implémentant la méthode run().

• L’exécution d’un thread se fait en utilisant la méthode start(). Le code métier (développé dans la méthode run()) sera exécuté en tâche de fond.

1334§

(21)

Les threads en Java

• La création d’un thread se fait de deux manières :

1

En dérivant la classe Thread et en implémentant la méthode run().

2

En dérivant de l’interface Runnable et en implémentant la méthode run().

• L’exécution d’un thread se fait en utilisant la méthode start(). Le code

métier (développé dans la méthode run()) sera exécuté en tâche de fond.

(22)

Les threads en Java

• La création d’un thread se fait de deux manières :

1

En dérivant la classe Thread et en implémentant la méthode run().

2

En dérivant de l’interface Runnable et en implémentant la méthode run().

• L’exécution d’un thread se fait en utilisant la méthode start(). Le code métier (développé dans la méthode run()) sera exécuté en tâche de fond.

1334§

(23)

Les threads en Java

• La création d’un thread se fait de deux manières :

1

En dérivant la classe Thread et en implémentant la méthode run().

2

En dérivant de l’interface Runnable et en implémentant la méthode run().

• L’exécution d’un thread se fait en utilisant la méthode start(). Le code

métier (développé dans la méthode run()) sera exécuté en tâche de fond.

(24)

Méthode 1 : Etendre la classe Thread (1/2)

1 public class FromThreadClass extends Thread { 2 protected String name ;

3

4 public FromThreadClass(String id) { 5 this.name = id;

6 }

7

8 public void run() {

9 System.out.println("[Thread "+this.name+"] Run");

10 }

11 }

1434§

(25)

Méthode 1 : Etendre la classe Thread (2/2)

1 public class FromProcessClass {

2 public static void main(String[] args) {

3 FromThreadClass th1 = new FromThreadClass("TH1");

4 th1.start();

5 }

6 }

[Thread TH1] Run

(26)

Méthode 1 : Etendre la classe Thread (2/2)

1 public class FromProcessClass {

2 public static void main(String[] args) {

3 FromThreadClass th1 = new FromThreadClass("TH1");

4 th1.start();

5 }

6 }

[Thread TH1] Run

1534§

(27)

Méthode 2.1 : implémenter l’interface Runnable (1/2)

1 public class FromRunnableInterface implements Runnable { 2

3 public void run() {

4 System.out.println("[Thread] Run");

5 }

6 }

(28)

Méthode 2.1 : implémenter l’interface Runnable (2/2)

1 public class FromProcessClass {

2 public static void main(String[] args) {

3 Thread th1 = new Thread(new FromRunnableInterface());

4 th1.start();

5 }

6 }

[Thread] Run

1734§

(29)

Méthode 2.1 : implémenter l’interface Runnable (2/2)

1 public class FromProcessClass {

2 public static void main(String[] args) {

3 Thread th1 = new Thread(new FromRunnableInterface());

4 th1.start();

5 }

6 }

[Thread] Run

(30)

Méthode 2.2 : implémenter l’interface Runnable à chaud

1 public class FromProcessClass {

2 public static void main(String[] args) { 3 Thread th1 = new Thread(new Runnable(){

4 public void run() {

5 System.out.println("[Thread] Run");

6 }

7 });

8 th1.start();

9 }

10 }

[Thread] Run

1834§

(31)

Méthode 2.2 : implémenter l’interface Runnable à chaud

1 public class FromProcessClass {

2 public static void main(String[] args) { 3 Thread th1 = new Thread(new Runnable(){

4 public void run() {

5 System.out.println("[Thread] Run");

6 }

7 });

8 th1.start();

9 }

10 }

[Thread] Run

(32)

Cycle de vie d’un thread/processus

1934§

(33)

1 Systèmes multitâches

2 Les processus et les threads en Java 3 Quelques méthodes de la classe Thread

4 Gestion des ressources et des sections critiques

(34)

Les méthodes sleep() et join()

1 public class ThreadFils extends Thread { 2 protected String name ;

3

4 public ThreadFils(String name) { 5 this.name = name;

6 }

7

8 public void run() {

9 try {

10 System.out.println("[Thread "+this.name+"] Debut");

11 System.out.println("[Thread "+this.name+"] Sleep ...");

12 this.sleep(2000);

13 System.out.println("[Thread "+this.name+"] Fin");

14 } catch (InterruptedException e) { 15 e.printStackTrace();

16 }

17 }

18 }

2134§

(35)

Les méthodes sleep() et join()

1 public class Main {

2 public static void main(String[] args) {

3 try {

4 System.out.println("[Main Process] Debut");

5 ThreadFils f1 = new ThreadFils("f1");

6 f1.start();

7 f1.join();

8 System.out.println("[Main Process] Fin");

9 } catch (InterruptedException e) { 10 e.printStackTrace();

11 }

12 }

13 }

[Main Process] Debut [Thread f1] Debut [Thread f1] Sleep ... [Thread f1] Fin [Main Process] Fin

(36)

Les méthodes sleep() et join()

1 public class Main {

2 public static void main(String[] args) {

3 try {

4 System.out.println("[Main Process] Debut");

5 ThreadFils f1 = new ThreadFils("f1");

6 f1.start();

7 f1.join();

8 System.out.println("[Main Process] Fin");

9 } catch (InterruptedException e) { 10 e.printStackTrace();

11 }

12 }

13 }

[Main Process] Debut [Thread f1] Debut [Thread f1] Sleep ...

[Thread f1] Fin [Main Process] Fin

2234§

(37)

Les méthodes sleep() et join()

1 public class Main {

2 public static void main(String[] args) {

3 try {

4 System.out.println("[Main Process] Debut");

5 ThreadFils f1 = new ThreadFils("f1");

6 f1.start();

7 f1.join(1000);

8 System.out.println("[Main Process] Fin");

9 } catch (InterruptedException e) { 10 e.printStackTrace();

11 }

12 }

13 }

[Main Process] Debut [Thread f1] Debut [Thread f1] Sleep ... [Main Process] Fin [Thread f1] Fin

(38)

Les méthodes sleep() et join()

1 public class Main {

2 public static void main(String[] args) {

3 try {

4 System.out.println("[Main Process] Debut");

5 ThreadFils f1 = new ThreadFils("f1");

6 f1.start();

7 f1.join(1000);

8 System.out.println("[Main Process] Fin");

9 } catch (InterruptedException e) { 10 e.printStackTrace();

11 }

12 }

13 }

[Main Process] Debut [Thread f1] Debut [Thread f1] Sleep ...

[Main Process] Fin [Thread f1] Fin

2334§

(39)

La méthode interrupt()

1 public class Main {

2 public static void main(String[] args) {

3 try {

4 System.out.println("[Main Process] Debut");

5 ThreadFils f1 = new ThreadFils("f1");

6 f1.start();

7 f1.join(1000);

8 f1.interrupt();

9 System.out.println("[Main Process] Fin");

10 } catch (InterruptedException e) {e.printStackTrace();}

11 }

12 }

[Thread f1] Debut [Thread f1] Sleep ... [Main Process] Fin

java.lang.InterruptedException: sleep interrupted at java.lang.Thread.sleep(Native Method) at ThreadFils.run(ThreadFils.java:15)

(40)

La méthode interrupt()

1 public class Main {

2 public static void main(String[] args) {

3 try {

4 System.out.println("[Main Process] Debut");

5 ThreadFils f1 = new ThreadFils("f1");

6 f1.start();

7 f1.join(1000);

8 f1.interrupt();

9 System.out.println("[Main Process] Fin");

10 } catch (InterruptedException e) {e.printStackTrace();}

11 }

12 }

[Thread f1] Debut [Thread f1] Sleep ...

[Main Process] Fin

java.lang.InterruptedException: sleep interrupted at java.lang.Thread.sleep(Native Method) at ThreadFils.run(ThreadFils.java:15)

2434§

(41)

1 Systèmes multitâches

2 Les processus et les threads en Java 3 Quelques méthodes de la classe Thread

4 Gestion des ressources et des sections critiques

(42)

Quelques définitions

• Les threads partagent le même espace mémoire, ils accèdent aux mêmes ressources (les ressources critiques ou les ressources partagées ).

Les sections critiques sont les instructions que plusieurs threads sont susceptibles d’exécuter au même moment et où les ressources partagées sont mis à jours.

• En Java, il existe plusieurs stratégies pour s’assurer qu’une section de code est exécuté par un seul thread.

2634§

(43)

Quelques définitions

• Les threads partagent le même espace mémoire, ils accèdent aux mêmes ressources (les ressources critiques ou les ressources partagées ).

Les sections critiques sont les instructions que plusieurs threads sont susceptibles d’exécuter au même moment et où les ressources partagées sont mis à jours.

• En Java, il existe plusieurs stratégies pour s’assurer qu’une section de code

est exécuté par un seul thread.

(44)

Quelques définitions

• Les threads partagent le même espace mémoire, ils accèdent aux mêmes ressources (les ressources critiques ou les ressources partagées ).

Les sections critiques sont les instructions que plusieurs threads sont susceptibles d’exécuter au même moment et où les ressources partagées sont mis à jours.

• En Java, il existe plusieurs stratégies pour s’assurer qu’une section de code est exécuté par un seul thread.

2634§

(45)

Quelques définitions

• Les threads partagent le même espace mémoire, ils accèdent aux mêmes ressources (les ressources critiques ou les ressources partagées ).

Les sections critiques sont les instructions que plusieurs threads sont susceptibles d’exécuter au même moment et où les ressources partagées sont mis à jours.

• En Java, il existe plusieurs stratégies pour s’assurer qu’une section de code

est exécuté par un seul thread.

(46)

Problèmes de synchronisation

1 public class Ressource { 2 private int cpt ; 3

4 public Ressource() { 5 this.cpt = 0;

6 }

7

8 public int getCpt() {

9 return cpt;

10 }

11

12 public void updateCpt() { 13 this.cpt = this.cpt +1;

14 }

15 }

2734§

(47)

Problèmes de synchronisation

1 public class ThreadFils extends Thread { 2 private Ressource r ;

3

4 public ThreadFils(Ressource r){

5 this.r = r ;

6 }

7

8 public void run() {

9 for(int i=0;i<100;i++){

10 try {

11 Thread.sleep(100);

12 this.r.updateCpt();

13 }

14 catch (InterruptedException e){

15 e.printStackTrace();

16 }

17 }

18 }

19 }

(48)

Problèmes de synchronisation

1 public class Process {

2 public static void main(String[] args) 3 throws InterruptedException {

4 Ressource r = new Ressource();

5 ThreadFils f1 = new ThreadFils(r);

6 ThreadFils f2 = new ThreadFils(r);

7 f1.start();

8 f2.start();

9 f1.join();

10 f2.join();

11 System.out.println(r.getCpt());

12 }

13 }

137

2934§

(49)

Problèmes de synchronisation

1 public class Process {

2 public static void main(String[] args) 3 throws InterruptedException {

4 Ressource r = new Ressource();

5 ThreadFils f1 = new ThreadFils(r);

6 ThreadFils f2 = new ThreadFils(r);

7 f1.start();

8 f2.start();

9 f1.join();

10 f2.join();

11 System.out.println(r.getCpt());

12 }

13 }

137

(50)

Comment expliquer ce calcul incorrect ?

1 //this.value = this.value + 1; 2 lda value

3 add #1 4 sta value

1 //this.value = this.value + 1; 2 lda value

3 add #1 4 sta value

value=1000 value=1000

value=1001 value=1001

Après une itération ?

value=1001

3034§

(51)

Comment expliquer ce calcul incorrect ?

1 //this.value = this.value + 1;

2 lda value 3 add #1 4 sta value

1 //this.value = this.value + 1;

2 lda value 3 add #1 4 sta value

value=1000 value=1000

value=1001 value=1001

Après une itération ?

value=1001

(52)

Comment expliquer ce calcul incorrect ?

1 //this.value = this.value + 1;

2 lda value 3 add #1 4 sta value

1 //this.value = this.value + 1;

2 lda value 3 add #1 4 sta value

value=1000

value=1000

value=1001 value=1001

Après une itération ?

value=1001

3034§

(53)

Comment expliquer ce calcul incorrect ?

1 //this.value = this.value + 1;

2 lda value 3 add #1 4 sta value

1 //this.value = this.value + 1;

2 lda value 3 add #1 4 sta value

value=1000 value=1000

value=1001 value=1001

Après une itération ?

value=1001

(54)

Comment expliquer ce calcul incorrect ?

1 //this.value = this.value + 1;

2 lda value 3 add #1 4 sta value

1 //this.value = this.value + 1;

2 lda value 3 add #1 4 sta value

value=1000 value=1000

value=1001

value=1001

Après une itération ?

value=1001

3034§

(55)

Comment expliquer ce calcul incorrect ?

1 //this.value = this.value + 1;

2 lda value 3 add #1 4 sta value

1 //this.value = this.value + 1;

2 lda value 3 add #1 4 sta value

value=1000 value=1000

value=1001 value=1001

Après une itération ?

value=1001

(56)

Comment expliquer ce calcul incorrect ?

1 //this.value = this.value + 1;

2 lda value 3 add #1 4 sta value

1 //this.value = this.value + 1;

2 lda value 3 add #1 4 sta value

value=1000 value=1000

value=1001 value=1001

Après une itération ?

value=1001

3034§

(57)

Les méthodes synchronisées (les moniteurs)

1 public class Ressource { 2 private int cpt ; 3

4 public Ressource() { 5 this.cpt = 0;

6 }

7

8 public synchronized int getCpt() {

9 return cpt;

10 }

11

12 public synchronized void updateCpt() { 13 this.cpt = this.cpt +1;

14 }

15 }

(58)

Les Locks

1 public class Ressource { 2 private int cpt ;

3 private ReentrantLock myLock = new ReentrantLock();

4

5 public Ressource() { 6 this.cpt = 0;

7 }

8

9 public int getCpt() { 10 this.myLock.lock();

11 int copy = this.cpt;

12 this.myLock.unlock();

13 return copy;

14 }

15

16 public void updateCpt() { 17 this.myLock.lock();

18 this.cpt = this.cpt +1;

19 this.myLock.unlock();

20 }

21 }

3234§

(59)

Les sémaphores

1 public class Ressource { 2 private int cpt ;

3 private Semaphore sem = new Semaphore(1);

4

5 public Ressource() { 6 this.cpt = 0;

7 }

8

9 public int getCpt() throws InterruptedException { 10 this.sem.acquire();

11 int copy = this.cpt;

12 this.sem.release();

13 return copy;

14 }

15

16 public void updateCpt() throws InterruptedException { 17 this.sem.acquire();

18 this.cpt = this.cpt +1;

19 this.sem.release();

20 }

21 }

(60)

¨ Fin

Références

Documents relatifs

La surface d’un quadrilatère est maximum quand celui-ci est inscriptible dans un cercle.. Cette propriété résulte de la formule de Bretscheider qui donne l’aire A

S’il est facile d’imaginer la configuration de l’énoncé, sa construction effec- tive demande

Il a donc un centre de sym´ etrie qui est confondu avec O puisqu’il est le point de concours des parall` eles aux c´ eviennes ` a mi-distance entre les c´ eviennes et les hauteurs

• Chaque classe enveloppe poss`ede des m´ethodes pour extraire la valeur d’un objet : primitifValue() appliqu´ee sur l’objet enveloppe renvoie une valeur de type primitif.. •

• Chaque classe enveloppe poss`ede des m´ethodes pour extraire la valeur d’un objet : primitifValue() appliqu´ee sur l’objet enveloppe renvoie une valeur de type primitif.. •

• Si la classe Rect est derivée de la classe Shape, une operation qui peut être exécutée sur un objet de la classe Shape peut aussi être exécutée sur un objet de la classe

L’événement « manger une salade verte et une pizza aux quatre fromages » a une probabilité de 1/6. L’événement «manger une salade verte, une pizza végétarienne et une

Il y aura donc deux activités (threads) de remplissage : l’une d’entre elles remplit avec des balles rouges et l’autre remplit avec des boules vertes.. les balles seront placées