Lección 10: Ejemplos de programación con semáforos

Documentos relacionados
Lección 6: Ejemplos de programación con semáforos

Estados de un proceso

7. Programación Concurrente

Lección 12: Ejemplos de programación con monitores

Lección 3: Concurrencia y sincronización

Unidad 1: Gestión de Procesos

Lección 7: Sincronización de procesos mediante monitores

Interbloqueo. Concurrencia: Interbloqueo e Inanición

SOLUCIONES. DURACIÓN: Dispone de dos horas para realizar el examen. Lea las instrucciones para el test en la hoja correspondiente.

Lección 5: Sincronización de procesos mediante semáforos

Sincronización de procesos

Grafo acíclico orientado cuyos nodos corresponden a sentencias individuales.

PROBLEMAS CLÁSICOS DE LA COMUNICACIÓN N ENTRE PROCESOS

Lección 15: Programación concurrente mediante paso síncrono de mensajes

Examen de Programación Concurrente - Clave: a Junio 2008 Departamento de Lenguajes, Sistemas Informáticos e Ingeniería del Software.

Sistemas Operativos Tema 6. Concurrencia

PROBLEMAS CLÁSICOS. EL PROBLEMA DE LOS FILÓSOFOS COMENSALES.

Sincronización entre procesos (aka: semáforos)

Teoría de Sistemas Operativos Sincronización Procesos

La cena de los filósofos.

Concurrencia. Primitivas IPC con bloqueo

TEMA 2: PROCESOS E HILOS: CONCURRENCIA, SINCRONIZACIÓN Y COMUNICACIÓN

Programación de Sistemas Concurrentes y Distribuidos 2 a Convocatoria curso 12/13

Concurrencia Monitores. Guillermo Román Díez

SISTEMAS OPERATIVOS I (Sistemas) / SISTEMAS OPERATIVOS (Gestión) septiembre 2009

Práctico 2. Sincronización

Cena de filosofos y sincronizacion java

SISTEMAS OPERATIVOS: COMUNICACIÓN Y SINCRONIZACIÓN ENTRE PROCESOS. Procesos concurrentes y problemas en la comunicación y la sincronización

Capítulo 16: Control de la concurrencia

Lecturas: Ben-Ari, secciones 4.1, 4.2, 4.3, 4.6 Andrews, intro. cap. 4 y sección 4.1. Exclusión mutua con semáforos

Lección 10: Coordinación mediante espacios de tuplas

Unidad 1: Gestión de Procesos

Semáforos. Lecturas: Ben-Ari, secciones 4.1, 4.2, 4.3, 4.6 Andrews, intro. cap. 4 y sección 4.1. Exclusión mutua con semáforos

Lecturas: Ben-Ari, secciones 4.1, 4.2, 4.3, 4.6 Andrews, intro. cap. 4 y sección 4.1

Lección 7: Sincronización de procesos El problema de la sección crítica

Especificando interacción con recursos compartidos

Programación Concurrente: Septiembre 2007 David Fernández-Amorós

Concurrencia. Programación Concurrente. Espera ocupada. Primitivas IPC con bloqueo

SISTEMAS OPERATIVOS I (Sistemas) / SISTEMAS OPERATIVOS (Gestión) septiembre 2009

CAPÍTULO 3. PROCESOS VS. HILOS

Apellidos: Nombre: Matrícula:

Apellidos: Nombre: Matrícula: UNIVERSIDAD POLITÉCNICA DE MADRID

CAPITULO 6. Control de Concurrencia y Recuperación

Concurrencia, exclusión mutua y sincronización. Capítulo 5 HungriaBerbesi

Concurrencia entre Procesos.

El problema del interbloqueo

Sistemas Operativos Tema 11. Interbloqueo José Miguel Santos C. Rubén García - Alexis Quesada

Prueba objetiva 2 - Clave a Concurrencia Primer semestre Grado en Ingeniería Informática. Universidad Politécnica de Madrid

El problema de los Filósofos

Transacciones y Control de Concurrencia (capítulo 15 del libro)

