Sistemas Operativos 25/04/2005
Tema 4: Programación Multihebra 1
Departamento de Lenguajes y Ciencias de la Computación Universidad de Málaga
E.T.I. Informática Gestión
Sistemas OperativosSistemas Operativos
Curso 2004/2005Curso 2004/2005
Tema 2:Introducción a la programación
concurrente
Profesor: Francisco Rus Mansilla
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga 2
SO -
Tema
2:In
trod
ucción
a la
prog
ramac
ión
conc
urre
nte
ÍÍndice de contenidos (I)ndice de contenidos (I)• Introducción a la programación concurrente
– Programación concurrente– Arquitecturas hardware– Estilos de programación– Programación concurrente en sistemas operativos
• Procesos y hebras– Por qué procesos multihebra– Ventajas que aportan las hebras– Sistemas operativos multihebra– Tipos de hebras– Implementación de hebras– Bibliotecas de hebras
• Programación con Procesos– Implementación– Funciones básicas– Otras funciones
Sistemas Operativos 25/04/2005
Tema 4: Programación Multihebra 2
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga 3
SO -
Tema
2:In
trod
ucción
a la
prog
ramac
ión
conc
urre
nte
ÍÍndice de contenidos (II)ndice de contenidos (II)
• Programación con Pthreads– Funciones– Ciclo de vida de una hebra– Atributos
• Principios de programación concurrente– Conceptos– Exclusión mutua– Sincronización mediante condiciones– Semáforos
• Problemas clásicos de programación concurrente• Fuentes de información
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga 4
SO -
Tema
2:In
trod
ucción
a la
prog
ramac
ión
conc
urre
nte
IntroducciIntroduccióónn
• Programación concurrente• Arquitecturas hardware• Estilos de programación• Programación concurrente en sistemas operativos
Sistemas Operativos 25/04/2005
Tema 4: Programación Multihebra 3
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga 5
SO -
Tema
2:In
trod
ucción
a la
prog
ramac
ión
conc
urre
nte
ProgramaciProgramacióón concurrenten concurrente
• Un programa concurrente es– Aquél que contiene uno o más procesos que trabajan de forma
conjunta para realizar una determinada tarea
• Dentro del programa concurrente– Cada proceso es un programa secuencial
• Diferencia entre un programa secuencial y uno concurrente– Un programa secuencial tiene un único flujo de ejecución– Un programa concurrente tiene múltiples flujos de control
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga 6
SO -
Tema
2:In
trod
ucción
a la
prog
ramac
ión
conc
urre
nte
ProgramaciProgramacióón concurrenten concurrente
• Los procesos de un programa concurrente interactúan entre sí de dos formas:– Comunicación– Sincronización
• La comunicación se lleva a cabo de dos formas
– Compartiendo memoria– Enviando información por medio de mensajes
• Hay dos tipos básicos de sincronización– Exclusión mutua– Sincronización mediante condiciones
Sistemas Operativos 25/04/2005
Tema 4: Programación Multihebra 4
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga 7
SO -
Tema
2:In
trod
ucción
a la
prog
ramac
ión
conc
urre
nte ComunicaciComunicacióón mediante memoria n mediante memoria
compartidacompartida• En este esquema
– Los procesos de un programa concurrente se comunican compartiendo un conjunto de variables que son visibles a todos ellos
– Estas variables son accedidas de la misma forma que cualquier otra variable
• Analogía: – Los asistentes a una clase y el contenido de la pizarra
/* Proceso 1 */
if (!impresoraOcupada)impresoraOcupada = true ;
// imprimirimpresoraOcupada = false ;
/* Proceso 2 */
if (!impresoraOcupada)impresoraOcupada = true ;
// imprimirimpresoraOcupada = false ;
/* Variable compartida */bool impresoraOcupada = false ;
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga 8
SO -
Tema
2:In
trod
ucción
a la
prog
ramac
ión
conc
urre
nte ComunicaciComunicacióón mediante paso de n mediante paso de
mensajesmensajes• En este esquema
– Los procesos de un programa concurrente se comunican enviándose información mediante mensajes
– Es el mecanismo que se emplea cuando los procesos no comparten memoria
• Analogía:– Comunicación entre personas mediante correo electrónico
• Los programas concurrentes basados en paso de mensajes– Son más complejos, habitualmente, que los basados en memoria
compartida
Sistemas Operativos 25/04/2005
Tema 4: Programación Multihebra 5
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga 9
SO -
Tema
2:In
trod
ucción
a la
prog
ramac
ión
conc
urre
nte SincronizaciSincronizacióón mediante exclusin mediante exclusióón n
mutuamutua• En un programa concurrente existen regiones o
secciones críticas– Son trozos de código que sólo los puede ejecutar un único
proceso en un instante dado
• El problema de la exclusión mutua– Es el problema de garantizar que las secciones críticas se
ejecuten de forma mutuamente exclusiva
/* Proceso 1 */
if (!impresoraOcupada)impresoraOcupada = true ;
// imprimirimpresoraOcupada = false ;
/* Proceso 2 */
if (!impresoraOcupada)impresoraOcupada = true ;
// imprimirimpresoraOcupada = false ;
/* Variable compartida */bool impresoraOcupada = false ;
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga 10
SO -
Tema
2:In
trod
ucción
a la
prog
ramac
ión
conc
urre
nte
SincronizaciSincronizacióón mediante condicionesn mediante condiciones
• La sincronización mediante condiciones – Es el problema de retrasar la ejecución de un proceso hasta que
se cumpla una determinada condición
• Habitualmente,– La sincronización mediante condiciones se combina con la
sincronización mediante exclusión mutua
/* Proceso 1 */
wait if (impresoraOcupada)impresoraOcupada = true ;
// imprimirimpresoraOcupada = false ;
/* Proceso 2 */
wait if (impresoraOcupada)impresoraOcupada = true ;
// imprimirimpresoraOcupada = false ;
/* Variable compartida */bool impresoraOcupada = false ;
Sistemas Operativos 25/04/2005
Tema 4: Programación Multihebra 6
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga 11
SO -
Tema
2:In
trod
ucción
a la
prog
ramac
ión
conc
urre
nte
Arquitecturas hardwareArquitecturas hardware
• Tres tipos básicos de arquitecturas– Sistemas monoprocesador– Sistemas multiprocesadores– Sistemas distribuidos
Memoria principal
Cache de nivel 1
Procesador
Arquitectura de un sistema monoprocesador
Cache de nivel 2
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga 12
SO -
Tema
2:In
trod
ucción
a la
prog
ramac
ión
conc
urre
nte
Arquitecturas hardwareArquitecturas hardware
• Los sistemas multiprocesadores– Están compuestos por un conjunto de procesadores que acceden
a los módulos de memoria por medio de una red de interconexión
– Esta red suele ser un bus o un conmutador de barras cruzadas (crossbar)
Procesador
Arquitectura de un sistema multiprocesador
Cache
Procesador
Cache
Memoria Memoria
Red de interconexión
Sistemas Operativos 25/04/2005
Tema 4: Programación Multihebra 7
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga 13
SO -
Tema
2:In
trod
ucción
a la
prog
ramac
ión
conc
urre
nte
Arquitecturas hardwareArquitecturas hardware
• Los sistemas distribuidos– Difieren de los multiprocesadores en que cada procesador tiene
su propia memoria local – Se suelen denominar redes cuando la red de interconexión es
una red de área local (LAN) o de área extensa (WAN)
Procesador
Arquitectura de un sistema distribuido
Cache
Procesador
Cache
Memoria
Red de interconexión
Memoria
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga 14
SO -
Tema
2:In
trod
ucción
a la
prog
ramac
ión
conc
urre
nte
Estilos de programaciEstilos de programacióónn
• Se pueden distinguir tres estilos de programación, que permiten desarrollar tres tipos de aplicaciones diferentes– Programación concurrente– Programación distribuida– Programación paralela
• Estas disciplinas no son excluyentes
Sistemas Operativos 25/04/2005
Tema 4: Programación Multihebra 8
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga 15
SO -
Tema
2:In
trod
ucción
a la
prog
ramac
ión
conc
urre
nte
Estilos de programaciEstilos de programacióónn
• Programación concurrente– Es la disciplina que estudia la programación de procesos
concurrentes – Aunque se suele aplicar al contexto en el que los procesos se
comunican mediante memoria compartida• Ejemplos de aplicaciones:
– Sistemas de ventanas – Sistemas operativos
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga 16
SO -
Tema
2:In
trod
ucción
a la
prog
ramac
ión
conc
urre
nte
Estilos de programaciEstilos de programacióónn
• Programación distribuida– Es la rama de la programación concurrente que se centra en el
estudio de la programación sobre sistemas distribuidos– Los procesos se comunican mediante paso de mensajes
• Ejemplos de aplicaciones:– Sistemas de ficheros en red– Servidores Web– Bases de datos para reserva de billetes
• Es habitual que los componentes de un sistema distribuido sean a su vez programas concurrentes
Sistemas Operativos 25/04/2005
Tema 4: Programación Multihebra 9
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga 17
SO -
Tema
2:In
trod
ucción
a la
prog
ramac
ión
conc
urre
nte
Estilos de programaciEstilos de programacióónn
• Programación paralela– A veces se considera un sinónimo de programación concurrente– Se utiliza el término computación paralela cuando se utiliza un
computador paralelo con el fin de• resolver un problema más rápidamente,• resolver un problema mayor en un mismo tiempo, o• resolver un problema de mayor tamaño
• Ejemplos de aplicaciones– Computaciones científicas que modelan y simulan el clima, el
movimiento de las mareas, etc.– Procesamiento de imágenes– Problemas de optimización combinatoria
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga 18
SO -
Tema
2:In
trod
ucción
a la
prog
ramac
ión
conc
urre
nte
ParadigmasParadigmas
• La mayoría de las aplicaciones concurrentes utilizan cinco tipos de soluciones, o paradigmas– Paralelismo iterativo– Paralelismo recursivo– Productores y consumidores– Clientes y servidores– Paralelismo entre iguales (peer parallelism)
Sistemas Operativos 25/04/2005
Tema 4: Programación Multihebra 10
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga 19
SO -
Tema
2:In
trod
ucción
a la
prog
ramac
ión
conc
urre
nte
ParadigmasParadigmas
• Paralelismo iterativo– Aplicación habitual: computación científica paralela (ejemplo:
producto de matrices)
• Paralelismo recursivo– Aplicación habitual: ordenación, optimización combinatoria,
juegos (ejemplo: ajedrez)
• Productores y consumidores– Aplicación habitual: procesos que generan datos que han de usar
otros procesos (ejemplo: tuberías en UNIX)
• Clientes y servidores– Aplicación habitual: sistemas distribuidos (ejemplo:
navegadores y servidores Web)
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga 20
SO -
Tema
2:In
trod
ucción
a la
prog
ramac
ión
conc
urre
nte
ParadigmasParadigmas
• Paralelismo entre iguales– Aplicación habitual: programas distribuidos paralelos (ejemplo:
producto de matrices distribuidos)
Sistemas Operativos 25/04/2005
Tema 4: Programación Multihebra 11
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga 21
SO -
Tema
2:In
trod
ucción
a la
prog
ramac
ión
conc
urre
nte ProgramaciProgramacióón concurrente en sistemas n concurrente en sistemas
operativosoperativos• La programación concurrente tiene su origen en
los sistemas operativos• Surge como solución a un problema:
– Maximizar el uso de la capacidad de procesamiento de los sistemas informáticos
• Evolución
1960
1970
1990
Procesamiento por lotes
Multiprogramación o multitareaReparto de tiempo (time slicing)
Tiempo compartido (time sharing)
MultiprocesamientoProcesamiento distribuido
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga 22
SO -
Tema
2:In
trod
ucción
a la
prog
ramac
ión
conc
urre
nte
Procesos y hebrasProcesos y hebras
• Hasta mediados de los años 80, para los sistemas operativos los procesos son entidades que:– Presentan una actividad dentro del sistema operativo (son las
entidades activas)– Su flujo de ejecución es secuencial– Su ejecución la planifica el sistema operativo– Se ejecutan en un espacio de direcciones– Solicitan y usan los recursos del sistema operativo
Proceso tradicional:Un flujo de ejecución secuencial
Recursos
Flujo de ejecución
Sistemas Operativos 25/04/2005
Tema 4: Programación Multihebra 12
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga 23
SO -
Tema
2:In
trod
ucción
a la
prog
ramac
ión
conc
urre
nte
Por quPor quéé procesos procesos multihebramultihebra
• Inconvenientes de este modelo de proceso– Son entidades costosas de crear y manipular– Compartir recursos entre procesos es complejo y costoso
• Solución adoptada:– Generalizar el concepto de proceso, de forma que a cada
proceso se le pueda asociar más de una actividad de procesamiento
Proceso actual:Varios flujos de ejecución concurrentes
Recursos
Flujos de ejecución
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga 24
SO -
Tema
2:In
trod
ucción
a la
prog
ramac
ión
conc
urre
nte
Por quPor quéé procesos procesos multihebramultihebra
• Separación de conceptos– Un proceso es un entorno de ejecución sobre el que se ejecutan
una o varias hebras (threads)– Una hebra es una entidad que presenta una actividad
• A un proceso se asocia– Espacio de direcciones– Variables globales– Ficheros abiertos
• A una hebra se asocia– Registro contador de programa– Pila– Estado (listo, ejecución, bloqueado)
Sistemas Operativos 25/04/2005
Tema 4: Programación Multihebra 13
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga 25
SO -
Tema
2:In
trod
ucción
a la
prog
ramac
ión
conc
urre
nte
Por quPor quéé procesos procesos multihebramultihebra
• A este tipo de procesos se le denomina multihebra(multithreaded process)
• En un proceso multihebra– Todas las hebras comparten todos los recursos del proceso– Las hebras de un proceso se comunican mediante memoria
compartida
• Al contrario de lo que ocurre entre procesos distintos– El sistema operativo no tiene que preocuparse de que las hebras
de un proceso interfieran entre sí
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga 26
SO -
Tema
2:In
trod
ucción
a la
prog
ramac
ión
conc
urre
nte
Ventajas que aportan las hebrasVentajas que aportan las hebras
• Los procesos multihebra aportan las siguientes ventajas:– Solapamiento de operaciones de entrada/salida y computación
dentro de un mismo proceso– Multiprocesamiento– Una hebra consume menos recursos y requiere un coste de
manipulación menor que un proceso– Existen aplicaciones concurrentes cuya estructura se amolda de
forma natural a un esquema multihebra
Sistemas Operativos 25/04/2005
Tema 4: Programación Multihebra 14
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga 27
SO -
Tema
2:In
trod
ucción
a la
prog
ramac
ión
conc
urre
nte
Sistemas operativos Sistemas operativos multihebramultihebra
• La mayoría de los sistemas operativos actuales son multihebra– Solaris – Linux– Windows NT/2000– MacOS X
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga 28
SO -
Tema
2:In
trod
ucción
a la
prog
ramac
ión
conc
urre
nte
Tipos de hebrasTipos de hebras
• Hay dos tipos de hebras– Las hebras que se ejecutan en el espacio de usuario– Las hebras que se ejecutan en el espacio del núcleo
Núcleo
Espacio de
usuario
Hebras de usuario
Hebras de núcleo
Procesos
Espacio del
núcleo
Sistemas Operativos 25/04/2005
Tema 4: Programación Multihebra 15
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga 29
SO -
Tema
2:In
trod
ucción
a la
prog
ramac
ión
conc
urre
nte
ImplementaciImplementacióón de hebrasn de hebras
• Existen varias formas de hacer corresponder las hebras de usuario con las hebras de núcleo– Muchas-a-Una– Una-a-Una– Muchas-a-Muchas
• Cada una estas formas da lugar, respectivamente, a un esquema de implementación diferente– Implementación a nivel de usuario– Implementación a nivel de núcleo– Implementación híbrida
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga 30
SO -
Tema
2:In
trod
ucción
a la
prog
ramac
ión
conc
urre
nte
ImplementaciImplementacióón a nivel de usuarion a nivel de usuario
• Características– Correspondencia Muchas-a-Una– Todas las hebras de usuario de un proceso se vinculan a una
única hebra del núcleo
Núcleo
Espacio de
usuario
Hebras de usuario
Hebras de núcleo
Procesos
Espacio del
núcleo
Sistemas Operativos 25/04/2005
Tema 4: Programación Multihebra 16
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga 31
SO -
Tema
2:In
trod
ucción
a la
prog
ramac
ión
conc
urre
nte
ImplementaciImplementacióón a nivel de usuarion a nivel de usuario
• Ventajas– Gestión de hebras eficiente– Esquema empleado en sistemas operativos no multihebra
• Inconvenientes– Si una hebra se bloquea, se bloquea todo el proceso– No permite multiprocesamiento
• Ejemplos– La biblioteca de procesos de peso ligero (LWP o light weighted
processes) del sistema operativo SunOS– Los sistemas operativos actuales no admiten este esquema (ver
implementaciones híbridas)
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga 32
SO -
Tema
2:In
trod
ucción
a la
prog
ramac
ión
conc
urre
nte
ImplementaciImplementacióón a nivel de nn a nivel de núúcleocleo
• Características– Correspondencia Una-a-Una– Cada hebra de usuario se vincula a una única hebra del núcleo
Núcleo
Espacio de
usuario
Hebras de usuario
Hebras de núcleo
Procesos
Espacio del
núcleo
Sistemas Operativos 25/04/2005
Tema 4: Programación Multihebra 17
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga 33
SO -
Tema
2:In
trod
ucción
a la
prog
ramac
ión
conc
urre
nte
ImplementaciImplementacióón a nivel de nn a nivel de núúcleocleo
• Ventajas– Permite obtener todos los beneficios de aportan las hebras
• Inconvenientes– Gestión de hebras más costosa que en el caso de la
implementación a nivel de usuario– Número máximo de hebras teóricamente inferior al de una
implementación a nivel de usuario
• Ejemplos de sistemas– Windows NT/2000– Linux
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga 34
SO -
Tema
2:In
trod
ucción
a la
prog
ramac
ión
conc
urre
nte
ImplementaciImplementacióón hn hííbridabrida
• Características– Correspondencia Muchas-a-Muchas– Existe varias formas de vincular las hebras de usuario con las
hebras del núcleo
Núcleo
Espacio de
usuario
Hebras de usuario
Hebras de núcleo
Procesos
Espacio del
núcleo
Sistemas Operativos 25/04/2005
Tema 4: Programación Multihebra 18
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga 35
SO -
Tema
2:In
trod
ucción
a la
prog
ramac
ión
conc
urre
nte
ImplementaciImplementacióón hn hííbridabrida
• Ventajas– Combina las ventajas de la implementación a nivel de usuario
(bajo coste de manipulación) con las de la implementación a nivel de núcleo (no limita las posibilidades que permiten las hebras
• Inconvenientes– Modelo de programación complejo cuando la vinculación entre
hebras de usuario y hebras de núcleo es responsabilidad del programador
– Ejemplo: Solaris• En otros sistemas
– La vinculación es automática– Ejemplo: Tru64 (antiguo Digital UNIX)
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga 36
SO -
Tema
2:In
trod
ucción
a la
prog
ramac
ión
conc
urre
nte
Bibliotecas de hebrasBibliotecas de hebras
• Los lenguajes más usados para programar sobre sistemas operativos (C/C++) no incorporan hebras
• Pero puede hacer uso de las hebras del sistema operativo a través de una biblioteca de funciones
• En la actualidad existen dos bibliotecas de hebras de uso mayoritario– Hebras Win32, usadas en los sistemas operativos de 32 bits de
Microsoft– Hebras POSIX (Pthreads), usadas en sistemas UNIX
Sistemas Operativos 25/04/2005
Tema 4: Programación Multihebra 19
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga 37
SO -
Tema
2:In
trod
ucción
a la
prog
ramac
ión
conc
urre
nte
Bibliotecas de hebrasBibliotecas de hebras
• Comparación entre hebras Win32 y Pthreads– Windows NT/2000 fue diseñado desde el principio para que
fuese multihebra– En UNIX se ha producido una adaptación de procesos
tradicionales a procesos multihebra• Consecuencia
– En Windows NT/2000 las hebras están integradas de forma natural dentro del sistema
– En UNIX existen conflictos cuando se usan características que están pensadas para procesos tradicionales (ejemplos: bloqueo de ficheros, señales)
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga 38
SO -
Tema
2:In
trod
ucción
a la
prog
ramac
ión
conc
urre
nte ProcesosProcesos
• Aspectos de Implementación• Funciones básicas• Otras funciones
Sistemas Operativos 25/04/2005
Tema 4: Programación Multihebra 20
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga 39
SO -
Tema
2:In
trod
ucción
a la
prog
ramac
ión
conc
urre
nte Aspectos de implementaciAspectos de implementacióónn
• La estructura principal para la gestión de procesos es la tabla de procesos– Contiene una entrada por cada proceso
• Cada entrada contiene, entre otra información– El PID y el PPID del proceso– El identificador de usuario real (UID) y efectivo y el
identificador de grupo (GID)– El estado del proceso– Puntero a la tabla de páginas del proceso– Información sobre las señales pendientes de ser enviadas al
proceso, así como máscaras que indican qué señales son aceptadas y cuáles son ignoradas
– Parámetros de planificación
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga 40
SO -
Tema
2:In
trod
ucción
a la
prog
ramac
ión
conc
urre
nte Aspectos de implementaciAspectos de implementacióónn
• Los procesos se crean a partir de programas que contienen código ejecutable
• Estructura del espacio de direcciones de un proceso:
Datos inicializados de lectura/escritura
Datos inicializados de sólo lectura
Datos sin inicializar
Código
Montículo (Heap)
Pila (Stack)
Sistemas Operativos 25/04/2005
Tema 4: Programación Multihebra 21
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga 41
SO -
Tema
2:In
trod
ucción
a la
prog
ramac
ión
conc
urre
nte Funciones bFunciones báásicassicas
• Operaciones básicas que se pueden realizar con procesos
Espera que un determinado hijo proceso acabewaitpid
Termina un procesoexit
Ejecuta un nuevo programaexec
Espera que un proceso hijo acabewait
Crea un nuevo procesofork
DescripciónLlamada
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga 42
SO -
Tema
2:In
trod
ucción
a la
prog
ramac
ión
conc
urre
nte Crear un procesoCrear un proceso
• Si la llamada fork() tiene éxito– Se crea un nuevo proceso, denominado proceso hijo– El proceso hijo es una copia del proceso padre
pid_t fork (void)
Devuelve: - El valor –1 en caso de error- El valor 0 al proceso hijo y PID del proceso hijo al proceso padre, en caso de éxito
Sistemas Operativos 25/04/2005
Tema 4: Programación Multihebra 22
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga 43
SO -
Tema
2:In
trod
ucción
a la
prog
ramac
ión
conc
urre
nte Crear un procesoCrear un proceso
• Ejemplo
#include <unistd.h>
main() {pid_t IdentificadorDeProceso ;
printf(“Soy el proceso %d \n”, getpid()) ;printf(“Voy a crear un proceso hijo\”) ;IdentificadorDeProceso = fork() ;
if (IdentificadorDeProceso == -1) printf(“Se ha producido un error al crear el hijo\n”) ;
else if (IdentificadorDeProceso == 0) printf(“Soy el nuevo proceso hijo (%d)\n”, getpid()) ;
else {printf(“Sigo siendo el proceso padre. He creado ”) ;printf(“el proceso %d\n”, IdentificadorDeProceso) ;
} /* else */} /* main */
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga 44
SO -
Tema
2:In
trod
ucción
a la
prog
ramac
ión
conc
urre
nte Crear un procesoCrear un proceso
• A considerar
– El proceso hijo hereda del padre una copia de su código, datos, pila, descriptores de ficheros abiertos y tabla de señales
– El padre y el hijo se diferencian en sus PID y PPID
Sistemas Operativos 25/04/2005
Tema 4: Programación Multihebra 23
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga 45
SO -
Tema
2:In
trod
ucción
a la
prog
ramac
ión
conc
urre
nte Ejecutar un nuevo programaEjecutar un nuevo programa
int execl, execlp (const char * Ruta const char * Argumento0...const char * ArgumentoN(char *)0
)
int execv, execvp (const char * Rutachar *const ArrayDeArgumentos[]
)
Devuelven:- el valor –1 en caso de error
• La familia de funciones exec()– Reemplazan el código, datos y pila del proceso que las invoca
por el programa ejecutable indicado por Ruta
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga 46
SO -
Tema
2:In
trod
ucción
a la
prog
ramac
ión
conc
urre
nte Ejecutar un nuevo programaEjecutar un nuevo programa
• A considerar– execl() es idéntica a execlp(), y execv() es idéntica a execvp(), salvo que execl() y execv() requieren el camino absoluto o relativo para encontrar el fichero ejecutable,mientras que execlp() y execvp() usan la variable de entorno $PATH para encontrar ruta
– Si el fichero ejecutable no se encuentra, se devuelve -1. En caso contrario, el proceso que realiza la llamada reemplaza su código, datos y pila por los del fichero ejecutable y comienza a ejecutar su nuevo código
– Si la ejecución se realiza correctamente, no se devuelve ningún valor
Sistemas Operativos 25/04/2005
Tema 4: Programación Multihebra 24
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga 47
SO -
Tema
2:In
trod
ucción
a la
prog
ramac
ión
conc
urre
nte Ejecutar un nuevo programaEjecutar un nuevo programa
• A considerar– execl() y execlp() invocan el fichero ejecutable usando
como argumentos las cadenas de caracteres apuntadas por argumento0, argumento1, ..., argn. argumento0 debe ser el nombre del fichero ejecutable, y la lista de argumentos debe de terminar con la cadena vacía NULL ((char *)0)
– execv() y execvp() invocan el fichero ejecutable usando como argumentos un array de cadenas de caracteres apuntado por arrayDeArgumentos. argv[n+1] es NULL y arrayDeArgumentos[0] contiene el nombre del fichero ejecutable
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga 48
SO -
Tema
2:In
trod
ucción
a la
prog
ramac
ión
conc
urre
nte Esperar a que un hijo termineEsperar a que un hijo termine
• Esta llamada– Provoca la suspensión del proceso hasta que uno de sus hijos
termine
• En la dirección indicada por el argumento– Se devuelve el estado de terminación del proceso hijo, que lo
envía mediante la llamada exit()
– Si la dirección es NULL, no se devuelve nada
pid_t wait (int * EstadoDelProcesoHijo
)
Devuelve:- el valor (pid_t) –1 en caso de error- el PID del proceso hijo, en caso de éxito
Sistemas Operativos 25/04/2005
Tema 4: Programación Multihebra 25
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga 49
SO -
Tema
2:In
trod
ucción
a la
prog
ramac
ión
conc
urre
nte Esperar a que un determinado hijo Esperar a que un determinado hijo
terminetermine
• Esta llamada– Permite que un proceso espere a que acabe un proceso hijo cuyo
PID se indica en el primer argumento– El estado del proceso hijo se devuelve en el segundo argumento
pid_t waitpid (pid_t * IdentificadorDelProcesoHijo int * EstadoDelProcesoHijoint Opciones
)
Devuelve:- el valor (pid_t) –1 en caso de error- el PID del proceso hijo, en caso de éxito
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga 50
SO -
Tema
2:In
trod
ucción
a la
prog
ramac
ión
conc
urre
nte Esperar a que un determinado hijo Esperar a que un determinado hijo
terminetermine
• A considerar– Si el valor del PID del proceso hijo es –1 y el tercer argumento
es 0, waitpid() se comporta igual que wait()
• El tercer argumento puede tomar varios valores– Por ejemplo, el valor WNOHANG hace que la llamada waitpid()
no se bloquee si el hijo no ha terminado todavía
Sistemas Operativos 25/04/2005
Tema 4: Programación Multihebra 26
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga 51
SO -
Tema
2:In
trod
ucción
a la
prog
ramac
ión
conc
urre
nte Terminar un procesoTerminar un proceso
• La invocación de esta llamada– Provoca el cierre de todos los descriptores de ficheros, devuelve
al sistema los recursos ocupados por el código, datos y pila, y termina el proceso
• El estado del proceso– Es enviado al proceso padre, que lo podrá obtener mediante la
llamada wait() o waitpid()
– Sólo los 8 bits menos significativos son útiles para el proceso padre
void exit (int EstadoDelProcesoHijo
)
Devuelve:- ningún resultado
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga 52
SO -
Tema
2:In
trod
ucción
a la
prog
ramac
ión
conc
urre
nte Terminar un procesoTerminar un proceso
• A considerar– Si un proceso realiza la llamada exit() permanece en estado
zombie hasta que su padre ejecuta la llamada wait() o waitpid()
– Todos aquellos procesos hijos que sean huérfanos son adoptados por el proceso init (el proceso cuyo PID es 1), que siempre acepta los códigos de terminación de sus proceso hijos
Sistemas Operativos 25/04/2005
Tema 4: Programación Multihebra 27
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga 53
SO -
Tema
2:In
trod
ucción
a la
prog
ramac
ión
conc
urre
nte Otras funciones de gestiOtras funciones de gestióón de procesosn de procesos
• Llamadas para obtener identificadores
El identificador del grupo del procesogetpgrp()
El identificador de la sesión del procesogetsid()
El identificador de usuario efectivogeteuid()
El identificador de grupo efectivogetegid()
El identificador de grupo realgetgid()
El PID del proceso padregetppid()
El identificador de usuario realgetuid()
El PID del procesogetpid()
DevuelveLlamada
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga 54
SO -
Tema
2:In
trod
ucción
a la
prog
ramac
ión
conc
urre
nte Obtener el valor de una variable de Obtener el valor de una variable de
entornoentorno
• A considerar– El valor de las variables de entorno también se puede obtener a
partir del tercer argumento de la función main()
char * getenv (const char * NombreDeVariableDeEntorno
)
Devuelve:- el valor –1 en caso de error- un puntero al valor de la variable de entorno
Sistemas Operativos 25/04/2005
Tema 4: Programación Multihebra 28
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga 55
SO -
Tema
2:In
trod
ucción
a la
prog
ramac
ión
conc
urre
nte ProgramaciProgramacióón con n con PthreadsPthreads
• Funciones• Ciclo de vida de una hebra• Atributos
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga 56
SO -
Tema
2:In
trod
ucción
a la
prog
ramac
ión
conc
urre
nte ProgramaciProgramacióón con n con PthreadsPthreads. Funciones. Funciones
• Las funciones de la biblioteca Pthreads se dividen en dos grupos– Funciones para gestión de hebras– Funciones para sincronización de hebras
• Funciones básicas de gestión de hebras– Creación pthread_create()– Terminación pthread_exit()– Espera de terminación pthread_join()
• Objetos de sincronización– Mutexes– Variables de condición– Semáforos– Cerrojos de lectura/escritura (rwlocks)
Sistemas Operativos 25/04/2005
Tema 4: Programación Multihebra 29
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga 57
SO -
Tema
2:In
trod
ucción
a la
prog
ramac
ión
conc
urre
nte Ciclo de vida de una hebraCiclo de vida de una hebra
• En su forma más básica, la utilización de una hebra requiere los siguientes pasos– Incluir el fichero de cabecera pthread.h
– Declarar un descriptor
– Crear la hebra
– Terminar la ejecución de la hebra
– Esperar que la hebra termine
#include <pthread.h>
pthread_t idHebra ;
pthread_create(&idHebra, NULL, funcion, argumentos) ;
pthread_exit(valor)
pthread_join(idHebra, NULL)
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga 58
SO -
Tema
2:In
trod
ucción
a la
prog
ramac
ión
conc
urre
nte Ciclo de vida de una hebraCiclo de vida de una hebra
• Ejemplo: programa simple.c/*/* Programa simple.c: ejemplo de ciclo de vida de una hebra*/#include <pthread.h>#include <stdio.h>
void * codigoHebra(void *parametros) {printf("Soy la hebra\n") ;
} /* codigoHebra */
int main(int argc, char ** argv) {pthread_t idHebra ;int resultado ;
resultado = pthread_create(&idHebra, NULL, codigoHebra, NULL) ;if (resultado != 0) { /* 0 indica exito */
printf("main: error al crear la hebra\n") ;return -1 ;
} /* if */
printf("Soy la hebra principal\n") ;
pthread_join(idHebra, NULL) ;
printf("Fin de la hebra principal\n") ;
} /* main */
Sistemas Operativos 25/04/2005
Tema 4: Programación Multihebra 30
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga 59
SO -
Tema
2:In
trod
ucción
a la
prog
ramac
ión
conc
urre
nte
Ciclo de vida de una hebraCiclo de vida de una hebra• Ejemplo: programa simple.c• Compilación del programa
% gcc simple.c -o simple –D_REENTRANT –lpthread
• Ejecución
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga 60
SO -
Tema
2:In
trod
ucción
a la
prog
ramac
ión
conc
urre
nte
Atributos de una hebraAtributos de una hebra
• Una hebra POSIX puede tener atributos– Cuando se crea una hebra, por defecto sus atributos tienen
asignados un valor inicial
• Los atributos afectan, entre otros, a:– Tamaño de la pila
pthread_attr_setstacksize()– Dirección de la pila
pthread_attr_setstackaddr()– Ámbito
pthread_attr_setscope()– Planificación
pthread_attr_setschedpolicy()
Sistemas Operativos 25/04/2005
Tema 4: Programación Multihebra 31
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga 61
SO -
Tema
2:In
trod
ucción
a la
prog
ramac
ión
conc
urre
nte
Atributos de una hebraAtributos de una hebra
• Ejemplo de uso de atributos– En Solaris, cuando una hebra se crea, por defecto es una hebra
de usuario. Esto es así porque el atributo que afecta por defecto al ámbito de planificación de una hebra es el proceso
– Para crear una hebra de núcleo, hay que crear la hebra con ámbito de sistema
#include <pthread.h>...pthread_attr_t atributos ; // atributos de la hebrapthread_attr_init(&atributos) ; // inicializacion
// Se establece el atributo de ambitopthread_attr_setscope(&atributos, PTHREAD_SCOPE_SYSTEM) ;
resultado = pthread_create(&idHebra, &atributos, codigoHebra, NULL) ;
...
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga 62
SO -
Tema
2:In
trod
ucción
a la
prog
ramac
ión
conc
urre
nte Principios de programaciPrincipios de programacióón concurrenten concurrente
• Definición: estado de un programa– El estado de un programa concurrente viene dado por el valor
de las variables del programa en un instante concreto de tiempo– Todo programa comienza en un estado inicial– Cada proceso del programa se ejecuta de forma independiente
• Definición: acción atómica– Los procesos ejecutan secuencias de instrucciones– Cada instrucción se compone de secuencias de una o varias
acciones atómicas– Son acciones que, de forma indivisible, examinan o alteran el
estado del programa
Sistemas Operativos 25/04/2005
Tema 4: Programación Multihebra 32
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga 63
SO -
Tema
2:In
trod
ucción
a la
prog
ramac
ión
conc
urre
nte Principios de programaciPrincipios de programacióón concurrenten concurrente
• Definición: intercalación– La ejecución de un programa concurrente da lugar a la
ejecución intercalada (interleaving) de las secuencias de acciones atómicas ejecutadas por cada proceso
• Definición: historia– Una ejecución concreta de un programa concurrente da lugar a
una historia, que es una secuencia de acciones atómicas S0àS1à ... à Sn
– Una ejecución paralela puede modelarse como una historia secuencial, porque el efecto de ejecutar acciones atómicas en paralelo es equivalente a ejecutarlas en algún orden secuencial
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga 64
SO -
Tema
2:In
trod
ucción
a la
prog
ramac
ión
conc
urre
nte Principios de programaciPrincipios de programacióón concurrenten concurrente
• Definición: propiedad– Cada ejecución de un programa concurrente produce una
historia– El número de historias posibles para un programa es muy
elevado– El motivo es que existen muchas formas de intercalar las
acciones atómicas de un programa, aunque se parta siempre del mismo estado inicial
– Una propiedad es un atributo del programa que se cumple en cualquier posible historia del mismo
– Existen dos tipos de propiedades: de seguridad y de viveza
Sistemas Operativos 25/04/2005
Tema 4: Programación Multihebra 33
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga 65
SO -
Tema
2:In
trod
ucción
a la
prog
ramac
ión
conc
urre
nte Principios de programaciPrincipios de programacióón n
concurrenteconcurrente• Definición: propiedad de seguridad
– Una propiedad de seguridad (safety property) es aquella que garantiza que el programa nunca entra en un estado no válido
– Un estado no es válido cuando algunas variables de estado tienen un valor incorrecto
– Ejemplos de propiedades: exclusión mutua, ausencia de interbloqueo (deadlock)
• Definición: propiedad de viveza– Una propiedad de viveza (liveness property) es aquella que
garantiza que el programa entrará eventualmente en un estado válido
– Ejemplo de propiedades: terminación de un programa, entrada en una sección crítica
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga 66
SO -
Tema
2:In
trod
ucción
a la
prog
ramac
ión
conc
urre
nte
El problema de la exclusiEl problema de la exclusióón mutuan mutua
• Características del problema– Existe un conjunto de procesos que repetidamente intentan
ejecutar una sección crítica y después una sección no crítica– La sección crítica ha de ir precedida de un protocolo de entrada
y seguida por un protocolo de salida
/* La estructura de este código es la misma para *//* todos los procesos del programa concurrente */
while (true) {/* protocolo de entrada *//* sección crítica *//* protocolo de salida *//* sección no crítica */
} /* while */
Sistemas Operativos 25/04/2005
Tema 4: Programación Multihebra 34
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga 67
SO -
Tema
2:In
trod
ucción
a la
prog
ramac
ión
conc
urre
nte
El problema de la exclusiEl problema de la exclusióón mutuan mutua• Para tener una solución satisfactoria al problema, los
protocolos de entrada y de salida deben cumplir las siguientes propiedades– Exclusión mutua:
• Sólo un proceso como máximo puede estar a la vez en su sección crítica
– Ausencia de interbloqueo (livelock): • Si dos o más procesos quieren entrar a la vez en sus secciones
críticas, alguno lo conseguirá
– Ausencia de retrasos innecesarios: • En el caso de que únicamente un proceso quiera entrar en la
sección crítica
– Entrada eventual:• Si un proceso intenta entrar en su sección crítica, eventualmente lo
conseguirá
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga 68
SO -
Tema
2:In
trod
ucción
a la
prog
ramac
ión
conc
urre
nte
ExclusiExclusióón mutua con n mutua con PthreadsPthreads
• Para delimitar el acceso a secciones críticas, Pthreads proporciona un objeto de sincronización llamado mutex
/* Ejemplo de sección crítica (SC) usando mutexes de */ /* la biblioteca Pthreads */
#include <pthread.h>bool impresoraOcupada = false ;...pthread_mutex_t mutex ; pthread_mutex_init(&mutex, NULL) ;...
pthread_mutex_lock(&mutex) ; /* entrada en la SC *//* seccion crítica */if (!impresoraOcupada)impresoraOcupada = true ;
pthread_mutex_unlock(&mutex) ; /* salida de la SC */
/* sección no crítica */impresoraOcupada = false ;
Sistemas Operativos 25/04/2005
Tema 4: Programación Multihebra 35
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga 69
SO -
Tema
2:In
trod
ucción
a la
prog
ramac
ión
conc
urre
nte
SincronizaciSincronizacióón mediante condicionesn mediante condiciones
• La sincronización de procesos mediante exclusión mutua permite el acceso a secciones críticas de código– Sin embargo, este mecanismo es insuficiente para resolver otro
problema de sincronización, como es el bloqueo de un proceso a la espera de que se cumpla una determinada condición
• Ejemplo tipo:– El problema de los productores/consumidores, que se
comunican a través de un buffer circular– Un productor no puede insertar elementos si el buffer está lleno– El consumidor no puede extraer elementos si el buffer está
vacío
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga 70
SO -
Tema
2:In
trod
ucción
a la
prog
ramac
ión
conc
urre
nte
SincronizaciSincronizacióón mediante condicionesn mediante condiciones
• Contexto del problema– Un proceso dentro de una sección crítica comprueba si una
condición se cumple– Si se cumple, el proceso continua su ejecución dentro de la
sección crítica– Si no se cumple, el proceso debe esperar hasta que la condición
se cumpla, pero para ello debe abandonar temporalmente la sección crítica
/* Proceso 1 */
wait if (impresoraOcupada)impresoraOcupada = true ;
// imprimirimpresoraOcupada = false ;
/* Proceso 2 */
wait if (impresoraOcupada)impresoraOcupada = true ;
// imprimirimpresoraOcupada = false ;
/* Variable compartida */bool impresoraOcupada = false ;
Sistemas Operativos 25/04/2005
Tema 4: Programación Multihebra 36
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga 71
SO -
Tema
2:In
trod
ucción
a la
prog
ramac
ión
conc
urre
nte
Variables de condiciVariables de condicióón en n en PthreadsPthreads
• El problema de la sincronización mediante condiciones se resuelve en Pthreads mediante el uso de variables de condición
• Una variable de condición es un objeto de sincronización sobre el que se definen dos operaciones básicas– pthread_cond_wait(&cond, &mutex)– pthread_cond_signal(&cond)
• La operación de espera provoca la suspensión de la hebra y la liberación del mutex
• La operación de señalización reanuda la ejecución de la hebra previamente suspendida
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga 72
SO -
Tema
2:In
trod
ucción
a la
prog
ramac
ión
conc
urre
nte
Variables de condiciVariables de condicióón en n en PthreadsPthreads/* Ejemplo de utilización de variables de condición *//* con Pthreads */
#include <pthread.h>bool impresoraOcupada = false ;...pthread_mutex_t mutex ; pthread_mutex_init(&mutex, NULL) ;...pthread_cond_t sePuedeImprimir ;Pthread_cond_init(&sePuedeImprimir) ;...pthread_mutex_lock(&mutex) ; /* entrada en la SC *//* seccion crítica */while (!impresoraOcupada)pthread_cond_wait(&sePuedeImprimir, &mutex) ;
impresoraOcupada = true ;pthread_mutex_unlock(&mutex) ; /* salida de la SC */.../* sección no crítica */...pthread_mutex_lock(&mutex) ; /* entrada en la SC */impresoraOcupada = false ;pthread_cond_signal(&sePuedeImprimir) ;
pthread_mutex_unlock(&mutex) ; /* salida de la SC */
Sistemas Operativos 25/04/2005
Tema 4: Programación Multihebra 37
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga 73
SO -
Tema
2:In
trod
ucción
a la
prog
ramac
ión
conc
urre
nte SemSemááforosforos
• Un semáforo es un objeto con un valor entero, al que se puede asignar un valor inicial no negativo, y al que solo se puede acceder utilizando dos operaciones atómicas:
• Las definiciones de las operaciones son:
wait o P
y
signal o V
wait (s) {s = s-1;if (s<0)
Bloquear }
signal(s) {s = s + 1;if (s <= 0)
Desbloquear}
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga 74
SO -
Tema
2:In
trod
ucción
a la
prog
ramac
ión
conc
urre
nte
SemSemááforosforos
• Exclusión mutua con semáforos
• Ejercicio:
semáforo s =1;....
wait(s);/* sección crítica */
signal(s);
/* sección no crítica */
¿Valor de s?
Comparación entre mutex y semáforo
Sistemas Operativos 25/04/2005
Tema 4: Programación Multihebra 38
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga 75
SO -
Tema
2:In
trod
ucción
a la
prog
ramac
ión
conc
urre
nte Problemas clProblemas cláásicos de programacisicos de programacióón n
concurrenteconcurrente
• Existen varios problemas que, ya sea por ser instructivos o por su utilidad en la práctica, se han convertido en problemas clásicos de programación concurrente
• Entre estos problemas están:– Exclusión mutua– El problema de los filósofos– Lectores/Escritores– Productores/consumidores
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga 76
SO -
Tema
2:In
trod
ucción
a la
prog
ramac
ión
conc
urre
nte FilFilóósofos comensalessofos comensales
§ piensan y comen alternativamente
§ Para comer necesitan 2 tenedores
§ Sólo se puede coger 1 tenedor a la vez
Los filósofos:
Sistemas Operativos 25/04/2005
Tema 4: Programación Multihebra 39
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga 77
SO -
Tema
2:In
trod
ucción
a la
prog
ramac
ión
conc
urre
nte FilFilóósofos comensalessofos comensales
• Primera aproximación con semáforos
semáforo tenedor[5] = {1}
.....
void filosofo (int i) {
pensar();wait(tenedor[i]);wait(tenedor[(i+1) mod 5] );comer();signal(tenedor[(i+1) mod 5] );signal(tenedor[i]);
}
INTERBLOQUEO
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga 78
SO -
Tema
2:In
trod
ucción
a la
prog
ramac
ión
conc
urre
nte FilFilóósofos comensalessofos comensales
¿Solución?
Sistemas Operativos 25/04/2005
Tema 4: Programación Multihebra 40
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga 79
SO -
Tema
2:In
trod
ucción
a la
prog
ramac
ión
conc
urre
nte
Productores/consumidoresProductores/consumidores
• Definiciones– Sea un buffer circular con una capacidad de MAX_BUF
elementos– Un productor es un proceso o hebra que quiere insertar
elementos en el buffer– Un consumidor es un proceso o hebra que quiere extraer
elementos del buffer
• Enunciado: dado un conjunto de productores y de consumidores que se comunican a través de un buffer común, se deben cumplir dos condiciones– Un productor se ha de bloquear si intenta insertar un elemento
cuando el buffer está lleno– Un consumidor se ha de bloquear si intenta extraer un elemento
cuando el buffer está vacío
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga 80
SO -
Tema
2:In
trod
ucción
a la
prog
ramac
ión
conc
urre
nte Productores/consumidoresProductores/consumidores
while (cierto) {producir();wait(huecos);wait(s);añadir();signal(s);signal(datos);
}
while(cierto) {wait(datos);wait(s);coger();signal(s);signal(huecos);consumir();
}
Productor/consumidor con semáforos
semáforo s = 1;semáforo datos = 0;semáforo huecos = MAX_BUF
PRODUCTOR CONSUMIDOR
Sistemas Operativos 25/04/2005
Tema 4: Programación Multihebra 41
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga 81
SO -
Tema
2:In
trod
ucción
a la
prog
ramac
ión
conc
urre
nte
ImplementaciImplementacióón con n con PthreadsPthreads
• Requisitos– Un buffer será una instancia de un tipo abstracto de datos mt_buffer_t. Los elementos del buffer serán números enteros
– Las operaciones del buffer serán seguras desde el punto de vista de su utilización en programas multihebras (thread safe)
– La especificación las operaciones es la siguiente:
.../* funciones para crear y destruir un buffer */int mt_buffer_init(mt_buffer_t *) ;int mt_buffer_destroy(mt_buffer_t *) ;
/* funciones para acceder al buffer */int mt_buffer_insertar(mt_buffer_t *, int) ;int mt_buffer_extraer (mt_buffer_t *, int *) ;int mt_buffer_vacio(mt_buffer_t *, bool *) ;int mt_buffer_lleno(mt_buffer_t *, bool *) ;
...
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga 82
SO -
Tema
2:In
trod
ucción
a la
prog
ramac
ión
conc
urre
nte
Productores/consumidoresProductores/consumidores• Implementación del tipo mt_buffer_t
...
typedef struct {int buffer[MAX_BUF] ;int elemento ; /* Primer elemento del buffer */int hueco ; /* Primer hueco del buffer */int num_elementos ; /* Numero de elementos en el buffer */
pthread_mutex_t mutex ;pthread_cond_t esta_vacio ;pthread_cond_t esta_lleno ;
} mt_buffer_t ;
...
Sistemas Operativos 25/04/2005
Tema 4: Programación Multihebra 42
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga 83
SO -
Tema
2:In
trod
ucción
a la
prog
ramac
ión
conc
urre
nte
Productores/consumidoresProductores/consumidores• Implementación de mt_buffer_extraer
int mt_buffer_extraer (mt_buffer_t * buf, int * elemento) {int error ; /* Variable usada en el control de errores */
/** Paso 1: se bloquea el mutex */
error = pthread_mutex_lock(&(buf->mutex)) ;if (error != 0) {/* Error al bloquear el mutex */return error ;
} /* if */
/** Paso 2: se espera hasta que haya algun elemento en el buffer*/
while (buf->num_elementos == 0) {error = pthread_cond_wait(&(buf->esta_vacio), &(buf->mutex)) ;if (error != 0) {/* Error al espera en la variable de condicion esta_vacio */return error ;
} /* if */ } /* while */
/* -----------> sigue */
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga 84
SO -
Tema
2:In
trod
ucción
a la
prog
ramac
ión
conc
urre
nte
Productores/consumidoresProductores/consumidores
/* <-------------- Viene de atrás *//* * Paso 3: se extrae el elemento*/
*elemento = buf->buffer[buf->elemento] ;buf->elemento = (buf->elemento + 1) % MAX_BUF ;buf->num_elementos -- ;
/** Paso 4: se comprueba si el buffer estaba lleno, y se despierta * a un hipotetico productor que estuviese bloqueado en* esta_lleno*/
if (buf->num_elementos == (MAX_BUF - 1)) pthread_cond_signal(&(buf->esta_lleno)) ;
/** Paso 5: se libera el mutex*/
error = pthread_mutex_unlock(&(buf->mutex)) ;if (error != 0) {/* Error al desbloquear el mutex */return error ;
} /* if */ return 0 ;
} /* mt_buffer_extraer */
Sistemas Operativos 25/04/2005
Tema 4: Programación Multihebra 43
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga 85
SO -
Tema
2:In
trod
ucción
a la
prog
ramac
ión
conc
urre
nte
Productores/consumidoresProductores/consumidores
• Ficheros:– mt_buffer.h contiene la especificación completa del tipo– mt_buffer.c contiene la implementación– prodcons.c contiene un ejemplo de uso de un buffer
mt_buffer_t por parte de un productor y de un consumidor– linux.mak y solaris.mak son ficheros para compilar los
programas en Linux y Solaris, respectivamente
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga 86
SO -
Tema
2:In
trod
ucción
a la
prog
ramac
ión
conc
urre
nte
Fuentes de informaciFuentes de informacióónn
• Bibliografía• Direcciones en la Web
Sistemas Operativos 25/04/2005
Tema 4: Programación Multihebra 44
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga 87
SO -
Tema
2:In
trod
ucción
a la
prog
ramac
ión
conc
urre
nte
BibliografBibliografííaa
• UNIX Programación Práctica. Guía para la concurrencia, la comunicación y los Multihilos– Kay A. Robbins, Steven Robbins– Prentice Hall, 1997
• Foundations of Multithreaded, Parallel and Distributed Programming– Gregory R. Andrews– Addison-Wesley, 2000
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga 88
SO -
Tema
2:In
trod
ucción
a la
prog
ramac
ión
conc
urre
nte
Direcciones en la WebDirecciones en la Web
• Referencia sobre Pthreads, tomada de la Web del OpenGroup– http://www.unix-systems.org/version2/whatsnew/threadsref.html
• Grupo de noticias de programación multihebra– news://comp.programming.threads
• Páginas que contienen enlaces relacionados conPthreads– http://www.cs.iastate.edu/~mayuresh/pthreads.shtml– http://www.humanfactor.com/pthreads/pthreadlinks.html
Top Related