Está en la página 1de 40

Programación con memoria compartida

Andrés Becerra Sandoval abecerra@puj.edu.co

20 de abril de 2007

Programación con memoria compartida Andrés Becerra Sandoval abecerra@puj.edu.co 20 de abril de 2007

Contenido

Introducción

TADs imperativos Arreglos Diccionarios

Tuple Spaces Definición Ejemplo con Tuple Spaces Implementación

Locks

Definición

Implementación

Monitores

Definición

Ejemplo

Implementación

Ejemplo con Tuple Spaces Implementación Locks Definición Implementación Monitores Definición Ejemplo Implementación

Asignación

V = {NewCell Valor_inicial}

Asignación V = {NewCell Valor_inicial}

Asignación

V = {NewCell Valor_inicial} V := Nuevo_valor

Asignación V = {NewCell Valor_inicial} V := Nuevo_valor

Asignación

V = {NewCell Valor_inicial} V := Nuevo_valor @V El valor de la celda

Asignación V = {NewCell Valor_inicial} V := Nuevo_valor @V El valor de la celda

Asignación

V = {NewCell Valor_inicial} V := Nuevo_valor @V El valor de la celda {Exchange V Old New}

Asignación V = {NewCell Valor_inicial} V := Nuevo_valor @V El valor de la celda {Exchange V

Asignación

V = {NewCell Valor_inicial} V := Nuevo_valor @V El valor de la celda {Exchange V Old New}

Liga Old al valor viejo de la celda

Valor_inicial} V := Nuevo_valor @V El valor de la celda {Exchange V Old New} Liga Old

Asignación

V = {NewCell Valor_inicial} V := Nuevo_valor @V El valor de la celda {Exchange V Old New}

Liga Old al valor viejo de la celda Pone el valor New en la celda actualizándola

de la celda {Exchange V Old New} Liga Old al valor viejo de la celda Pone

Ejemplo Cola (Declarativa)

fun

{NewQueue }

 
 

X

C= { NewCell q

(0 X X ) }

p roc { I n s e r t

X }

N

S

E1 i n

 

q

(N S X

| E1 )=@C

C:= q (N+1 S E1 )

 

end

fun { Delete }

 

N

S1 E X i n

 

q

(N X | S1 E)=@C

C:=

q

(N1 S1 E )

X

 

end

i n

 

queue ( i n s e r t : I n s e r t d e l et e : Delete )

end

(N − 1 S1 E ) X   end i n   queue ( i n

Ejemplo Cola (Imperativa)

fun

{NewQueue }

 
 

X

C= { NewCell

 

p roc { I n s e r t

q (0 X X ) } X }

N

S E1 N1 i n

 
 

{

Exchange C

q (N

S

X | E1 )

q (N1 S E1 ) }

N1=N+1

 
 

end

 

fun { Delete }

 

N

S1 E N1 X i n

 

{

Exchange C

q (N

X

| S1 E )

q (N1 S1 E )

}

N1=N1

 

X

 

end

 

i n

 

queue ( i n s e r t : I n s e r t d e l et e : Delete )

 

end

  X   end   i n   queue ( i n s e r t

Ejemplo Cola (con Locks)

fun

{NewQueue }

 
 

X

C= { NewCell q

(0 X X ) }

L= {NewLock }

p roc { I n s e r t X }

N

S E1 i n

 
 

l

o c k L

then

 
 

q

(N S X | E1 )=@C

C:= q

(N+1 S E1 )

 

end

 

end

fun { Delete }

 

N

S1 E X i n

 

l

o c k L

then

 

q

(N X | S1 E)=@C

C:= q

(N1 S1 E )

 

end

 

X

 
 

end

 

i n

 

queue ( i n s e r t : I n s e r t d e l et e : Delete )

end

end

Ejemplo Cola (con clase)

c l a s s Queue a t t r queue prop l o c k i n g meth i n i t queue :=

q (0 X X )

end

meth i n s e r t (X )

l o c k N

S

S

E1 i n X | E1 )=@queue

q (N

queue := q (N+1 S E1 )

end

end

end

meth d e l et e (X )

l o c k N S1 E i n

end

q (N

queue := q (N1 S1 E )

X | S1 E)=@queue

end

S E1 ) end end end meth d e l et e (X ) l o

Contenido

Introducción

TADs imperativos Arreglos Diccionarios

Tuple Spaces Definición Ejemplo con Tuple Spaces Implementación

Locks

Definición

Implementación

Monitores

Definición

Ejemplo

Implementación

Ejemplo con Tuple Spaces Implementación Locks Definición Implementación Monitores Definición Ejemplo Implementación

Arreglos

Un arreglo es un conjunto de celdas indexadas A = {NewArray +LowI +HighI InitX } {Array.put A I X} A i := X {Array.get A I } A i {Array.exchange A +I OldVal NewVal} Actualiza A i

put A I X} A i : = X {Array. get A I } A i

