24
Faculté I&C, Claude Petitpierre, André Maurer Le parallélisme Introduction

Faculté I&C, Claude Petitpierre, André Maurer Le parallélisme Introduction

Embed Size (px)

Citation preview

Page 1: Faculté I&C, Claude Petitpierre, André Maurer Le parallélisme Introduction

Faculté I&C, Claude Petitpierre, André Maurer

Le parallélisme

Introduction

Page 2: Faculté I&C, Claude Petitpierre, André Maurer Le parallélisme Introduction

Faculté I&C, Claude Petitpierre, André Maurer

Evénement chaînés

onload="f()"

f() {

}

setTimeout(f, 100)

f() {

}

setTimeout(f, 100)

f() {

}

setTimeout(f, 100)

Page 3: Faculté I&C, Claude Petitpierre, André Maurer Le parallélisme Introduction

Faculté I&C, Claude Petitpierre, André Maurer

Evénement chaînés(setInterval())

onload="setInterval(f, 100)"

f() {

}

f() {

}

f() {

}

Page 4: Faculté I&C, Claude Petitpierre, André Maurer Le parallélisme Introduction

Faculté I&C, Claude Petitpierre, André Maurer

this.f ?

On ne peut pas chaîner les méthodes d’un objet de la même façon

obj = { f : function() {

} x : 15}

setTimeout(this.f, 100)

f() {

}

this.x ?

moteur

setTimeout(this.f, 100)

this.x

Possible

this est perdu !

Page 5: Faculté I&C, Claude Petitpierre, André Maurer Le parallélisme Introduction

Faculté I&C, Claude Petitpierre, André Maurer

Closures

Le chaînage des appels doit être fait par closure !

• Une closure = une fonction + attributs + son environnement de variables locales

• Toute fonction définie à l’intérieur d’une autre fonction produit en fait une closure

• Sorte de mini-objet

Page 6: Faculté I&C, Claude Petitpierre, André Maurer Le parallélisme Introduction

Faculté I&C, Claude Petitpierre, André Maurer

Closurevar x = null

function createClosure (arg) {

var vLocale = 10

x = function uneClosure(a) { // fonction définie dans

alert(vLocale + a + arg) // une autre fonction

}

}

. . .

createClosure(45)

x(22)

Page 7: Faculté I&C, Claude Petitpierre, André Maurer Le parallélisme Introduction

Faculté I&C, Claude Petitpierre, André Maurer

Closure Autre façon d’y accéder

function createClosure (arg) {

var vLocale = 10

return function uneClosure(a) {

alert(vLocale + a + arg)

}

}

. . .

var x = createClosure(45)

x(22)

Page 8: Faculté I&C, Claude Petitpierre, André Maurer Le parallélisme Introduction

Faculté I&C, Claude Petitpierre, André Maurer

Closurefunction createClosure (arg) {

var vLocale = 10

return function uneClosure(a) {

alert(vLocale + a + arg)

}}

1. Même après la fin de createClosure, l’environnement contenant les variables locales de cette fonction sont gardées et restent accessibles dans la fonction uneClosure.

2. Si l’on crée deux closures dans la même fonction (même appel), elles partagent le même environnement (qui est celui de la fonction englobante)

3. Si la fonction est définie dans un objet, les attributs de l'objet font partie de la closure

Page 9: Faculté I&C, Claude Petitpierre, André Maurer Le parallélisme Introduction

Faculté I&C, Claude Petitpierre, André Maurer

Closure dans un appel à setTimeout

function createClosure (arg) {

var vLocale = 10

setTimeout( function uneClosure() {

alert(vLocale + arg)

}, 1000)}

Page 10: Faculté I&C, Claude Petitpierre, André Maurer Le parallélisme Introduction

Faculté I&C, Claude Petitpierre, André Maurer

Closure dans un appel à setTimeout

function createClosure (arg) {

var vLocale = 10

function xxx() { alert(vLocale + arg) }

setTimeout( xxx, 1000)}

Page 11: Faculté I&C, Claude Petitpierre, André Maurer Le parallélisme Introduction

Faculté I&C, Claude Petitpierre, André Maurer

Animation dans un objetvar activeObj = {

couleur : "green"

run1 : function() {

alterneCouleur(this.couleur)

var that = this // that est un nom arbitraire

clos = function() { that.run2() }

setTimeout( clos, 500 )

},

run2 : function() {

alterneCouleur("red")

var that = this

setTimeout( function() { that.run1() }, 500 )

} }

Page 12: Faculté I&C, Claude Petitpierre, André Maurer Le parallélisme Introduction

Faculté I&C, Claude Petitpierre, André Maurer

Une autre possibilitéde définir la séquence

var activeObj = {etat : 0,run : function() {

switch (etat) { case 0:

alterneCouleur("green")etat = 1break

case 1:alterneCouleur("red")etat = 0break

}var that = thissetTimeout( function() { that.run() }, 500)

} }

Page 13: Faculté I&C, Claude Petitpierre, André Maurer Le parallélisme Introduction

Faculté I&C, Claude Petitpierre, André Maurer

ThreadsLa séquence ininterrompue d’appels par timeout constitue le fil (de l’histoire), en anglais thread.

