Modelo de Cómputo. Programación concurrente

Documentos relacionados
Programación concurrente

Secciones críticas y exclusión mutua

UNIDAD 3 MEMORIA COMÚN. El problema de exclusión mutua

Concurrencia Espera Activa. Guillermo Román Díez

Sistemas Operativos. Concurrencia. Concurrencia de procesos. Concurrencia de procesos. Ejecución simultánea de procesos.

Sincronización de Procesos

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

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

Concurrencia Condiciones de Carrera. Guillermo Román Díez

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

un programa concurrente

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

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

*** S O L U C I O N E S ***

Sincronización de Procesos. Módulo 6. Departamento de Ciencias e Ingeniería de la Computación Universidad Nacional del Sur. Sincronización de Procesos

SEMAFOROS. if hay procesos suspendidos en este semáforo then despertar a uno de ellos else S = S + 1

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

Guillermo Román Díez

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

Concurrencia de Procesos

Sincronización de procesos

Natalia Partera Jaime Alumna colaboradora de la asignatura

Primitivas de Sincronización

Concurrencia. Primitivas IPC con bloqueo

Bases Formales de la Computación

Concurrencia. Guillermo Román Díez

Sistemas Operativos. Características de la Multiprogramación. Interacción entre Procesos. Características de la Multiprogramación

Sistemas operativos. Comunicación y sincronización de procesos

Sistemas Operativos Tema 3. Concurrencia Conceptos generales Sincronización con semáforos

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

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

Consistencia de memoria en C++

Ciclos. Recordando Estructuras de Control Básicas: SELECCIÓN (condición) SECUENCIAL

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

Lección 3: Concurrencia y sincronización

Puebla, Pue a 4 de Junio del Programación Concurrente y Paralela

CONCURRENCIA. Sincronización. Sistemas Operativos y Distribuidos. Prof. Javier Echaiz 1. Material Adicional (SOSD Mod 4)

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

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

Tópicos de programación Concurrente y Paralela

La Máquina de Acceso Aleatorio (Random Access Machine)

SINCRONIZACIÓN DE PROCESOS

Concurrencia Monitores. Guillermo Román Díez

Sistemas Operativos (Parte 2)

NuSMV: Interacción con el sistema

Verificación y Validación de Software

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

Tema 1 INTRODUCCIÓN A LOS LENGUAJES DE PROGRAMACIÓN

ESTRUCTURAS DE CONTROL

Acceso coordinado a recursos compartidos

Sistemas Distribuidos

Teoría de Sistemas Operativos Sincronización Procesos

Sincronización de Threads

Análisis de algoritmos

TEMA 5. ESTRUCTURAS DE CONTROL: BUCLES.

Programación Estructurada. Sesión 3:Estructras de control

LENGUAJE ST. (Structured Text) ST (Structured Text): 5to lenguaje definido en la norma IEC

Tema 1. Introducción a la. Programación Concurrente

ALGORÍTMICA. Dpto. Ingeniería de Sistemas y Automática Facultad de Ciencias Universidad de Valladolid.

Programación Concurrente y distribuida Modelo Concurrente declarativo

Adentrándonos a la Programación

Programación concurrente

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

Unidad 2: Gestión de Procesos

MECANISMOS PARA SINCRONIZACIÓN. Semáforos

Sistemas Operativos Tema 6. Concurrencia

Cena de filosofos y sincronizacion java

Sistemas Operativos Tema 7. Concurrencia

Concurrencia: deberes. Concurrencia: Exclusión Mutua y Sincronización. Concurrencia. Dificultades con la Concurrencia

Mensajes. Interbloqueo

Arreglos y Subrangos

Lección 3 Sentencias de control

PARADIGMA y LENGUAJES DE PROGRAMACIÓN

Contenido. a. Estructura lineal b. Estructura selectiva c. Estructura simultanea. a. Saltos y bucles 1. ESTRUCTURAS BÁSICAS

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

Secciones críticas y exclusión mutua

Sincronización entre procesos (1/2)

Programación Concurrente y Paralela. Unidad 1 Introducción

Prueba objetiva 2 - Clave a