Contenido

Introducción

TADs imperativos Arreglos Diccionarios

Tuple Spaces Definición Ejemplo con Tuple Spaces Implementación

Locks

Definición

Implementación

Monitores

Definición

Ejemplo

Implementación

Ejemplo con Tuple Spaces Implementación Locks Definición Implementación Monitores Definición Ejemplo Implementación

Diccionarios

Un diccionario es una lista de parejas (llave, valor) D = {NewDictionary}

{Dictionary.put D +LI X} En la llave LI coloca el valor

X

{Dictionary.get +D +LI X} Liga X al valor que tiene la llave LI

put D +LI X} En la llave LI coloca el valor X {Dictionary. get +D +LI

Contenido

Introducción

TADs imperativos Arreglos Diccionarios

Tuple Spaces Definición Ejemplo con Tuple Spaces Implementación

Locks

Definición

Implementación

Monitores

Definición

Ejemplo

Implementación

Ejemplo con Tuple Spaces Implementación Locks Definición Implementación Monitores Definición Ejemplo Implementación

Tuple Spaces

Un espacio de tuplas es un conjunto de tuplas etiquetadas write: {TS write T} Escribe la tupla T en el espacio TS read: {TS read(L T)} Espera a que el espacio TS tenga una tupla con etiqueta L, cuando suceda esto liga T a dicha tupla

read: {TS read(L T)} Espera a que el espacio TS tenga una tupla con etiqueta L,

Contenido

Introducción

TADs imperativos Arreglos Diccionarios

Tuple Spaces Definición Ejemplo con Tuple Spaces Implementación

Locks

Definición

Implementación

Monitores

Definición

Ejemplo

Implementación

con Tuple Spaces Implementación Locks Definición Implementación Monitores Definición Ejemplo Implementación

Cola (con Tuple Spaces)

fun

{NewQueue }

 
 

X

TS= {New

TupleSpace i n i t }

p roc

{ I n s e r t

X }

N

S E1 i n

 

{TS

read ( q q (N S

X | E1 ) ) }

{TS

w r i t e ( q (N+1 S E1 )

) }

 

end fun { Delete }

 

N

S1 E X i n

 

{TS

read ( q q (N X | S1 E )

) }

) }

{TS

w r i t e ( q (N1 S1 E )

X

 

end

 

i n

 

{TS w r i t e ( q (0

X X ) ) }

 

queue ( i n s e r t : I n s e r t d e l et e

: Delete )

end

  {TS w r i t e ( q (0 X X ) ) }  

Contenido

Introducción

TADs imperativos Arreglos Diccionarios

Tuple Spaces Definición Ejemplo con Tuple Spaces Implementación

Locks

Definición

Implementación

Monitores

Definición

Ejemplo

Implementación

con Tuple Spaces Implementación Locks Definición Implementación Monitores Definición Ejemplo Implementación

Implementación de Tuple Spaces

c l a s s TupleSpace prop l o c k i n g a t t r t u p l e d i c t

meth i n i t t u p l e d i c t : = { NewDictiona ry } end

meth

Ensu reP resent ( L )

 
 

i

f { Not { D i c t i o n a r y

then @t u p l e d i ct .

member @t u p l e d i ct

. L : = { NewQueue } end

L } }

end

meth

i

Cleanup ( L )

f

{

@t u p l e d i ct

L . s i z e }==0

 

then {

. D i c t i o n a r y . remove @t u p l e d i ct L }

end

end

meth w r i t e

( Tuple )

end

l o c k L= { Label Tuple } i n

end

{ s e l f Ensu reP resent

{ @t u p l e d i ct . L . i n s e r

( L ) }

t Tuple }
t
Tuple }

Implementación de Tuple Spaces

meth w r i t e ( Tuple )

l o c k L= { Label Tuple } i n

 

{ s e l f Ensu reP resent

( L

) }

{ @t u p l e d i ct

. L . i n s e r t

Tuple }

end

 

end meth read ( L ?Tuple )

 

l

o c k

{

s e l f Ensu reP resent

( L

) }

{

@t u p l e d i ct . L

. d e l et e

Tuple }

{

s e l f Cleanup ( L ) }

end

{ Wait Tuple }

end

L ) } { @t u p l e d i ct . L . d

Implementación de Tuple Spaces

meth readnonblock ( L ?Tuple l o c k

?B )

{

s e l f Ensu reP resent ( L ) }

i

f

{

@t u p l e d i ct

.

L

. s i z e } >0 then

 

{

@t u p l e d i ct

.

L

. d e l et e Tuple } B= t r u e

e

l s e B= f a l s e end

{

s e l f Cleanup ( L ) }

end

end

. L . d e l et e Tuple } B= t r u e e