Acceso coordinado a recursos compartidos

Sistemas Operativos Ingeniería de telecomunicaciones Sesión 3: Concurrencia

Sistemas operativos: una visión aplicada. Capítulo 5 Comunicación y sincronización de procesos

Programación de Sistemas Concurrentes y Distribuidos 1 a Convocatoria curso 12/13

Programación concurrente

PRÁCTICO 4. La evaluación de una expresión sólo debe esperar por la evaluación de sus subexpresiones.

Unidad IV: Programación concurrente (MultiHilos) 4.1. Concepto de hilo

cilred.com GESTIÓN DE TRANSACCIONES

Programación concurrente

Tema 1: Programación Multiproceso. Curso

seguridad y vivacidad/viveza

Interbloqueos. Módulo 7. Departamento de Informática Facultad de Ingeniería Universidad Nacional de la Patagonia San Juan Bosco

Introducción a Sistemas Operativos: Concurrencia

Hilos Secciones Stallings:

4.6.- Integridad: Control de concurrencia.

*** SOLUCIONES *** SISTEMAS OPERATIVOS Examen Parcial 24 de Abril de 2010

CDI Exclusión mutua a nivel alto. conceptos

Primitivas de Sincronización (continuación) MONITORES: Primitiva de alto nivel, es a nivel de lenguajes como: ADA, PASCAL, JAVA.

Sistemas Operativos. Paso de Mensajes. Direccionamiento de Mensajes. Sincronización de mensajes. Mensajes permiten: Paso de Mensajes

Programación Concurrente y Distribuída Estado Compartido, 2010

SINCRONIZACIÓN DE PROCESOS

SISTEMAS OPERATIVOS PROBLEMAS RESUELTOS. Jorge Walter Orellana Araoz

Sincronización de Procesos

Tema 6: Clases. Índice

Ejercicios con Monitores

Programación de Multitareas utilizando Hilos

Sistemas Operativos (Parte 2)

Programación Concurrente en Java: Threads. Ejemplos de programación concurrente. Luis Fernando Llana Díaz. 24 de abril de 2008

Fundamentos de los Sistemas Operativos

Informática I Threads

Departamento de Ciencias e Ingeniería de la Computación Universidad Nacional del Sur

SISTEMAS OPERATIVOS:

PRIMITIVAS DE SINCRONIZACIÓN BASADAS EN MEMORIA COMPARTIDA.

Transcripción:

Lección 10: Ejemplos de programación con semáforos El problema de la cena de los filósofos El problema de los lectores y escritores Ejercicios Gestión de concurrencia mediante paso de testigo (implementación con semáforos) J. Ezpeleta 1

El problema de la cena de los filósofos El problema: cada filósofo, alternativamente, piensa y come se necesitan dos tenedores para comer el de la izquierda y el de la derecha la cantidad de espaguetis es infinita! hay que evitar que se mueran de hambre por la cabezonería de los filósofos Salta a la vista que: dos filósofos vecinos no pueden comer a la vez no más de dos filósofos pueden comer a la vez Objetivo: desarrollar un programa concurrente que simule el sistema 5 4 1 3 Filósofo:: Mq TRUE coge tenedores come deja tenedores piensa 2 J. Ezpeleta 2

El problema de la cena de los filósofos Vars cogido,dejado:vector(1..n) de Ent:=(1..5,0) Filosofo(i:1..5):: I: {1..5}. Mq TRUE dejado( )<=cogido( )<=dejado( )+1 <cogido(i) := cogido(i)+1> <cogido(i 1) := cogido(i 1)+1> come <dejado(i) := dejado(i)+1> <dejado(i 1) := dejado(i 1)+1> piensa J. Ezpeleta 3

El problema de la cena de los filósofos Vars cogido,dejado:vector(1..n) de Ent:=(1..5,0) Filosofo(i:1..5):: I: {1..5}. Mq TRUE dejado( )<=cogido( )<=dejado( )+1 <await cogido(i)<dejado(i)+1 cogido(i) := cogido(i)+1 > <await cogido(i 1)<dejado(i 1)+1 cogido(i 1) := cogido(i 1)+1 > come <dejado(i) := dejado(i)+1> <dejado(i 1) := dejado(i 1)+1> piensa J. Ezpeleta 4

