análisis y diseño de software ditpepe/doc/adsw/tema2/032_mutex.pdf · 2018-04-10 · exclusión...

36
Análisis y diseño de software dit UPM Tema 2: Concurrencia /exclusión mutua /java José A. Mañas 5.4.2017

Upload: others

Post on 13-Jun-2020

0 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Análisis y diseño de software ditpepe/doc/adsw/tema2/032_mutex.pdf · 2018-04-10 · exclusión mutua •zonas críticas –secciones del programa que sólo debe ejecutar una threaden

Análisis y diseño de software ditUPM

Tema 2: Concurrencia/exclusión mutua /java

José A. Mañas

5.4.2017

Page 2: Análisis y diseño de software ditpepe/doc/adsw/tema2/032_mutex.pdf · 2018-04-10 · exclusión mutua •zonas críticas –secciones del programa que sólo debe ejecutar una threaden

memoria compartida: carreras

• carreras (race conditions)

– yo me traigo el dato a mi memoria local

– tu te llevas el dato a tu memoria local

– modificamos nuestros datos

– yo lo devuelvo, tu lo devuelves

– ¿quién tiene la última palabra?

concurrencia 2

Page 3: Análisis y diseño de software ditpepe/doc/adsw/tema2/032_mutex.pdf · 2018-04-10 · exclusión mutua •zonas críticas –secciones del programa que sólo debe ejecutar una threaden

variables compartidas: carreras

concurrencia /exclusión mutua 3

thread A:run() { v = v + 1; }

thread B:run() { v = v * 2; }

v = 5

v = 12 v = 6 v = 10 v = 11

RMW issuesRead-Modify-Write

Page 4: Análisis y diseño de software ditpepe/doc/adsw/tema2/032_mutex.pdf · 2018-04-10 · exclusión mutua •zonas críticas –secciones del programa que sólo debe ejecutar una threaden

variables compartidas: carreras

concurrencia /exclusión mutua 4

thread A:run() { v = v + 1; }

thread B:run() { w = v * 2; }

v = 5

v = 6w = 12

v = 6w = 10

RMW issuesRead-Modify-Write

Page 5: Análisis y diseño de software ditpepe/doc/adsw/tema2/032_mutex.pdf · 2018-04-10 · exclusión mutua •zonas críticas –secciones del programa que sólo debe ejecutar una threaden

índice

• acceso a variables compartidas

• carreras

• exclusión mutua

– cerrojos (locks)

– semáforos (semaphores)

– synchronized

– monitores (monitors)

concurrencia /exclusión mutua 5

Page 6: Análisis y diseño de software ditpepe/doc/adsw/tema2/032_mutex.pdf · 2018-04-10 · exclusión mutua •zonas críticas –secciones del programa que sólo debe ejecutar una threaden

variable compartida desprotegida

concurrencia /exclusión mutua 6

public class Contador {private int cuenta = 0;

public int incrementa(int v) {cuenta += v;return cuenta;

}

public int decrementa(int v) {cuenta -= v;return cuenta;

}}

public int incrementa(int v) {int registro = cuenta;registro = registro + v;cuenta = registro;return cuenta;

}

alguienpuedemetersepor en medio

se dice que el estado del objeto(en este caso el campo ‘cuenta’)puede verse estropeado

RMW issuesRead-Modify-Write

Page 7: Análisis y diseño de software ditpepe/doc/adsw/tema2/032_mutex.pdf · 2018-04-10 · exclusión mutua •zonas críticas –secciones del programa que sólo debe ejecutar una threaden

exclusión mutua

• zonas críticas– secciones del programa que sólo debe ejecutar una thread en un momento dado, o habría problemas

• protocolo– si está ocupado, espero– si está libre

• entro– cierro por dentro

• hago mis cosas – yo solito• salgo

– dejo abierto– si hay alguien esperando, que entre– si no, queda abierto

concurrencia /exclusión mutua 7

java mantiene una cola de threads esperando

a que el cerrojo se abra