Contenido

Introducción

TADs imperativos Arreglos Diccionarios

Tuple Spaces Definición Ejemplo con Tuple Spaces Implementación

Locks

Definición

Implementación

Monitores

Definición

Ejemplo

Implementación

Ejemplo con Tuple Spaces Implementación Locks Definición Implementación Monitores Definición Ejemplo Implementación

Locks - Candados

Los candados permiten proteger varias regiones críticas Podemos implementarlos, aunque Oz tiene una implementación a bajo nivel (C++) más eficiente

regiones críticas Podemos implementarlos, aunque Oz tiene una implementación a bajo nivel (C++) más eficiente

Contenido

Introducción

TADs imperativos Arreglos Diccionarios

Tuple Spaces Definición Ejemplo con Tuple Spaces Implementación

Locks

Definición

Implementación

Monitores

Definición

Ejemplo

Implementación

Ejemplo con Tuple Spaces Implementación Locks Definición Implementación Monitores Definición Ejemplo Implementación

Lock (no reentrante)

fun { SimpleLock }

Token = { NewCell u n i t }

p roc { Lock P }

Old New i n

{ Exchange Token Old New}

{ Wait Old } {P } New= u n i t

end

i n

 

l o c k ’ (

’ l o c k

:

Lock )

end

New} { Wait Old } {P } New= u n i t end i n  

Lock (no reentrante)

Con manejo de excepciones:

fun { Co r rectSimpleLock } Token = { NewCell u n i t }

p roc { Lock P }

Old New i n

end

{ Exchange Token Old New}

{ Wait Old }

t r y {P }

f i n a l l y New= u n i t end

i n

 

l o c k ’ ( ’ l o c k ’ : Lock )

end

Old } t r y {P } f i n a l l y New= u

Lock (reentrante)

fun { NewLock } Token = { NewCell u n i t }

CurThr = { NewCell u n i t }

p roc { Lock P }

i

f { Thread . t h i s }==@CurThr then {P }

e

l s e

Old New i n

{

Exchange Token Old New}

{

Wait Old }

CurThr : = { Thread

t r y {P }

f i n

a l l y

.

CurThr := u n i t New= u n i t

end

end

t h i s }

end

i n

 

l o c k ’ ( ’ l o c k ’ : Lock )

end

:= u n i t New= u n i t end end t h i s

Contenido

Introducción

TADs imperativos Arreglos Diccionarios

Tuple Spaces Definición Ejemplo con Tuple Spaces Implementación

Locks

Definición

Implementación

Monitores

Definición

Ejemplo

Implementación

Ejemplo con Tuple Spaces Implementación Locks Definición Implementación Monitores Definición Ejemplo Implementación

Monitores

Un monitor es un tipo abstracto de datos que protege varias regiones críticas (al igual que un lock), pero permite un mayor control al programador (son más expresivos), ya que los hilos se pueden notificar eventos entre si Operaciones:

Lock

Wait

Notify

NotifyAll

(son más expresivos), ya que los hilos se pueden notificar eventos entre si Operaciones: Lock Wait

Contenido

Introducción

TADs imperativos Arreglos Diccionarios

Tuple Spaces Definición Ejemplo con Tuple Spaces Implementación

Locks

Definición

Implementación

Monitores

Definición

Ejemplo

Implementación

Ejemplo con Tuple Spaces Implementación Locks Definición Implementación Monitores Definición Ejemplo Implementación

Bounded Buffer

Un ejemplo familiar:

c l a s s B uff e r a t t r

buf f i r s t meth i n i t (N)

l a s t n

i

 

