Title: Systmes multiprocessus
1Systèmes multi-processus
2Comment simuler un thread en Javascript ?
- En codant les instructions setTimeout
judicieusement par soi-même - En utilisant Synchronous Javascript
3Thread (fil conducteur, fil de lhistoire)
function execute () var count 0 while(
true) count
autres activités delai(1 se
conde) document.getElementById('display')
.innerHTML ""count ltbody onload'exec
ute()'gt lt/bodygt
4Simulation du thread précédentpar découpage en
méthodes
var count 0 // globale function execute ()
count setTimeout(execute2, 1000)
function execute2 () document.getElementBy
Id('display').innerHTML ""count setTimeout(
execute, 0)
5Simulation de threadpar les cas dun switch
var state 0 var count function execute ()
var delai 0 switch (state) case 0
count 0 state 1 break
case 1 count state 2
delai 1000 break case 2
document.getElementById('display').innerHTML
""count state 1 break
setTimeout(execute, delai)
6Synchronisation entre fils dexécution
- function execute ()
- . . .
- case 3 semaphore execute
state 1 return // évite son propre
setTimeout ci-dessous setTimeout(execute
, delai) - function execute2 () // relance execute si
elle est en attente - if (semaphore ! null) setTimeo
ut(semaphore,0) semaphore null
Suspension
Relance
7Synchronisation primaire entre threads
thread 1
thread 2
Suspendre
Relancer
En général, si Relancer est exécuté avant
Suspendre, Relancer na pas deffet.
8Synchronisation avec mémorisation
thread 1
thread 2
n incNWait
() if (nlt0) suspendre
n--
decNResume ()
n
relancer
n mémorise les signaux envoyés par le relanceur.
Il ne faut pas quil y ait un changement de
contexte entre le test et suspendre! si n lt 0 ?
n attentes.
9Attente dans un processus
function execute () switch (state)
case 0 . . . state 1
setTimeout(execute) break case
1 if (nlt0) state 2
semaphore execute return
else n-- state
3 setTimeout(execute)
break case 2 n-- state
3 setTimeout(execute) break
10Attente dans une boucle for
function execute () switch (state)
case 1 init case 2 if
(test) corps setTimeout(execute,
1000) action state 2
else setTimeout(execute)
state 3 break
case 3 . . . break
for (init test action) corps corps contient
un délai
11Création et appel dun objet (actif ou passif)
Object Ox
Ox new Object() Ox.send (msg)
function send (msg) .... function run()
12Objet actif protection activité
obj
Objet O1
obj.send (msg)
function send (msg) .......... function
run() . . .
Objet O2
obj.send (msg)
Objet O3
obj.send (msg)
13La méthode send est exécutée pendant le
rendez-vous
obj1
frunction send (msg) .......... function
run () . . . accept Send
. . .
obj2
function run () obj1.end (msg)
rendez-vous
14Modélisation par une machine détats
State1
State1 select accept recv
buf.store (message) obj1.send (buf)
waituntil (timeoutStart
T1) handleTimeout()
t
obj1.send
accept recv
15Modélisation des rendez-vous
s
A
D
AD
AE
AF
p
p
pp
s
B
E
BE
BD
BF
r
r
q
s
q
q
q
s
C
F
CE
CD
CF
Etats atteignables
16Synchronous Javascript objet actif
process Compte (name, periode) var compte
0 this.run function () // corps du
processus for ()
// boucle infinie var t
now() periode waituntil (t)
document.getElementById(name).innerHTML comp
te function execute (arg)
new Compte("compteur1", 3200) new Compte("compte
ur2", 500)
17Deux processus avec synchronisation
var compteur process Start(nom) var compte
0 this.run function () for ()
compteur.kick() waitunti
l (now() 1000) document.getElementBy
Id(nom) .innerHTML compte
function executeKick (arg)
compteur new Compte("cpt1", 3200) new Start(
"cpt2")
process Compte (name, periode) var compte
0 this.kick function () this.run f
unction () for () select
case waituntil (now
() periode) case acc
ept kick document.getEle
mentById(name) .innerHTML compte
18Sémaphore habituel(Dijkstra)
process Task1(name) this.run function()
for () semaphore.p()
imprimeLignes() semaphore.v()
process Semaphore(name) this.p function ()
this.v function () this.run fun
ction () for () accept p
accept v
process Task2(name) this.run function()
for () semaphore.p()
imprimeLignes() semaphore.v()
Une seule tâche peut être en train dimprimer à
un moment donné
19Canal ou boîte-aux-lettres
process Producer(name) this.run function(
) . . . channel.put(
m ) . . .
if (space available) accept put
if (data)
accept get
process Consumer(name) this.run function(
) . . . x channel.ge
t() . . .
20Canal entre threads
process Producer(name) var count 0 thi
s.run function() for ()
waituntil(now() 1000) channel.put(
""count) count 2
process Channel(name) var list this
.put function (data) list.push(data) this.
get function () return list.shift() this.
run function () for () se
lect case when (list.le
ngthgt0) accept get case
when (list.lengthlt5) acc
ept put var channel
new Channel("a")
process Consumer(name) var x this.run
function() for () x ch
annel.get() display( x )
21Synchronisation avec un bouton
ltbutton onclick'button.synchronize()'gt
non bloquant
process Periodique(name) this.run functio
n() . . . button.clic
ked() . . .
process Button(name) this.clicked function
() this.synchronize function(data)
if (this.inSyncList) return
accept clicked //
pseudo-processus, pas de run
bloquant
22Kernel
Queue des prêts
onload "init()" function init () new
Process("xxx") this.run() switch(state)
case 3 await (accept v,
waituntil) state 4 return
case 4 . . .
fil dexécution appel de fonction
setTimeout()
Queue des synchronisations
23Synchronisation avec un bouton
var buttonvar periodiqueprocess Periodique(name)
this.go function () this.run fun
ction() this.count 0 while(tr
ue) this.count select
case waituntil(now()
3000) display(this.count)
case button.clicked()
process Button(name) this.clicked function
() this.synchronize function(data)
if (this.inSyncList) return
accept clicked // non bloquant
// parce qu'il est dans this.synchronize
// et non dans run ltbutton oncli
ck'button.synchronize()'gt
24Synchronisation avec un bouton(avec passage de
données)
var buttonvar periodiqueprocess Periodique(name)
this.go function () this.run fun
ction() this.count 0 while(tr
ue) this.count select
case waituntil(now()
3000) display(this.count)
case button.clicked()
process Button(name) this.clicked function
() this.data 0 //
optionnel this.synchronize function(data)
if (this.inSyncList) return
this.data data accept clicked //
non bloquant // parce qu'il est dans
this.synchronize // et non dans
run ltbutton onclick'button.synchronize()'gt
25Exercices
- Créer deux processus qui font bouger des images
dans des rectangles, indépendamment lun de
lautre. - Introduire des boutons qui appellent chacun une
méthode, dans un des processus, qui inverse la
vitesse à laquelle limage progresse. - Créer un simulateur de files dattentes, en
définissant des sources, des puits et des files
dattente dévénements.