Si l’on crée plusieurs objets de ce type, on pourra garder plusieurs fils actifs indépendants.

Un thread est un moyen de suivre plusieurs activités sans les mélanger. Ce concept est à la base de la programmation pseudo-parallèle.

Java, C++… offrent des moyens pour créer des threads. En C++, ils ne sont pas liés à un objet. Dans ces langages, le fil peut être commuté à tout instant, pas seulement entre les fonctions.

Exemple

Page 14: Faculté I&C, Claude Petitpierre, André Maurer Le parallélisme Introduction

Faculté I&C, Claude Petitpierre, André Maurer

Au moyen d’un constructeurfunction Actif () {

var etat = 0var that = this <<<<<<this.couleur = "green"this.run = function() {

switch (etat) { case 0:

alterneCouleur("green")etat = 1break

case 1:alterneCouleur("red")etat = 0break

}setTimeout( function() { that.run() }, 500)

} }

Page 15: Faculté I&C, Claude Petitpierre, André Maurer Le parallélisme Introduction

Faculté I&C, Claude Petitpierre, André Maurer

Extension de Javascript

(Compilateur + librairies de LemanOS)

process XYZ (nom) {

this.run() {

for (;;) {

waituntil(now() + 2000)

}

}

}

Page 16: Faculté I&C, Claude Petitpierre, André Maurer Le parallélisme Introduction

Faculté I&C, Claude Petitpierre, André Maurer

Suspension dans un "thread"

process Runner() {this.run = function() {

if (x>0)waituntil(now()+10)x = 10

} x=0

}}

}

Page 17: Faculté I&C, Claude Petitpierre, André Maurer Le parallélisme Introduction

Faculté I&C, Claude Petitpierre, André Maurer

Découpage par le compilateurthis.run = function() { this.run = function() {

for(;;) {switch(_state) {

case 10000: case 10000:if (x>0) { if (!(x>0))

{_state=10002;break}_state = 10001

waituntil(now()+10) setTimeout(that.run, 10)return returncase 10001: case 10001:

x = 10 x = 10}

case 10002: case 10002:x=0 x = 0

break} } } }

compilation

Page 18: Faculté I&C, Claude Petitpierre, André Maurer Le parallélisme Introduction

Faculté I&C, Claude Petitpierre, André Maurer

Appel d'un objet avec thread. . .

p1 = new XYZ()

p1.meth()

. . .process XYZ (nom, p1) {

this.meth = function() { }

this.run() { // boucle infinie

for (;;) { . . .accept meth

}}

}

Page 19: Faculté I&C, Claude Petitpierre, André Maurer Le parallélisme Introduction

Faculté I&C, Claude Petitpierre, André Maurer

Synchronisation entre objects rendez-vous

process ABC (nom, p1) {

this.run() {

for (;;) {

waituntil(now() + 2000)

p1.meth()

} } } process XYZ (nom, p1) {

this.meth = function() { }

this.run() {

for (;;) {

accept meth

} } }

Page 20: Faculté I&C, Claude Petitpierre, André Maurer Le parallélisme Introduction

Faculté I&C, Claude Petitpierre, André Maurer

Attentes concurrentes

this.run(nom) { select { case p1.m1() case p2.m2() }}

this.m1 = function()( { }this.run(nom) { select { case accept m1 case p2.m2() }}

this.m2 = function()( { }this.run(nom) { select { case accept m2 }}Trois rendez-vous possibles

Page 21: Faculté I&C, Claude Petitpierre, André Maurer Le parallélisme Introduction

Faculté I&C, Claude Petitpierre, André Maurer

kernel.js

prêts

rendez-vous

délais

Page 22: Faculté I&C, Claude Petitpierre, André Maurer Le parallélisme Introduction

Faculté I&C, Claude Petitpierre, André Maurer

Oiseaux passant par un couloir Programme

process Oiseau() { this.run = function() {        for(;;) {            // avant le couloir            couloir.entrer()            // avancer dans le couloir            couloir.sortir() // après le couloir        }    } }

process Couloir() { this.entrer() { } this.sortir() { }    this.run = function() {        for(;;) {            accept entrer            accept sortir        }    } }

Page 23: Faculté I&C, Claude Petitpierre, André Maurer Le parallélisme Introduction

Faculté I&C, Claude Petitpierre, André Maurer

select avec toutes les possibilitésselect {

case

when (i==0)

x = proc.meth()

x = x + 1

case

when (y>0)

accept m2

case

when (y<0)

waituntil(now() + 1000)

}

Page 24: Faculté I&C, Claude Petitpierre, André Maurer Le parallélisme Introduction

Faculté I&C, Claude Petitpierre, André Maurer

Boîte aux lettres

// quoi

process Poste(nom) {    this.fifo = [ ]    this.deposer = function (paquet) {        this.fifo.push(paquet)    }    this.prendre= function () {        return this.fifo.shift()    } . . .

// quand

. . .     this.run = function () {        for (;;) {            select {            case                accept deposer            case                when (this.fifo.length>0)  accept prendre            }            waituntil(now()+400)        }    }}

Programme 1Programme 2