Page 8: Análisis y diseño de software ditpepe/doc/adsw/tema2/032_mutex.pdf · 2018-04-10 · exclusión mutua •zonas críticas –secciones del programa que sólo debe ejecutar una threaden

exclusión mutua

• zonas críticas– secciones del programa que sólo debe ejecutar una thread en un momento dado, o habría problemas

• protocolo– si está ocupado, espero– si está libre

• entro– cierro por dentro

• hago mis cosas – yo solito• salgo

– dejo abierto– si hay alguien esperando, que entre– si no, queda abierto

concurrencia /exclusión mutua 8

todo esto es indivisible

ATÓMICO

Page 9: Análisis y diseño de software ditpepe/doc/adsw/tema2/032_mutex.pdf · 2018-04-10 · exclusión mutua •zonas críticas –secciones del programa que sólo debe ejecutar una threaden

state

concurrencia 9

new Thread()NEW

RUNNABLE

BLOCKED

WAITING

TIMED WAITING

TERMINATED

start()

Page 10: Análisis y diseño de software ditpepe/doc/adsw/tema2/032_mutex.pdf · 2018-04-10 · exclusión mutua •zonas críticas –secciones del programa que sólo debe ejecutar una threaden

arquitecturas

• no estructuradas

– locks

– semáforos

• estructuradas

– bloques synchronized

– métodos synchronized

– monitores

concurrencia /exclusión mutua 10

Page 11: Análisis y diseño de software ditpepe/doc/adsw/tema2/032_mutex.pdf · 2018-04-10 · exclusión mutua •zonas críticas –secciones del programa que sólo debe ejecutar una threaden

Lock

• package java.util.concurrent.locks

– interface Lock

– class ReentrantLock implements Lock

• OJO:

– hay que asegurarse de que se libera el cerrojo; por ejemplo, si hay excepciones

concurrencia /exclusión mutua 11

lock.lock();

... operaciones ...

lock.unlock();

try {

lock.lock();

zona exclusiva

} finally {

lock.unlock();

}

Page 12: Análisis y diseño de software ditpepe/doc/adsw/tema2/032_mutex.pdf · 2018-04-10 · exclusión mutua •zonas críticas –secciones del programa que sólo debe ejecutar una threaden

estado compartido protegido

concurrencia /exclusión mutua 12