Paradigmas de lenguajes de programación. Introducción a la programación imperativa. Lenguaje C. Programación imperativa

SISTEMAS OPERATIVOS, 10 de septiembre de 2009 Examen Convocatoria Extraordinaria

Sincronización. Arquitectura de Computadores

Transcripción:

Programa concurrente Programa concurrente: conjunto finito de procesos (secuenciales). Un proceso secuencial está escrito con un conjunto finito de acciones atómicas. Ejecución: una secuencia de acciones atómicas obtenidas intercalando arbitrariamente acciones atómicas de los distintos programas Una computación es la ejecución de una secuencia (intercalada) de acciones.

Estados y transiciones Estado: Análogo a la computación secuencial (modelo imperativo) puntero o etiqueta de próxima instrucción asignación de valores a variables Estado de un programa con N procesos es una tupla que contiene: N etiquetas de próxima instrucción (una para cada programa) la asignación de valores a variables locales y globales (en general asumimos un lenguaje tipado) Transición: Existe una transición entre dos estados s 1 y s 2 si s 2 se obtiene ejecutando una de las próximas acciones de alguno de los programas.

Ejemplo Considerar los threads global x = 0 thread p p1: x = x + 1 thread q q1: x = x + 1

Diagrama de transición de estados Grafo dirigido (Estados, Transiciones) definido inductivamente de la siguiente manera El estado inicial es un nodo del grafo Cada etiqueta de próxima instrucción apunta a la primer acción del proceso correspondientes La asignación a variables tienen el valor inicial (si está definido en el programa). Si s1 es un nodo del grafo y existe una transición entre s 1 y s 2, entonces s 2 está en el diagrama y el el arco (s 1,s 2 ) está en el grafo.

Ejemplo Considerar los threads global x = 0 thread p p1: x = x + 1 thread q q1: x = x + 1 Cuál es el diagrama de transición de estados? Notar que en general puede no ser finito. Cuándo?

Atomicidad Considerar ahora los threads global x = 0 thread p temp p1: temp = x p2: x = temp + 1 thread q q1: temp = x q2: x = temp + 1 Un algoritmo concurrente es correcto dependiendo de cuáles son las acciones atómicas Importante: Vamos a asumir que las acciones atómicas son: lecturas y asignaciones de valores a variables y la evaluación de expresiones booleanas en las estructuras de control.

Definiciones Sección crítica Llamamos sección crítica a una parte del programa que no puede ser ejecutada concurrentemente con otra sección critica del mismo programa. Exclusión mutua Llamamos exclusión mutua al problema de asegurar que dos (o mas) threads no ejecutan simultáneamente su sección crítica.

Esquema general Existen N procesos que tienen la siguiente estructura shared variables thread id = i while ( true ){ seccion no critica preprotocol seccion critica postprotocol } No hay variables compartidas entre sección crítica y no crítica. La sección crítica siempre termina. La no crítica no necesariamente termina.

Requerimientos de la exclusión mutua 1. Mutex: En cualquier momento hay como máximo un proceso en la región crítica. 2. Ausencia de deadlocks y livelocks: Si varios procesos intentan entrar a la sección crítica alguno lo logrará. 3. Garantía de entrada: Un proceso intentando entrar a su sección crítica tarde o temprano lo logrará.

Pregunta Podemos resolver el problema de la exclusión mutua para dos procesos asumiendo que las únicas operaciones atómicas son la lectura y la escritura en de variables?

