T5-multithreading. Indice

Documentos relacionados
Concurrencia y paralelismo

Parte I:Teoría. Tema 3:Introducción a los Sistemas operativos. Instalación

Sistemas Operativos Práctica 3

Procesos e Hilos en C

Tema 3 SUBRUTINAS. Estructura de Computadores OCW_2015 Nekane Azkona Estefanía

Sistemas operativos. Hasta ahora hemos visto. Relación programa-sistema operativo Gestión de memoria

Tema 4 El paradigma cliente-servidor

de Gran Canaria Centro de Tecnología Médica Programación Concurrente

Usando el Sistema Operativo

Aplicaciones Concurrentes

UNIVERSIDAD AUTÓNOMA DE BAJA CALIFORNIA FACULTAD DE CIENCIAS PRACTICA DE PROCESOS HERRAMIENTAS

Introducción a los Sistemas Operativos

Threads, SMP y Microkernels. Proceso

Las optimizaciones pueden realizarse de diferentes formas. Las optimizaciones se realizan en base al alcance ofrecido por el compilador.

Construyendo Programas más Complejos

Threads en Linux. Definición de thread. Thread implementado en Linux. Creando un thread en Linux. Ing. Marcelo Doallo Threads en Linux 1/9

Procesos. Bibliografía. Threads y procesos. Definiciones

Test : Conteste exclusivamente en una HOJA DE LECTURA ÓPTICA, no olvidando marcar que su tipo de examen es A.

Práctica 8: Barreras

Sistemas Operativos Práctica 4

APUNTADORES. Un apuntador es un objeto que apunta a otro objeto. Es decir, una variable cuyo valor es la dirección de memoria de otra variable.

Sistemas Distribuidos. Soporte de Sistemas Operativos

Primeros pasos con CUDA. Clase 1

Sistemas Operativos Practica 1: procesos y concurrencia.

Paradigma de paso de mensajes

LA ESTRUCTURA DE DATOS PILA EN JAVA. CLASE STACK DEL API JAVA. EJEMPLO Y EJERCICIOS RESUELTOS. (CU00923C)

Sistemas Operativos. Curso 2016 Procesos

Sistemas Operativos. Daniel Rúa Madrid

Diseño arquitectónico 1ª edición (2002)

TEMA 3. CONCEPTOS FUNDAMENTALES DEL NIVEL DEL SISTEMA OPERATIVO. Definición y objetivos de un S.O

Manipulación de procesos

Desde los programas más simples escritos en un lenguaje de programación suelen realizar tres tareas en forma secuencial.

Tema 13: Apuntadores en C

Carlos Montenegro. Programación Orientada a Objetos Proyecto Curricular de Ingeniería de Sistemas

Elementos de un programa en C

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

Conceptos generales de sistemas distribuidos

Funciones básicas del depurador

SOLUCIONES. SISTEMAS OPERATIVOS Examen de la convocatoria extraordinaria de diciembre 2 de diciembre de 2010

Qué es un programa informático?

TEMA 2 Introducción a C# ANÁLISIS Y DESARROLLO DE APLICACIONES INFORMÁTICAS Curso 2010/2011

Clasificación n de los Sistemas Operativos. Clasificación de los SO Estructuras de los SO Modos de procesamiento

Informática Electrónica Manejadores de Dispositivos (Device Drivers)

Tema 6. Gestión dinámica de memoria

Gestión de Entrada-salida

Unidad 8. Bases de Datos en el Modelo Cliente Servidor

Arquitectura (Procesador familia 80 x 86 )

Tema 7.- Fundamentos de la Programación Orientada a Objetos

Sistemas Operativos I. Tema 3. Procesos. Equipo de Sistemas Operativos DISCA / DSIC UPV

Projecte/Treball Final de Carrera

Sistema electrónico digital (binario) que procesa datos siguiendo unas instrucciones almacenadas en su memoria

Introducción a Java LSUB. 30 de enero de 2013 GSYC

Herramientas Informáticas I Software: Sistemas Operativos

2.2 Nombres, Ligado y Ámbito