public class Contador {private int cuenta = 0;private final Lock LOCK = new ReentrantLock();

nadie puedemetersepor enmedio estado protegido

public int incrementa(int v) {try {

LOCK.lock();cuenta += v;return cuenta;

} finally {LOCK.unlock();

}}

public int decrementa(int v) {try {

LOCK.lock();cuenta -= v;return cuenta;

} finally {LOCK.unlock();

}}

Page 13: Análisis y diseño de software ditpepe/doc/adsw/tema2/032_mutex.pdf · 2018-04-10 · exclusión mutua •zonas críticas –secciones del programa que sólo debe ejecutar una threaden

atomicidad

• las operaciones lock() y unlock() son indivisibles

– no se permite que una thread se vea desplazada por otra mientras se están ejecutando

• esta misma propiedad sirve para todas las formas de sincronización:

– semáforos y bloques sincronizados

concurrencia /exclusión mutua 13

Page 14: Análisis y diseño de software ditpepe/doc/adsw/tema2/032_mutex.pdf · 2018-04-10 · exclusión mutua •zonas críticas –secciones del programa que sólo debe ejecutar una threaden

semáforo• package java.util.concurrent

– class Semaphore• Semaphore (int permisos)

• semáforo binario: gestiona 1 permiso de acceso– void acquire()– void release()

• semáforo general: gestiona N permisos– void acquire(int n)

• solicita N permisos del semáforosi no hay bastantes, espero

• cuando los haya, sigo

– void release(int n)• devuelvo N permisos al semáforo• si hay alguien esperando, se intenta satisfacerle

concurrencia /exclusión mutua 14

Page 15: Análisis y diseño de software ditpepe/doc/adsw/tema2/032_mutex.pdf · 2018-04-10 · exclusión mutua •zonas críticas –secciones del programa que sólo debe ejecutar una threaden

uso semáforo binario

concurrencia /exclusión mutua 15

semaforo.acquire();

... operaciones ...

semaforo.release();

semaforo.acquire();

try {

... operaciones ...

} finally {

semaforo.release();

}

Page 16: Análisis y diseño de software ditpepe/doc/adsw/tema2/032_mutex.pdf · 2018-04-10 · exclusión mutua •zonas críticas –secciones del programa que sólo debe ejecutar una threaden

uso de los semáforos

1. limitar el número de threads en la zona crítica

concurrencia /exclusión mutua 16

Semaphore sm = new Semaphore(5) # Max: 5-threads

InputStream fetch_page(String ref):sm.acquire();try {

URL url = new URL(ref);return url.openStream();

} finally {sm.release();

}

Semaphore semaphore = new Semaphore(N)

semaphore.acquire();try {

… zona crítica …} finally {

semaphore.release();}

Page 17: Análisis y diseño de software ditpepe/doc/adsw/tema2/032_mutex.pdf · 2018-04-10 · exclusión mutua •zonas críticas –secciones del programa que sólo debe ejecutar una threaden

uso de los semáforos

2. coordinar threads

concurrencia /exclusión mutua 17

thread_1stmt_1;stmt_2;done.release();stmt_3;stmt_4;

Semaphore done = new Semaphore(0)

thread_2stmt_1;stmt_2;done.acquire();stmt_3;stmt_4;

Page 18: Análisis y diseño de software ditpepe/doc/adsw/tema2/032_mutex.pdf · 2018-04-10 · exclusión mutua •zonas críticas –secciones del programa que sólo debe ejecutar una threaden

ejemplo: semáforo

concurrencia /exclusión mutua 18

public class Parking {private final int capacidad; // número de coches que cabenprivate final Semaphore semaphore;

// constructorpublic ParkingSemaphore(int capacidad) {

this.capacidad = capacidad;semaphore = new Semaphore(capacidad);

}

// barreras de entradapublic void entra() throws InterruptedException {

semaphore.acquire(1);}

// barreras de salidapublic void sale() {

semaphore.release(1);}

ejemplo

Page 19: Análisis y diseño de software ditpepe/doc/adsw/tema2/032_mutex.pdf · 2018-04-10 · exclusión mutua •zonas críticas –secciones del programa que sólo debe ejecutar una threaden

ejemplo: semáforo con N permisos

public class EsperaNTareas {

public static void main(String[] args)

throws InterruptedException {

Semaphore contador = new Semaphore(0);

List<Tarea> tareas = new ArrayList<Tarea>();

tareas.add(new Tarea(contador));

// ... N veces

for (Tarea tarea : tareas)

tarea.start();

// espera a que todas acaben

contador.acquire(tareas.size());

}

}concurrencia /exclusión mutua 19

ejemplo

Page 20: Análisis y diseño de software ditpepe/doc/adsw/tema2/032_mutex.pdf · 2018-04-10 · exclusión mutua •zonas críticas –secciones del programa que sólo debe ejecutar una threaden

ejemplo: semáforo con N permisos

public class Tarea extends Thread {

private Semaphore contador;

public Tarea( Semaphore contador ){

this.contador = contador;

}

public void run() {

// hace su tarea

contador.release();

}

}

concurrencia /exclusión mutua 20

ejemplo

Page 21: Análisis y diseño de software ditpepe/doc/adsw/tema2/032_mutex.pdf · 2018-04-10 · exclusión mutua •zonas críticas –secciones del programa que sólo debe ejecutar una threaden

comentarios

locks y semáforos

• son de bajo nivel

• primitivas independientes

• requieren que todos colaboren

• se puede hacer cualquier cosa,estén bien o no

– abrir y cerrar no están necesariamente emparejados sintácticamente

concurrencia /exclusión mutua 21

Page 22: Análisis y diseño de software ditpepe/doc/adsw/tema2/032_mutex.pdf · 2018-04-10 · exclusión mutua •zonas críticas –secciones del programa que sólo debe ejecutar una threaden

bloques synchronized• synchronized (objeto) {

// zona de exclusión mutua

}

