Systmes multiprocessus - PowerPoint PPT Presentation

1 / 25
About This Presentation
Title:

Systmes multiprocessus

Description:

En codant les instructions setTimeout judicieusement par soi-m me ... Introduire des boutons qui appellent chacun une m thode, dans un des processus, qui inverse la vitesse ... – PowerPoint PPT presentation

Number of Views:23
Avg rating:3.0/5.0
Slides: 26
Provided by: Petitp5
Category:

less

Transcript and Presenter's Notes

Title: Systmes multiprocessus


1
Systèmes multi-processus
  • C. Petitpierre
  • 25.3.2009

2
Comment simuler un thread en Javascript ?
  • En codant les instructions setTimeout
    judicieusement par soi-même
  • En utilisant Synchronous Javascript

3
Thread (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
4
Simulation 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)
5
Simulation 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)
6
Synchronisation 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
7
Synchronisation primaire entre threads
thread 1
thread 2
Suspendre
Relancer
En général, si Relancer est exécuté avant
Suspendre, Relancer na pas deffet.
8
Synchronisation 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.
9
Attente 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

10
Attente 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
11
Création et appel dun objet (actif ou passif)
Object Ox
Ox new Object() Ox.send (msg)
function send (msg) .... function run()

12
Objet actif protection activité
obj
Objet O1
obj.send (msg)
function send (msg) .......... function
run() . . .
Objet O2
obj.send (msg)
Objet O3
obj.send (msg)
13
La 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
14
Modé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
15
Modé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
16
Synchronous 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)
17
Deux 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
            
18
Sé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é
19
Canal 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() . . .    
20
Canal 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 )
21
Synchronisation 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
22
Kernel
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
23
Synchronisation 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
24
Synchronisation 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
25
Exercices
  • 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.
Write a Comment
User Comments (0)
About PowerShow.com