Práctica 8: Barreras



Documentos relacionados
Programación 1. Tema II. Diseño de programas elementales. Lección 7. Diseño modular y descendente de programas

Tema: Arreglos de Objetos en C++.

Benemérita Universidad Autónoma del Estado de Puebla

Tema 4: Estructuras de Control Estructura y Contenidos

Arquitectura de Sistemas

ELO329: Diseño y Programación Orientados a Objetos 20 de Junio de Certamen Final

Capítulo 6. Introducción a la POO

Tema: Sobrecarga de Operadores.

Tema 5: Diseño modular. Índice. Notas. Programación 2. Curso Notas. Ejemplo. La herramienta make. 1 Diseño modular.

Sistemas Operativos Práctica 4

TEMA 5. CONTROL DE FLUJO DEL PROGRAMA. Sentencia Instrucción Expresión Operadores + Operandos Sintaxis: Sentencia ;

Tema 2. Memoria Dinámica. 2.1 Datos estáticos y dinámicos

1. Ejemplo de clase : La clase Cuenta 2. Uso de la clase Cuenta. 3. Métodos y objetos receptores de mensajes (Importante)

Prof. Dr. Paul Bustamante

INTRODUCCIÓN AL TIPO COMPUESTO CADENA CONTENIDOS

República Bolivariana de Venezuela Aldea Universitaria Liceo Fray Pedro de Agreda. Lenguaje C++ Contadores y Acumuladores