synchronized (cc) {

... operaciones ...

}

concurrencia /exclusión mutua 22

cc: Object compartido

el cerrojo se libera al salir del bloque:• última sentencia• return interno• excepción

Page 23: Análisis y diseño de software ditpepe/doc/adsw/tema2/032_mutex.pdf · 2018-04-10 · exclusión mutua •zonas críticas –secciones del programa que sólo debe ejecutar una threaden

estado compartido protegido

concurrencia /exclusión mutua 23

public class Contador {private int cuenta = 0;private final Object LOCK = new Object();

public int incrementa(int v) {synchronized (LOCK) {

cuenta += v;return cuenta;

}}

public int decrementa(int v) {synchronized (LOCK) {

cuenta -= v;return cuenta;

}}

Page 24: Análisis y diseño de software ditpepe/doc/adsw/tema2/032_mutex.pdf · 2018-04-10 · exclusión mutua •zonas críticas –secciones del programa que sólo debe ejecutar una threaden

métodos synchronized

• usando this como cerrojo

– es lo mismopero escribes menos y te equivocas menos

concurrencia /exclusión mutua 24

public synchronized int incrementa(int v) {cuenta += v;return cuenta;

}

public synchronized int decrementa(int v) {cuenta -= v;return cuenta;

}

Page 25: Análisis y diseño de software ditpepe/doc/adsw/tema2/032_mutex.pdf · 2018-04-10 · exclusión mutua •zonas críticas –secciones del programa que sólo debe ejecutar una threaden

comentarios

bloques y métodos synchronized

• son de alto nivel

• delimitan una zona

• requieren que todos colaboren

• un thread que ya posee un cerrojo puede entrar en zonas protegidas por el mismo cerrojo– esto permite que un método synchronized

llame a otro método synchronized

concurrencia /exclusión mutua 25

Page 26: Análisis y diseño de software ditpepe/doc/adsw/tema2/032_mutex.pdf · 2018-04-10 · exclusión mutua •zonas críticas –secciones del programa que sólo debe ejecutar una threaden

monitores

• clases donde

– se monitoriza toda modificación del estado

• el estado es privado

• todos los accesos son zonas críticas

• en java

– todos las campos son privados

– todos los métodos son synchronized

concurrencia /exclusión mutua 26

Page 27: Análisis y diseño de software ditpepe/doc/adsw/tema2/032_mutex.pdf · 2018-04-10 · exclusión mutua •zonas críticas –secciones del programa que sólo debe ejecutar una threaden

monitor

concurrencia /exclusión mutua 27

public class Contador {private int cuenta = 0;

public synchronized int getCuenta() {return cuenta;

}

public synchronized int incrementa(int v) {cuenta += v;return cuenta;

}

public synchronized int decrementa(int v) {cuenta -= v;return cuenta;

}}

synchronized garantiza• acceso exclusivo• variables actualizadas

ejemplo

Page 28: Análisis y diseño de software ditpepe/doc/adsw/tema2/032_mutex.pdf · 2018-04-10 · exclusión mutua •zonas críticas –secciones del programa que sólo debe ejecutar una threaden

interbloqueo - deadlock

• todos los mecanismos de exclusión mutua pueden provocar situaciones de bloqueo si varios threads intentan acaparar recursos de forma desordenada

• ejemplo típico

concurrencia /exclusión mutua 28

thread 1:synchronized(recurso1) {synchronized(recurso2) {// hago mis cosas;

}}

thread 2:synchronized(recurso2) {synchronized(recurso1) {// hago mis cosas;

}}

Page 29: Análisis y diseño de software ditpepe/doc/adsw/tema2/032_mutex.pdf · 2018-04-10 · exclusión mutua •zonas críticas –secciones del programa que sólo debe ejecutar una threaden

deadlock prevention

• reservar de 1 vez y en orden

concurrencia /exclusión mutua 29

void get_in(Lock... locks) {Arrays.sort(locks);for (Lock lock : locks)

lock.lock();}

void get_out(Lock... locks) {for (Lock lock : locks)

lock.unlock();}

Page 30: Análisis y diseño de software ditpepe/doc/adsw/tema2/032_mutex.pdf · 2018-04-10 · exclusión mutua •zonas críticas –secciones del programa que sólo debe ejecutar una threaden

conceptos adicionales

• operación atómica– la que se ejecuta sin cambiar de thread

– ejemplo• int n = v++;

NO es atómica => posibles carreras

– solución: envolverla

– véase AtomicInteger

concurrencia /exclusión mutua 30

class IntAtomico {private int v;

synchronized int inc() {v++;return v;

}}

IntAtomico va = new IntAtomico();

int n = va.inc();

Page 31: Análisis y diseño de software ditpepe/doc/adsw/tema2/032_mutex.pdf · 2018-04-10 · exclusión mutua •zonas críticas –secciones del programa que sólo debe ejecutar una threaden

Atomic...

concurrencia /exclusión mutua 31

public class Contador {private AtomicInteger saldo = new AtomicInteger(0);

public int incrementar(int v) {return saldo.addAndGet(v);

}

public int decrementar(int v) {return saldo.addAndGet(-v);

}}

Page 32: Análisis y diseño de software ditpepe/doc/adsw/tema2/032_mutex.pdf · 2018-04-10 · exclusión mutua •zonas críticas –secciones del programa que sólo debe ejecutar una threaden

thread-safe objects

• se dice de clases protegidas para poder ser utilizadas por varios threads sin problemas

• o sea, que controlan su estado para que

– si varias threads comparten descuidadamente el mismo objeto,

– su estado interno nunca se corrompe

concurrencia /exclusión mutua 32

Page 33: Análisis y diseño de software ditpepe/doc/adsw/tema2/032_mutex.pdf · 2018-04-10 · exclusión mutua •zonas críticas –secciones del programa que sólo debe ejecutar una threaden

error ¿qué es zona crítica?

concurrencia /exclusión mutua 33

class TSV {private int v = 0;

synchronized int get() {return v;

}

synchronized set(int v) {this.v = v;

}}

independientemente de queTSVsea thread-safe

TSV cc = new TSV()Object lock = new Object()

synchronized (lock) {int valor = cc. get();valor+= 1;cc.set(valor);

}

TSV cc = new TSV();

int valor = cc. get();valor+= 1;cc.set(valor);

Page 34: Análisis y diseño de software ditpepe/doc/adsw/tema2/032_mutex.pdf · 2018-04-10 · exclusión mutua •zonas críticas –secciones del programa que sólo debe ejecutar una threaden

cerrojos

• el mecanismo de cerrojos alrededor de zonas de acceso exclusivo

– es un mecanismo pesimista

• siempre me protejo por si acaso

– puede hacer que una thread quede esperando a que otra termine

• si la otra casca, puede esperar eternamente

• puede ser que una tarea de alta prioridad quede esperando a que termine otra de menor prioridad– priority inversión

concurrencia /exclusión mutua 34

Page 35: Análisis y diseño de software ditpepe/doc/adsw/tema2/032_mutex.pdf · 2018-04-10 · exclusión mutua •zonas críticas –secciones del programa que sólo debe ejecutar una threaden

priority inversion

• C (prioridad baja) cierra un lock

• A (prioridad alta) quiere el lock que tiene C

• B (prioridad media) monopoliza la cpu

• resultado

– B se lo lleva todo mientras A espera tontamente

concurrencia /exclusión mutua 35

ej: https://en.wikipedia.org/wiki/Mars_Pathfinder

Page 36: Análisis y diseño de software ditpepe/doc/adsw/tema2/032_mutex.pdf · 2018-04-10 · exclusión mutua •zonas críticas –secciones del programa que sólo debe ejecutar una threaden

wait-free algorithms

• es una alternativa al uso de cerrojos

• mecanismo optimista1. no pido permiso para entrar

2. si hay alguien, pido perdón y salgo

• es más eficiente si hay pocos fallos (paso 2)– few contending threads

• es menos eficiente si hay que pedir perdón muchas veces– el compilador de java puede optimizar

dinámicamente

concurrencia /exclusión mutua 36