El problema de la cena de los filósofos Vars tenedor:vector(1..n) de sem:=(1..5,1) Filosofo(1..5):: Mq TRUE wait(tenedor(i)) wait(tenedor(i 1)) come send(tenedor(i)) send(tenedor(i 1)) piensa Problema: se llega a bloquear Bloqueo: recursos de uso en exclusión mutua estados hold-and-wait no preemption ciclo wait-for Proponer una solución J. Ezpeleta 5

El problema de los lectores/escritores Problema: dos tipos de procesos para acceder a una base de datos: lectores: consultan la BBDD escritores: consultan y modifican la BBDD cualquier transacción aislada mantiene la consistencia de la BBDD cuando un escritor accede a la BBDD, es el único proceso que la puede usar varios lectores pueden acceder simultáneamente J. Ezpeleta 6

El problema de los lectores/escritores Vars leyendo:=0, numlec:=0, escribiendo:vector(1..n) de Ent := (1..n,0) Lector(i:1..m):: <numlec:=numlec+1 Si numlec=1 leyendo:=leyendo+1 FSi> leebasedatos <numlec:=numlec-1 Si numlec=0 leyendo:=leyendo-1 FSi> I: leyendo+ {1..n}.escribiendo( )<=1 Escritor(i:1..n):: <escribiendo(i):= escribiendo(i)+1> escribebasedatos <escribiendo(i):= escribiendo(i)-1> J. Ezpeleta 7

El problema de los lectores/escritores vars leyendo:=0, numlec:=0, escribiendo:vector(1..n) de Ent := (1..n,0) Lector(i:1..m):: <numlec:=numlec+1 Si numlec=1 <await SUM<=0 leyendo:=leyendo+1 > FSi> leebasedatos <numlec:=numlec-1 Si numlec=0 leyendo:=leyendo-1 FSi> SUM: leyendo+ {1..n}.escribiendo( ) I: SUM<=1 Escritor(i:1..n):: <await SUM<=0 escribiendo(i):= escribiendo(i)+1> escribebasedatos <escribiendo(i):= escribiendo(i)-1> J. Ezpeleta 8

vars El problema numlec:=0, de mutexlec:sem:=1,permiso:sem:=1 los lectores/escritores Lector(i:1..m):: wait(mutexlect) numlec:=numlec+1 Si numlec=1 wait(permiso) FSi send(mutexlect) leebasedatos wait(mutexlect) numlec:=numlec-1 Si numlec=0 send(permiso) FSi send(mutexlect) Escritor(i:1..n):: wait(permiso) escribebasedatos send(permiso) J. Ezpeleta 9

El problema de los lectores/escritores. Prioridad Lector(i:1..n):: Si escritor escribiendo o esperando Ent esperarparaleer Fsi avisar sig. lector espera leebasedatos Si último y escritor espera Ent avisarle Fsi Escritor(i:1..m):: Si alguien escribiendo o leyendo Ent esperarparaesc Fsi escribebasedatos Si escritor esperando Ent avisarle SiNo Si lector esperando Ent avisarle FSi Fsi J. Ezpeleta 10

vars numlec: Ent:=0, mutex:sem:=1; puedesleer, El puedesescribir:sem:=0;numle,numee: problema de los lectores/escritores Ent:=0 Lector(i:1..m):: wait(mutex) Si escribiendo numee>0 numle:=numle+1 send(mutex) wait(puedesleer) numle:=numle-1 FSi numlec:=numlec+1 Si numle>0 send(puedesleer) Si_No send(mutex) Fsi Prioridad a escritores leebasededatos wait(mutex) numlec:=numlec-1 Si numlec=0 numee>0 send(puedesescribir) Si_No send(mutex) FSi J. Ezpeleta 11

