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.