Algoritmo I shared flag = false thread id = 0 thread id = 1 while ( true ){ while ( true ){ // seccion no critica // seccion no critica while ( flag ); while ( flag ); flag = true flag = true // seccion critica // seccion critica flag = false flag = false } } Mutex: No Ausencia dead/live-locks: Sí Garantía de entrada: Sí

Algoritmo II shared flag = { false, false } thread id = 0 thread id = 1 while ( true ){ while ( true ){ // seccion no critica // seccion no critica otro = ( id + 1) % 2 otro = ( id + 1) % 2 flag [ id] = true flag [ id] = true while ( flag [ otro ]); while ( flag [ otro ]); // seccion critica // seccion critica flag [ id] = false flag [ id] = false } } Mutex: Sí Ausencia dead/live-locks: No Garantía de entrada: No

Algoritmo III shared turno = 0 thread id = 0 thread id = 1 while ( true ){ while ( true ){ // seccion no critica // seccion no critica while ( turno!= id ); while ( turno!= id ); // seccion critica // seccion critica turno = ( id + 1) % 2 turno = ( id + 1) % 2 // seccion no critica // seccion no critica } } Mutex: Sí Ausencia dead/live-locks: Sí Garantía de entrada: No (si el thread de id 0 falla)

Algoritmo de Dekker (II + III) shared turno = 0 shared flag = { false, false } thread id = 0 thread id = 1 // seccion no critica... otro = (id + 1) % 2 flag [ id] = true while ( flag [ otro ]) if ( turno == otro ) flag [ id] = false while ( turno!= id ); flag [ id] = true // seccion critica turno = otro flag [ id] = false // seccion no critica

Algoritmo de Peterson shared turno = 0 shared flag = { false, false } thread id = 0 // seccion no critica otro = (id + 1) % 2 flag [ id] = true turno = otro while ( flag [ otro ] && turno == otro ); // seccion critica flag [ id] = false // seccion no critica

Dekker y Peterson Mutex: Sí Ausencia dead/live-locks: Sí Garantía de entrada: Sí Sólo sirven para dos procesos.

Algoritmo de Bakery shared entrando [n] = { false,..., false } shared numero [n] = {0,..., 0} thread id = 0 // seccion no critica entrando [ id] = true numero [id] = 1 + max ( numero [1],..., [n]) entrando [ id] = false for ( j = 1; j <= n; ++j) while ( entrando [j ]); while ( numero [j]!= 0 && ( numero [j] < numero [id] ( numero [j] == numero [id] && j < id ))); // seccion critica numero [ id] = 0 // seccion no critica Este algoritmo resuelve el problema para n threads.

Pregunta Qué otras acciones atómicas pueden idearse para resolver el problema de la exclusión mutua?

Test and set function test -and - set ( ref comp, ref local ) local = comp comp = 1 shared comp = 0 thread id = 0 thread id = 1 int local int local // seccion no critica // seccion no critica repeat repeat test -and - set (comp, local ) test -and - set (comp, local ) until ( local == 0) until ( local == 0) // seccion critica // seccion critica comp = 0 comp = 0 // seccion no critica // seccion no critica

Exchange function exchange ( ref comp, ref local ) temp = comp comp = local local = temp shared comp = 0 thread id = 0 thread id = 1 int local = 1 int local = 1 // seccion no critica // seccion no critica repeat repeat exchange (comp, local ) exchange (comp, local ) until ( local == 0) until ( local == 0) // seccion critica // seccion critica comp = 0 comp = 0 // seccion no critica // seccion no critica

Compare-and-swap function compare - and - swap ( ref comp, ref viejo, ref nuevo ) temp = comp if ( comp == viejo ) comp = nuevo return temp shared comp = false thread id = 0 thread id = 1 // seccion no critica // seccion no critica while ( compare -and - swap ( while ( compare -and - swap ( comp, false, true ) ); comp, false, true ) ); // seccion critica // seccion critica comp = false comp = false // seccion no critica // seccion no critica

Fetch-and-add function fetch - and - add ( ref comp, ref local, ref x) local = comp comp = comp + x shared ticket = 0 shared turno = 0 thread id = 0 thread id = 1 int miturno int miturno // seccion no critica // seccion no critica fetch -and - add ( fetch -and - add ( ticket, miturno, 1) ticket, miturno, 1) while ( turno!= miturno ); while ( turno!= miturno ); // seccion critica // seccion critica fetch -and - add ( fetch -and - add ( turno, miturno, 1) turno, miturno, 1) // seccion no critica // seccion no critica

Busy waiting Todas las soluciones vistas en esta clase son ineficientes dado que consumen tiempo de procesador en las esperas. Sería deseable suspender la ejecución de un proceso que intenta acceder a la sección crítica hasta tanto sea posible.