... Escritor(i:1..n):: El problema de los lectores/escritores wait(mutex) Si numlec>0 escribiendo numee:=numee+1 send(mutex) wait(puedesescribir) numee:=numee-1 FSi escribiendo:=true send(mutex) escribirbbdd Prioridad a escritores wait(mutex) Si numee>0 Ent send(puedesescribir) Si_No Si nle>0 Ent send(puedesleer) Si_No send(mutex) FSi FSi J. Ezpeleta 12

Ejercicios Ejercicio 1: Un grafo de precedencias de tareas es un grafo dirigido acíclico que establece un orden de ejecución de tareas de un programa concurrente, de manera que una tarea no puede empezar a ejecutarse hasta que las que sean anteriores en el grafo hayan terminado. Por ejemplo, si consideramos el grafo de la figura 1, la tarea P4 no puede empezar a ejecutarse hasta que P2 y P1 terminen, mientras que P5 no puede empezar hasta que P1, P2, P3 y P4 hayan terminado. Asumamos que cada tarea ejecuta el siguiente código: espera a que las tareas anteriores terminen ejecuta el cuerpo de la tarea avisa de su terminación a quien corresponda P1 P3 P5 1) Usando semáforos, escribir el programa concurrente correspondiente al diagrama de la figura P2 P4 2) Esquematizar un método general de sincronización para un grafo de precedencias general. Calcular el número de semáforos que el método utilizaría. Este número se puede poner, por ejemplo, como función del número de tareas, de arcos, etc. J. Ezpeleta 13

Ejercicios Ejercicio 2: Considerar el siguiente programa concurrente: Calcular para él el Vars x: Ent := 0; conjunto de los posibles s1: sem := 1; valores finales para la s2: sem := 0 P1:: variable x P2:: P3:: Ejercicio 3: Implementar un semáforo general en base a uno (o varios) semáforo binarios wait(s2) wait(s1) x := 2*x send(s1) wait(s1) x := x*x send(s1) wait(s1) x := x+3 send(s2) send(s1) J. Ezpeleta 14

Ejercicios Ejercicio 4: Problema de uso de recursos: n procesos compiten por el uso de un recurso, del que se disponen de k unidades. Las peticiones de uso del recurso son del tipo: reserva(r): --necesito se me concedan, de golpe, r unidades del recurso libera(l): --libero, de golpe, l unidades del recurso, que previamente se me habían concedido Programar dichas operaciones usando semáforos binarios J. Ezpeleta 15

Ejercicios Ejercicio 5: Considerar el siguiente programa, que presenta un problema: nada impide que se use una variable en una expresión con un valor todavía indefinido. Se pide lo siguiente. Utilizando semáforos, completar el código de dicho programa de manera que nunca una variable sea usada en una expresión antes de que se le haya asignado un valor, ya sea mediante una instrucción leer o una asignación. Explicar cómo se generalizaría dicha solución para cualquier programa. Podría un programa escrito de acuerdo a la propuesta anterior llegar a bloquearse? Si es así, escribir un ejemplo sencillo de bloqueo. Si no es posible, justificar "de manera convincente" por qué es así. Vars a,b,c,d: Ent; P1:: leer(a); c := a+b b := 2*d P2:: leer(c) leer(d) b := a+d+c J. Ezpeleta 16

El paso del testigo Veamos una forma (eficiente) de implementar exclusiones mutuas y sincronización por condición con semáforos binarios Necesitamos: E 1 : <S i > E 2 :<await B j S j > Un semáforo binario para asegurar la ejecución en exclusión mutua: mutex (valor inicial 1) Para cada j, un semáforo binario b j y un contador d j, a cero J. Ezpeleta 17

El paso del testigo Cambiar E 1 : wait(mutex) S i AVISAR E 2 : wait(mutex) Si no B j Ent d j :=d j +1 send(mutex) wait(b j ) FSi S j AVISAR donde AVISAR: --mutex=0 Sel B 1 y d 1 >0: d 1 :=d 1-1;send(b 1 ) B n y d n >0: d n :=d n -1;send(b n ) otros casos: send(mutex) FSel J. Ezpeleta 18