Universidad de Managua

Mensajes. Interbloqueo

Capítulo 3: Procesos. n Concepto de Proceso. n Despacho (calendarización) de Procesos. n Operaciones en Procesos. n Procesos en cooperación

Taller de Sistemas Operativos. Módulos del kernel

4. DIAGRAMAS DE INTERACCIÓN INTRODUCCIÓN DIAGRAMAS DE SECUENCIA Objetos Mensajes

Universidad Simón Bolívar Departamento de Computación y Tecnología de la Información Curso de Redes I CI-4815 Trimestre Septiembre Diciembre 2013

Aspectos Básicos de Networking

APUNTES SOBRE PROCESOS Y DEADLOCK CONCEPTO DE PROCESO 1

Sistemas Operativos Tema 5. Procesos José Miguel Santos Alexis Quesada Francisco Santana

Principios de Computadoras II

Sistemas Operativos. Introducción. Tema 6

$0 Representa al parámetro cero o nombre del programa $1 Representa al parámetro uno $2 Representa al parámetro dos

Hacer ejercicios del libro (Cap. 9 Seguridad): 4,5,6,7,8,9,10,12,13

UNIVERSIDAD DEL CARIBE UNICARIBE. Escuela de Informática. Programa de Asignatura

Diseño de sistemas concurrentes

Contenido. 1. El proceso 2. Los modelos 3. Los diagramas 4. Ejemplo

Comunicación y Sincronización con Monitores Resumen del Tema

Unidad 2: Gestión de Procesos

Tema V Generación de Código

Sistemas Operativos. Pedro Cabalar TEMA III. PROCESOS. Depto. de Computación Universidade da Coruña

Programación Concurrente

Sistemas Operativos Ricardo Sanz

Guía práctica de estudio 05: Diagramas de flujo

Sistemas Operativos. Clase 2: Administración de procesos.

Programación de Sistemas Depuradores (Debugger) MIS. Lizbeth Hdz. Glz.

Tostadores y POSIX. 1. Introducción

Estructuras de Datos Declaraciones Tipos de Datos

- Bajo que condiciones el algoritmo de planifiación de procesos FIFO (FCFS) resultaría en el tiempo de respuesta promedio más pequeño?

Tema 6 Organización y gestión de la memoria

Tecnología de software para sistemas de tiempo real

Sistemas operativos. Tema 10: Sistemas de ficheros

Unidad Didáctica 2. Elementos básicos del lenguaje Java Tipos, declaraciones, expresiones y asignaciones

ORGANISMO COORDINADOR DEL SISTEMA ELÉCTRICO NACIONAL INTERCONECTADO DE LA REPÚBLICA DOMINICANA

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

(1) Unidad 1. Sistemas Digitales Basados en Microprocesador SISTEMAS BASADOS EN MICROPROCESADORES. Grado en Ingeniería Informática EPS - UAM

Tema: Clases y Objetos en C#. Parte II.

Ingeniería del Software I

Programación de Sistemas de Tiempo Real

Programación estructurada (Introducción a lenguaje C)

Conceptos a tratar. Fundamentos de la Programación Orientada a Objetos Ampliación sobre clases y objetos

LABORATORIO ARQUITECTURAS SOFTWARE DE VARIOS NIVELES EN JAVA (I)

Práctica 3. Paso de parámetros entre subrutinas. 3. Consideraciones sobre el paso de parámetros

Fundamentos de Computación para Científicos

Implementación de monitores POSIX

Sistemas Operativos: Programación de Sistemas. Curso Oscar Déniz Suárez Alexis Quesada Arencibia Francisco J.

FUNDAMENTOS DE INFORMÁTICA. Principios Básicos de Sistemas Operativos. Definición de Sistema Operativo

Transcripción:

T5-multithreading 1.1 Indice Proceso vs. Flujos Librerías de flujos Comunicación mediante memoria compartida Condición de carrera Sección Crítica Acceso en exclusión mutua Problemas Abrazos mortales 1.2 1