buf : = { NewArray 0

N1 n u l l }

f

i r s

t :=0 l a s t :=0

n:=N i :=0

end

meth

put (X )

 
 

.

.

.

% w a it u n t i l i < n

%

now add an element :

@buf . @last :=X

 

l a s t : = ( @last +1) mod @n

i

:=@i+1

 

end

meth

get (X )

 
 

. .

.

% w a it u n t i l i >0

% now remove an element :

X=@buf . @ f i r s t

f i r s t : = ( @ f i r s t +1) mod @n

. % w a it u n t i l i >0 % now remove an

Bounded Buffer (con monitor)

Un monitor ayuda a modelar:

c l a s s B uff e r

a t t r m buf f i r s t meth i n i t (N)

l a s t n

i

m: = { NewMonitor }

buf : = { NewArray 0 N1 n u l l }

n:=N i

:=0 f i r s t :=0 l a s t :=0

end meth put (X )

{@m. ’ l o c k ’ p roc { $

}

i

f

@i>=@n then

{@m.

w a it } { s e l f put (X ) }

e

l s e

@buf . @last :=X l a s t : = ( @last +1) mod @n i :=@i+1 {@m. n o t i f y A l l }

end

end

end }

(X ) } e l s e @buf . @last :=X l a s t :

Bounded Buffer (con monitor)

meth get (X ) {@m. ’ l o c k ’ p roc { $ }

end

end

i

e

f @i==0 then {@m. l s e

X=@buf . @ f i r s t

f i r s t : = ( @ f i r s t

i :=@i1

{@m. n o t i f y A l l }

end

end }

w a it } { s e l f get (X ) }

+1) mod @n

f i r s t : = ( @ f i r s t i :=@i

Contenido

Introducción

TADs imperativos Arreglos Diccionarios

Tuple Spaces Definición Ejemplo con Tuple Spaces Implementación

Locks

Definición

Implementación

Monitores

Definición

Ejemplo

Implementación

Ejemplo con Tuple Spaces Implementación Locks Definición Implementación Monitores Definición Ejemplo Implementación

Implementación de Monitor

fun { NewMonitor }

Q= {NewQueue }

L= {NewGRLock }

p roc

{ LockM P }

 

{

L . get } t r

y {P }

f i n

a l l y

{ L . r e l e a s e } end

end

 

p roc

{ WaitM }

X

i n

 

{Q. i n s e

r t

X } { L

.

r e l e a s e } { Wait X } {

L . get }

end

 

p roc

{ Notif yM }

 

i n

U= {Q. deleteNonBlock } i n case U of [X] then X= u n i t

end

p roc { N ot if y A l lM }

L= {Q. d e l e t e A l l }

i n

e l s e s k i p end

f o r X i n L do X= u n i t end

end

monito r ( ’ l o c k ’ :

y
y

o t i f

LockM w a it : WaitM n

i p end f o r X i n L do X= u n i t
i p end f o r X i n L do X= u n i t
i p end f o r X i n L do X= u n i t
i p end f o r X i n L do X= u n i t
:
:

Notif yM

i p end f o r X i n L do X= u n i t

Cola extendida

fun {NewQueue } . fun { Size }

.

.

l o c k L then @C. 1 end

end fun { D e l e t e A l l }

l o c k L then

X q ( _ S E)=@C i n

C:= q (0 X X ) E= n i l S end end fun {
C:= q
(0 X X )
E= n i l S
end
end
fun
{ DeleteNonBlock }
l o c k L
then
i f { Size
} >0 then [ {
Delete } ] e l s e n i l end
end
end
i n
queue ( i n
s e r
t
:
I n
s e r t d e l et e
d e l e t e A l l : D e l e t e A l l
: Delete s i z e : Size
deleteNonBlock : DeleteNonBl

Lock(get-release)

fun {NewGRLock } Token1 = { NewCell

u n i t

}

Token2 = { NewCell

u n i t

}

CurThr = { NewCell

u n i t

}

p roc

{ GetLock } i f { Thread . t h i s } \ =@CurThr then Old New i n

{ Exchange Token1 Old New}

{ Wait Old } Token2 :=New

CurThr : = { Thread . t h i s }

end

end p roc { ReleaseLock } CurThr := u n i t u n i t =@Token2

end

i n

 

l o c k ’ ( get : GetLock r e l e a s e : ReleaseLock )

end

:= u n i t u n i t =@Token2 end i n   ’ l