void main(void) { string lname; list <string> lnamelist; cout << "Please enter your list of last names finishing with `.`"<<endl;

Tema: Clases y Objetos en C++.

ALMACENAMIENTO PERSISTENTE DE DATOS

Fundamentos de los Sistemas Operativos

ESCUELA DE INGENIERÍA DE SISTEMAS DEPARTAMENTO DE COMPUTACIÓN PROGRAMACIÓN 2 PRÁCTICA DE LABORATORIO 7 Herencia y Composición en POO

Tema 3: Herencia en C++ Programación Orientada a Objetos Curso 2008/2009 Begoña Moros Valle

Estructuras de repetición

Informática FACULTAD DE FÍSICAS

Plantillas de clases ( Templates )

Examen escrito de Programación 1

Sistemas Operativos Ingeniería de telecomunicaciones Sesión 2: Procesos e hilos (modificado 29/10)

Programación 1 Tema 5. Instrucciones simples y estructuradas

1 (2 5 puntos) Responda con brevedad y precisión a las siguientes preguntas:

Tema: Patrones de Diseño.

Tema: FUNCIONES, PROCEDIMIENTOS Y RECURSIVIDAD.

Examen Junio- Grupo A Lunes 17 de Junio - Programación en C++ Pág. 1

Examen Principios de Programación Febrero 2012

1. Juego del Ahorcado

Introducción al desarrollo de RIA's con Adobe Flex 3.0 Dia 4

RESUMEN DE CONCEPTOS BASICOS DE PROGRAMACION JAVA

Receta general para resolver problemas de sincronización con semáforos

Pontificia Universidad Católica de Chile Escuela de Ingeniería Departamento de Ciencia de la Computación

Objetivo de aprendizaje del tema

Multitarea en Java. Rafa Caballero - UCM

LENGUAJE. Tema 1 - Introducción

Problema - Votación. Entrada. Salida. Primera Olimpiada de Informática 1

Sistemas Operativos Práctica 3

Memoria compartida y semáforos r/w. La página del manual que podría servir para describir estas funciones es la siguiente:

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

Primer Parcial Septiembre 5 de 2009

Guía para la Instalación de MINIX

Contenidos. Gestión dinámica de memoria. Gestión dinámica de memoria. Introducción. 1. Introducción 2. El operador NEW 3. El operador DELETE

Prof. Dr. Paul Bustamante

Compiladores e Intérpretes Proyecto N 1 Sintaxis de MiniJava Segundo Cuatrimestre de 2015

Modulo 1 El lenguaje Java

Tema 6. Reutilización de código. Programación Programación - Tema 6: Reutilización de código

IMPLEMENTACIÓN DE PILAS CON LISTAS EN C++

CDI Exclusión mutua a nivel alto. conceptos

INSTITUTO TECNOLOGICO de la laguna Programación Orientada a Objetos en C++

Prueba de Laboratorio Modelo B01 Semáforos y Memoria Compartida

Hacer campos de solo lectura en ventanas.

Programación 1 Tema 3. Información, datos, operaciones y expresiones

Se guardan en archivos con extencion c y los cabezales con extension h

Curso de Excel Avanzado

Tema 3: Concurrencia de procesos

Mensajes. Interbloqueo

Curso 0 de Informática

Escuela Politécnica Superior de Ingeniería Departamento de Ingeniería Informática

TEMA 5: Control de la Concurrencia en Java (API Estándar)

Programación 1 Tema 5. Instrucciones simples y estructuradas

FACULTAD DE INGENIERÍA

Fundamentos de Programción (I)

Tema 5 Sentencias de control de flujo. Fundamentos de Informática

PROGRAMACIÓN ORIENTADA A OBJETOS (L40629) Sabino Miranda-Jiménez

MANUAL DE REFERENCIA DE C++

MONITORES EN JAVA. Antonio Tomeu Control de la Concurrencia en Java: API Estándar

15. Parámetros o argumentos

Práctica 3 mtp. metodoloxía e tecnoloxía da programación. Presentar detalles básicos sobre la sintaxis del lenguaje de programación Java.

Sistemas Operativos. Curso 2016 Procesos

Programación 1. Tema II. Diseño de programas elementales. Lección 7. Diseño modular y descendente de programas

Índice de contenido. Herramientas necesarias...2 Tipos de Variable...3 Operadores...6 Sentencias...12

Informática I. While & do While

Programación III. 1. Facultad: Ingeniería Escuela: Computación Asignatura:Programación III I. OBJETIVOS II. INTRODUCCIÓN TEÓRICA

Estructuras de Repetición Repita Mientras

Introduccion al Lenguaje C. Omar Andrés Zapata Mesa Grupo de Fenomenología de Interacciones Fundamentales, (Gfif) Universidad de Antioquia

Unidad III El lenguaje de programación C

PROGRAMACIÓN CONCURRENTE. Tema 5 Monitores

Metodología de la Programación II. Recursividad

PRÁCTICA DE LABORATORIO 4 Programación Orientada a Objetos

Benemérita Universidad Autónoma del Estado de Puebla

8.1 Un primer bucle FOR Varias formas de utilizar el bucle FOR Calcular el factorial de un número mediante un bucle FOR...

Introducción a la Programación Orientada a Objetos

Programación Orientada a Objetos en C#.NET CAPÍTULO 8 E V E N T O S. Ing. Bruno López Takeyas, M.C.

Diseño e implementación 15% Instalación y comisionamiento 6% Operación y mantenimiento 15%

Curso de Python Inicial

Introducción a la programación orientada a objetos

Administración Local Soluciones

Tecnólogo Informático- Estructuras de Datos y Algoritmos- 2009

SISTEMAS OPERATIVOS AVANZADOS

Exclusión mutua. Gustavo Romero. 14 de febrero de Arquitectura y Tecnología de Computadores

Tema: INTÉRPRETE ENSAMPOCO/3

SOLUCIONES A ALGUNOS DE LOS EJERCICIOS DE SINCRONIZACION Y COMUNICACION ENTRE PROCESOS

LABORATORIO 2. La biblioteca a nivel de usuario semso (semáforos Sistemas Operativos) brinda las siguientes primitivas:

Arreglos. // Incluir E/S y Librerías Standard #include <stdlib.h> #include <stdio.h>

Transcripción:

Arquitectura y Tecnología de Computadores 14 de febrero de 2014

Objetivos Aprender a utilizar las variables condición y las barreras de la biblioteca Pthreads. Diseñar e implementar una barrera: Barrera que no funciona (sólo probar) Barrera que funciona sólo una vez (sólo probar). Barrera con espera ocupada (sólo probar). Barrera sin espera ocupada. Barrera con variables condición. Barrera de Pthread. Comprobar la funcionalidad y el rendimiento de las diferentes versiones ( make all ). La nota se calculará en función de... La corrección las soluciónes: 0-5. El rendimiento de las soluciones: 0-5 (variables condición).

Makefile http://pccito.ugr.es/~gustavo/aco/practicas/practica8/makefile Makefile SRC = $( wildcard.cc) EXE = $(basename $(SRC)) CXXFLAGS = D GLIBCXX USE NANOSLEEP O3 s t d=c++0x Wal LDFLAGS = lpthread lrt default : $(EXE) all : stat @for d in $(DIR); do $(MAKE) C $$d $@; done Mediante make all podrá comparar fácilmente las soluciones que vaya programando.

Semáforos (POSIX) #include <semaphore.h> Cabecera C/C++. sem t Tipo semáforo. sem init(sem, attr, valor) Inicializa el semáforo sem al calor valor con los atributos attr. sem destroy(sem) Destruye el semáforo sem. sem wait(sem) Si el valor del semáforo sem es positivo lo decrementa y retorna inmediatamente. En otro se bloquea hasta poder hacerlo. sem trywait(sem) Versión no bloqueante de sem wait(sem). En cualquier caso retorna inmediatamente. Es necesario comprobar la salida antes de continuar. sem post(sem) Incrementa el valor del semáforo sem. En caso de cambiar a un valor positivo desbloquea a alguno de los llamadores bloqueados en sem wait(sem).

Pthreads: API de variables condición pthread cond t Tipo variable condición. Inicializable a PTHREAD COND INITIALIZER. pthread cond init(cond,attr) Inicializa la variable condición cond con los atributos attr. pthread cond destroy(cond) Destruye la variable condición cond. pthread cond wait(cond, mutex) Bloque a la hebra llamadora hasta que se señale cond. Esta función debe llamarse mientras mutex está ocupado y ella se encargará de liberarlo automáticamente mientas espera. Despué de la señal la hebra es despertada y el cerrojo es ocupado de nuevo. El programador es responsable de desocupar mutex al finalizar la sección crítica para la que se emplea. pthread cond signal(cond) Función para despertar a otra hebra que espera que se señale sobre la variable condición cond. Debe llamarse después de que mutex esté ocupado y se encarga de liberarlo en pthread cond wait(cond, mutex). pthread cond broadcast(cond) Igual que la función anterior para el caso de que queramos desbloquear a varias hebras que esperan.

Pthreads: API de barreras pthread barrier t Tipo barrera. pthread barrier init(barrier, attr, n) Inicializa la barrera barrier con los atributos attr para que funcione con n hebras. pthread barrier destroy(barrier) Destruye la barrera barrier. pthread barrier wait(barrier) Bloque a la hebra llamadora hasta que se n hebras ejecuten pthread barrier wait(barrier).

Ejemplo: barrera.cc I http://pccito.ugr.es/~gustavo/aco/practicas/practica8/barrera.cc Copie el programa barrera.cc y verifique que la secuencia de ejecución no es correcta. // barrera. cc #include <unistd. h> // alarm #include <pthread. h> #include <iostream> using namespace std ; const int HEBRAS = 10; pthread mutex t display = PTHREAD MUTEX INITIALIZER; // numero de hebras // exclusion mutua display class barrera t public : barrera t (): contador (0) void esperar ()

Ejemplo: barrera.cc II http://pccito.ugr.es/~gustavo/aco/practicas/practica8/barrera.cc private : int contador ; barrera ; void hebra(void ) while ( true ) pthread mutex lock(&display ); cout << pthread self () << : antes << endl ; pthread mutex unlock(&display ); barrera. esperar (); pthread mutex lock(&display ); cout << pthread self () << : despues << endl ; pthread mutex unlock(&display ); return NULL; int main()

Ejemplo: barrera.cc III http://pccito.ugr.es/~gustavo/aco/practicas/practica8/barrera.cc pthread t id [HEBRAS]; alarm (1); for ( int i = 0; i < HEBRAS; ++i ) pthread create(&id [ i ], NULL, hebra, NULL); for ( int i = 0; i < HEBRAS; ++i ) pthread join ( id [ i ], NULL);

Ejemplo: barrera-una.cc I http://pccito.ugr.es/~gustavo/aco/practicas/practica8/barrera-una.cc Copie el programa barrera-una.cc y verifique que la secuencia de ejecución sólo es correcta la primera vez. // barrera una. cc : barrera que funciona solo una vez #include <pthread. h> #include <unistd.h> // alarm #include <iostream> using namespace std ; const int HEBRAS = 10; pthread mutex t display = PTHREAD MUTEX INITIALIZER; // numero de hebras // exclusion mutua display class barrera t public : barrera t (): contador (0)

Ejemplo: barrera-una.cc II http://pccito.ugr.es/~gustavo/aco/practicas/practica8/barrera-una.cc pthread mutex init(&mutex, NULL); barrera t () pthread mutex destroy(&mutex ); void esperar () pthread mutex lock(&mutex ); ++contador ; pthread mutex unlock(&mutex ); while ( contador < HEBRAS); private : int contador ; pthread mutex t mutex; barrera ; void hebra(void ) while ( true ) pthread mutex lock(&display );

Ejemplo: barrera-una.cc III http://pccito.ugr.es/~gustavo/aco/practicas/practica8/barrera-una.cc cout << pthread self () << : antes << endl ; pthread mutex unlock(&display ); barrera. esperar (); pthread mutex lock(&display ); cout << pthread self () << : despues << endl ; pthread mutex unlock(&display ); return NULL; int main() pthread t id [HEBRAS]; alarm (1); for ( int i = 0; i < HEBRAS; ++i ) pthread create(&id [ i ], NULL, hebra, NULL); for ( int i = 0; i < HEBRAS; ++i ) pthread join ( id [ i ], NULL);

Ejemplo: barrera-una.cc IV http://pccito.ugr.es/~gustavo/aco/practicas/practica8/barrera-una.cc

Ejemplo: barrera-ceo.cc I http://pccito.ugr.es/~gustavo/aco/practicas/practica8/barrera-ceo.cc Copie el programa barrera-ceo.cc y verifique que la secuencia de ejecución es correcta. // barrera ceo. cc : barrera con espera ocupada #include <pthread. h> #include <unistd.h> // alarm #include <iostream> using namespace std ; const int HEBRAS = 10; pthread mutex t display = PTHREAD MUTEX INITIALIZER; // numero de hebras // exclusion mutua display class barrera t public : barrera t (): uso(0)

Ejemplo: barrera-ceo.cc II http://pccito.ugr.es/~gustavo/aco/practicas/practica8/barrera-ceo.cc pthread mutex init(&mutex, NULL); for ( int i = 0; i < 2; ++i ) en espera [ i ] = 0; barrera t () pthread mutex destroy(&mutex ); void esperar () int uso local = uso ; pthread mutex lock(&mutex ); ++en espera [ uso local ]; pthread mutex unlock(&mutex ); if ( en espera [ uso local ] == HEBRAS) en espera [ uso local ] = 0; uso = 1 uso ; else while ( en espera [ uso local ] > 0);

Ejemplo: barrera-ceo.cc III http://pccito.ugr.es/~gustavo/aco/practicas/practica8/barrera-ceo.cc private : pthread mutex t mutex; volatile int en espera [2], uso ; barrera ; void hebra(void ) while ( true ) pthread mutex lock(&display ); cout << pthread self () << : antes << endl ; pthread mutex unlock(&display ); barrera. esperar (); pthread mutex lock(&display ); cout << pthread self () << : despues << endl ; pthread mutex unlock(&display ); return NULL; int main()

Ejemplo: barrera-ceo.cc IV http://pccito.ugr.es/~gustavo/aco/practicas/practica8/barrera-ceo.cc pthread t id [HEBRAS]; alarm (1); for ( int i = 0; i < HEBRAS; ++i ) pthread create(&id [ i ], NULL, hebra, NULL); for ( int i = 0; i < HEBRAS; ++i ) pthread join ( id [ i ], NULL);

Implementación de barrera-seo.cc Copie barrera-ceo.cc en barrera-seo.cc. Elimine la espera ocupada de barrera-seo.cc modificando la clase barrera t. Compare barrera-seo.cc con las soluciones anteriores.

Implementación de barrera-vc.cc Copie barrera.cc en barrera-vc.cc. Modifique la clase barrera t de barrera-vc.cc para que funcione empleando variables condición. Compare barrera-vc.cc con las soluciones anteriores.

Implementación de barrier.cc Copie barrera.cc en barrier.cc. Modifique la función hebra() para que funcione empleando las barreras de la biblioteca pthread. Compare barrier.cc con las soluciones anteriores.