Procesos vs. Flujos Hasta ahora Una única secuencia de ejecución: Sólo 1 Program Counter y una pila Concurrencia entre procesos, pero dentro de un proceso la ejecución era secuencial (una única secuencia de instrucciones) No es posible ejecutar concurrentemente diferentes funciones dentro del mismo proceso Aunque puedan haber partes del código independientes entre si 1.3 Ejemplo: aplicación cliente-servidor Cliente 1 Cliente 2 Cliente N Monoproceso: sólo un cliente cada vez DATOS GLOBALES Servidor While() Esperar_peticion(); Preparar_respuesta(); Enviar_respuesta(); Se desaprovecha las ventajas de la concurrencia y del paralelismo Multiproceso: un proceso para cada cliente simultáneo que se quiera atender Ejecución concurrente y/o paralela Pero Se desaprovechan recursos Replicación innecesaria de estructuras de datos que almacenan los mismos valores, replicación del espacio lógico de memoria, mecanismos para intercambiar información, 1.4 2

CASO : aplicación cliente-servidor Cliente 1 Cliente 2 Cliente N DATOS GLOBALES Servidor While() DATOS GLOBALES Servidor While() INICIO_proceso Esperar_peticion(); Preparar_respuesta(); Enviar_respuesta(); FIN_proceso DATOS GLOBALES DATOS GLOBALESServidor Servidor While() While() DATOS GLOBALES Servidor While() INICIO_proceso INICIO_proceso INICIO_proceso Esperar_peticion(); Esperar_peticion(); INICIO_proceso Esperar_peticion(); Preparar_respuesta(); Preparar_respuesta(); Preparar_respuesta(); Enviar_respuesta(); Enviar_respuesta(); Enviar_respuesta(); FIN_proceso FIN_proceso FIN_proceso Esperar_peticion(); Preparar_respuesta(); Enviar_respuesta(); FIN_proceso 1.5 CASO : aplicación servidor Alternativa: procesos multiflujo Permitir diferentes secuencias de ejecución simultáneas asociadas al mismo proceso Qué necesitamos para describir una secuencia de ejecución? Pila Program counter Valores de los registros El resto de características del proceso puede ser única (resto del espacio lógico, información sobre los dispositivos, gestión signals, etc) 1.6 3

Procesos vs. Flujos Los recursos se siguen asignando en su mayoría a los procesos: Espacio de direcciones Dispositivos Pero el SO planifica a nivel de Flujo (cada flujo necesita 1 CPU) Los flujos de un proceso comparten todos los recursos asignados al proceso y todas las características Y cada flujo tiene asociado: Siguiente instrucción a ejecutar (valor del PC) Zona de memoria para la pila Estado de los registros Un identificador Proceso tradicional: un sólo flujo de ejecución 1.7 CASO : aplicación cliente-servidor Cliente 1 Cliente 2 Cliente N DATOS GLOBALES Servidor While() INICIO_FLUJO Esperar_peticion(); Preparar_respuesta(); Enviar_respuesta(); FIN_FLUJO INICIO_FLUJO INICIO_FLUJO INICIO_FLUJO INICIO_FLUJO Esperar_peticion(); Esperar_peticion(); Esperar_peticion(); Esperar_peticion(); Preparar_respuesta(); Preparar_respuesta(); Preparar_respuesta(); Preparar_respuesta(); Enviar_respuesta(); Enviar_respuesta(); Enviar_respuesta(); Enviar_respuesta(); FIN_FLUJO FIN_FLUJO FIN_FLUJO FIN_FLUJO 1.8 4

Internamente: Procesos vs. Flujos 1 proceso con N flujos 1 PCB N secuencias del código del proceso que se pueden ejecutar de forma concurrente En el PCB hay espacio para guardar los contextos de los N flujos Descripción de memoria 1 región de código 1 región de datos 1 región de heap + N pilas (1 por flujo) 1.9 Procesos vs. Flujos 1.10 5

Internamente: Procesos vs. Flujos Compartición de memoria Entre procesos Por defecto la memoria es privada para un proceso y nadie la puede acceder (hay llamadas a sistema que permiten pedir zonas de memoria compartida entre procesos) Entre flujos Todos los threads pueden acceder a todo el espacio lógico de la tarea a la que pertenecen Cosas a tener en cuenta en la programación con threads Cada thread tiene su pila propia donde el compilador reserva espacio para sus variables locales, parámetros, y control de su ejecución Todas las pilas también son visibles por todos los flujos 1.11 Utilización de procesos multiflujos Explotar paralelismo y concurrencia Mejorar la modularidad de las aplicaciones Aplicaciones intensivas en E/S Flujos dedicados sólo a acceder a dispositivos Aplicaciones servidores 1.12 6

Ventajas de usar flujos Ventajas de usar varios flujos en lugar de varios procesos Coste en tiempo de gestión: creación, destrucción y cambio de contexto Aprovechamiento de recursos Simplicidad del mecanismo de comunicación: memoria compartida 1.13 Gestión a nivel de usuario: Librerías de flujos Los kernels ofrecen threads, pero su interfaz no es compatible (en general) como en el caso de los procesos, por eso se definió una interfaz implementada a nivel librería usuario. POSIX threads. POSIX threads (Portable Operating System Interface, definido por IEEE) Interfaz de gestión de flujos a nivel de usuario Creación y destrucción Sincronización Configuración de la planificación El API de POSIX es muy potente, dependiendo del kernel la librería implementa toda la funcionalidad o solo parte de ella 1.14 7

Servicios de gestión de flujos Creación Proceso fork() Flujos pthread_create(out Pth_id,in NULL, in function_name, in Pparam) Identificación Procesos: getpid() Flujos : pthread_self() Finalización Procesos: exit(exit_code) Flujos:pthread_exit(in Pthexit_code) Sincronización fin de flujo Procesos: waitpid(pid,ending_status, FLAGS) Flujos:pthread_join(in thread_id, out PPexit_code) Consultad las páginas de man para ver los tipos de datos exactos 1.15 Creación de flujos pthread_create Crea un nuevo flujo que ejecuta la rutina start_routine pasándole como parámetro arg #include <pthread.h> int pthread_create(pthread_t *th, pthread_attr_t *attr, void *(*start_routine)(void *), void *arg); th: contendrá el identificador del thread attr: características del thread (si NULL se le asignan las características por defecto) start_routine: @ de la rutina que ejecutará el nuevo flujo. Esa rutina puede recibir un sólo argumenteo de tipo void * (nombre de la función) arg: parámetro de la rutina Devuelve un código de error o 0 si ok 1.16 8

Identificación del flujo pthread_self Obtiene el identificador del flujo que la ejecuta #include <pthread.h> int pthread_self(void); Devuelve el identificador del thread 1.17 Destrucción de flujos pthread_exit La ejecuta el flujo que acaba la ejecución Se pasa como parámetro el valor de retorno del thread #include <pthread.h> int pthread_exit(void *status); status: valor de retorno del thread Devuelve un código de error o 0 si ok 1.18 9

Sincronización con el fin de un flujo pthread_join Bloquea al flujo que la ejecuta hasta que el flujo indicado acabe y recoge el valor que ha pasado al pthread_exit Provoca la liberación de la estructura de datos asociada al flujo #include <pthread.h> int pthread_join(pthread_t th, void **status); th: identificador del thread al que se espera status: contendrá el parámetro que el flujo th le pasó al pthread_exit. Si NULL se ignora el parámetro del pthread_exit. Devuelve código de error o 0 si ok 1.19 Comunicación mediante memoria compartida Los flujos de un proceso pueden intercambiar información a través de la memoria que comparten Accediendo más de uno a las mismas variables Problema que puede aparecer: condición de carrera (race condition) Cuando el resultado de la ejecución depende del orden el que se alternen las instrucciones de los flujos (o procesos) 1.20 10

Ejemplo: race condition int primero = 1 /* variable compartida */ /* flujo 1 */ If (primero) primero -- ; tarea_1(); else tarea_2(); /* flujo 2 */ If (primero) primero -- ; tarea_1(); else tarea_2(); TAREA1 TAREA2 FLUJO 1 FLUJO 2 FLUJO 2 FLUJO 1 FLUJO 1 Y FLUJO 2 RESULTADO INCORRECTO -- La idea del programador era utilizar este booleano para que se ejecutara primero la tarea1 y luego la 2 (pero cada una solo 1 vez) Lo que no tuvo en cuenta es que estas operaciones no son atómicas!!! 1.21 Que tenemos en ensamblador??? haz_tarea: pushl %ebp movl %esp, %ebp subl $8, %esp movl primero, %eax testl %eax, %eax je.l2 movl primero, %eax subl $1, %eax movl %eax, primero call tarea1 jmp.l5.l2: call tarea2.l5: leave ret Esto es el if no es 1 instrucción Esto es la resta no es 1 instrucción Esto es el else Que pasa si hay un cambio de contexto después del movl del if al thread 2??? 1.22 11

Qué pasaría?eax valdrá 1 al volver!! FLUJO 1 FLUJO 2 haz_tarea: pushl %ebp movl %esp, %ebp subl $8, %esp movl primero, %eax testl %eax, %eax je.l2 movl primero, %eax subl $1, %eax movl %eax, primero call tarea1 jmp.l5.l2: call tarea2.l5: leave ret Cambio! Cambio! haz_tarea: pushl %ebp movl %esp, %ebp subl $8, %esp movl primero, %eax testl %eax, %eax je.l2 movl primero, %eax subl $1, %eax movl %eax, primero call tarea1 jmp.l5.l2: call tarea2.l5: leave ret 1.23 Región crítica Región crítica Líneas de código que contienen condiciones de carrera que pueden provocar resultados erróneos Solución Líneas de código que acceden a variables compartidas cuyo valor cambia durante la ejecución Garantizar el acceso en exclusión mutua a estas regiones de código Evitar cambios de contexto? 1.24 12

Exclusión mútua Acceso en exclusión mutua: Se garantiza que el acceso a la región crítica es secuencial Mientras un flujo está ejecutando código de esa región ningún otro flujo lo hará (aunque haya cambios de contexto) El programador debe: Identificar regiones críticas de su código Marcar inicio y fin de la región usando las herramientas del sistema El sistema operativo ofrece llamadas a sistema para marcar inicio y fin de región crítica: Inicio: si ningún otro flujo ha pedido acceso a la región crítica se deja que continúe accediendo,sino se hace que el flujo espere hasta que se libere el acceso a la región crítica Fin: se libera acceso a la región crítica y si algún flujo estaba esperando el permiso para acceder se le permite acceder 1.25 Interfaz pthreads Exc. mutua A considerar: Cada región crítica se identifica con una variable (global) de tipo pthread_mutex_t, por lo tanto, necesitamos 1 variable de este tipo por región. Antes de utilizarla, hay que inicializarla, por lo tanto, antes de crear los threads es lo ideal Función pthread_mutex_init pthread_mutex_lock pthread_mutex_unlock Descripción Inicializa una variable de tipo pthread_mutex_t Bloquea el acceso a una región crítica Libera el acceso a una región crítica 1.26 13

Ejemplo: Mutex int primero = 1 /* variables compartida */ pthread_mutex_t rc1; // Nueva, también compartida pthread_mutex_init(& rc1,null); // INICIALIZAMOS LA VARIABLE, SOLO 1 VEZ pthread_mutex_lock(& rc1); // BLOQUEO if (primero) primero --; pthread_mutex_unlock (& rc1); //DESBLOQUEO tarea_1(); else pthread_mutex_unlock(& rc1); //DESBLOQUEO tarea_2(); 1.27 Exclusión mútua: consideraciones Cosas que el programador debe tener en cuenta Las regiones críticas deben ser lo más pequeñas posibles para maximizar la concurrencia El acceso en exclusión mutua viene determinado por el identificador (variable) que protege el punto de entrada No hace falta que tengan las mismas líneas de código Si varias variables compartidas independientes puede ser conveniente protegerlas mediante variables diferentes 1.28 14