53
Sistemas Operativos 4 Threads Prof. Javier Cañas R.

4 Threads · 2013-03-10 · • Provee mayor concurrencia y paralelismo en multiprocesadores. • Crear un threads de usuario significa crear un thread del kernel (overhead). Por

  • Upload
    others

  • View
    5

  • Download
    0

Embed Size (px)

Citation preview

Page 1: 4 Threads · 2013-03-10 · • Provee mayor concurrencia y paralelismo en multiprocesadores. • Crear un threads de usuario significa crear un thread del kernel (overhead). Por

Sistemas Operativos4 Threads

Prof. Javier Cañas R.

Page 2: 4 Threads · 2013-03-10 · • Provee mayor concurrencia y paralelismo en multiprocesadores. • Crear un threads de usuario significa crear un thread del kernel (overhead). Por

Nota

• El texto guía es: Operating System Concepts, Eight Edition, Avi Silberschatz, Peter Baer Galvin, Greg Gagne

• Estas PPT están basadas en las PPT originales que el autor del texto guía mantiene en: http://www.os-book.com/

Copyright Note

The slides below are copyright Silberschatz, Galvin and Gagne, 2008. The slides are authorized for personal use, and for use in conjunction with a course for which Operating System Concepts is the prescribed text. Instructors are free to modify the slides to their taste, as long as the modified slides acknowledge the source and the fact that they have been modified. Paper copies of the slides may be sold strictly at the price of reproduction, to students of courses where the book is the prescribed text. Any use that differs from the above, and any for profit sale of the slides (in any form) requires the consent of the copyright owners; contact Avi Silberschatz ([email protected]) to obtain the copyright owners consent.

Page 3: 4 Threads · 2013-03-10 · • Provee mayor concurrencia y paralelismo en multiprocesadores. • Crear un threads de usuario significa crear un thread del kernel (overhead). Por

Temario

1. Visión general

2. Modelos Multi-hebras

3. Bibliotecas

4. Aspectos adicionales sobre Threads

5. Threads en Linux

Page 4: 4 Threads · 2013-03-10 · • Provee mayor concurrencia y paralelismo en multiprocesadores. • Crear un threads de usuario significa crear un thread del kernel (overhead). Por

Objetivos

• Introducir el concepto de Hebra (Thread) como unidad fundamental de utilización de CPU.

• Discutir diversas API para Threads.

• Examinar los problemas relacionados con programación multi-hebra.

Page 5: 4 Threads · 2013-03-10 · • Provee mayor concurrencia y paralelismo en multiprocesadores. • Crear un threads de usuario significa crear un thread del kernel (overhead). Por

1 Visión general

• Un Thread es una unidad básica de utilización de CPU.

• Un proceso tradicional (proceso pesado) tiene un thread simple de control.

• Si un proceso tiene múltiples threads de control, puede realizar más de una tarea al mismo tiempo

Page 6: 4 Threads · 2013-03-10 · • Provee mayor concurrencia y paralelismo en multiprocesadores. • Crear un threads de usuario significa crear un thread del kernel (overhead). Por

... Visión

• La mayor parte del software que corre en un PC moderno es multi hebra.

Page 7: 4 Threads · 2013-03-10 · • Provee mayor concurrencia y paralelismo en multiprocesadores. • Crear un threads de usuario significa crear un thread del kernel (overhead). Por

Proceso simple y proceso multihebra

Page 8: 4 Threads · 2013-03-10 · • Provee mayor concurrencia y paralelismo en multiprocesadores. • Crear un threads de usuario significa crear un thread del kernel (overhead). Por

Beneficios

• Sensibilidad: Multithreading puede permitir que un programa continue corriendo aún si parte de él está bloqueado o está realizando una operación lenta.

• Compartición de recursos: Threads comparten la memoria y los recursos que el proceso tiene por defecto.

Page 9: 4 Threads · 2013-03-10 · • Provee mayor concurrencia y paralelismo en multiprocesadores. • Crear un threads de usuario significa crear un thread del kernel (overhead). Por

... Beneficios

• Economía: Es caro asignar memoria y recursos en la creación de procesos.

• Escalabilidad: Los beneficios de multithreading pueden incrementarse en gran medida en una arquitectura de multiprocesadores.

Page 10: 4 Threads · 2013-03-10 · • Provee mayor concurrencia y paralelismo en multiprocesadores. • Crear un threads de usuario significa crear un thread del kernel (overhead). Por

Programación Multicore

• Los sistemas Multicore ejercen presión sobre los programadores. Los desafíos incluyen:

- Dividir actividades

- Balance

- Partición de datos

- Dependencia de datos

- Testing y debugging

Page 11: 4 Threads · 2013-03-10 · • Provee mayor concurrencia y paralelismo en multiprocesadores. • Crear un threads de usuario significa crear un thread del kernel (overhead). Por

Arquitectura de un Servidor Multithread

Page 12: 4 Threads · 2013-03-10 · • Provee mayor concurrencia y paralelismo en multiprocesadores. • Crear un threads de usuario significa crear un thread del kernel (overhead). Por

Ejecución concurrente en un Core

Page 13: 4 Threads · 2013-03-10 · • Provee mayor concurrencia y paralelismo en multiprocesadores. • Crear un threads de usuario significa crear un thread del kernel (overhead). Por

Ejecución paralela en un sistema Multicore

Page 14: 4 Threads · 2013-03-10 · • Provee mayor concurrencia y paralelismo en multiprocesadores. • Crear un threads de usuario significa crear un thread del kernel (overhead). Por

Threads de Usuarios

• Estos threads están soportados por una biblioteca de threads disponibles para usuarios.

• Las tres principales bibliotecas son:

- POSIX Pthreads

- Win32 threads

- Java threads

Page 15: 4 Threads · 2013-03-10 · • Provee mayor concurrencia y paralelismo en multiprocesadores. • Crear un threads de usuario significa crear un thread del kernel (overhead). Por

Threads del kernel

• Están soportados por el kernel

• Ejemplos:

- Windows XP/2000- Solaris- Linux- Tru64 UNIX- Mac OS X

Page 16: 4 Threads · 2013-03-10 · • Provee mayor concurrencia y paralelismo en multiprocesadores. • Crear un threads de usuario significa crear un thread del kernel (overhead). Por

2 Modelos Multi-hebras

• El soporte para threads puede ser proporcionado ya sea a nivel de usuario por threads de usuarios, o por el kernel, para threads de kernel.

• Todos los SO actuales, soportan threads de kernel.

Page 17: 4 Threads · 2013-03-10 · • Provee mayor concurrencia y paralelismo en multiprocesadores. • Crear un threads de usuario significa crear un thread del kernel (overhead). Por

Relación entre threads Usuario y kernel

• Los threads usuarios deben estar relacionados con los threads soportados por el kernel. Esta relación se puede dar de varias maneras:

‣ Muchos a uno

‣ Uno a uno

‣ Muchos a muchos

- Modelo de dos niveles

Page 18: 4 Threads · 2013-03-10 · • Provee mayor concurrencia y paralelismo en multiprocesadores. • Crear un threads de usuario significa crear un thread del kernel (overhead). Por

Relación Muchos a uno

• Muchos threads de nivel de usuario son mapeados a un thread simple.

• Sistema Operativos que utilizan esta estrategia son:

- Solaris green Threads

- GNU Portable Threads

Page 19: 4 Threads · 2013-03-10 · • Provee mayor concurrencia y paralelismo en multiprocesadores. • Crear un threads de usuario significa crear un thread del kernel (overhead). Por

Modelo Muchos a uno• El proceso completo se puede bloquear si un threads realiza un llamado bloqueante.• Sólo un thread tiene acceso al kernel al mismo tiempo.• En un multiprocesador no hay paralelismo real

Page 20: 4 Threads · 2013-03-10 · • Provee mayor concurrencia y paralelismo en multiprocesadores. • Crear un threads de usuario significa crear un thread del kernel (overhead). Por

Modelo Uno a Uno

• Cada threads de usuario es mapeado a un thread del kernel.

• Ejemplos:

- Windows NT/XP/2000

- Linux

- Solaris 9 y posteriores

Page 21: 4 Threads · 2013-03-10 · • Provee mayor concurrencia y paralelismo en multiprocesadores. • Crear un threads de usuario significa crear un thread del kernel (overhead). Por

... Modelo uno a uno

• Provee mayor concurrencia y paralelismo en multiprocesadores.

• Crear un threads de usuario significa crear un thread del kernel (overhead). Por esto algunas implementaciones restringen el número de threads.

Page 22: 4 Threads · 2013-03-10 · • Provee mayor concurrencia y paralelismo en multiprocesadores. • Crear un threads de usuario significa crear un thread del kernel (overhead). Por

Modelo Muchos a muchos

• Permite que muchos threads usuarios se mapeen en muchos thread del kernel.

• Permite al SO crear un número suficiente de threads de kernel.

• Ejemplos:

• Solaris en versiones anteriores a la 9

• Windows NT/2000 con el paquete ThreadFiber

Page 23: 4 Threads · 2013-03-10 · • Provee mayor concurrencia y paralelismo en multiprocesadores. • Crear un threads de usuario significa crear un thread del kernel (overhead). Por

... Muchos a muchos

• Elimina las restricciones anteriores

Page 24: 4 Threads · 2013-03-10 · • Provee mayor concurrencia y paralelismo en multiprocesadores. • Crear un threads de usuario significa crear un thread del kernel (overhead). Por

Modelo Dos-Niveles

• Similar a M:M, excepto que permite que un thread de usuario sea limitado por un thread del kernel.

• Ejemplos de SO:

• IRX

• HP-UX

• Tru64 UNIX

• Solaris 8 y anteriores

Page 25: 4 Threads · 2013-03-10 · • Provee mayor concurrencia y paralelismo en multiprocesadores. • Crear un threads de usuario significa crear un thread del kernel (overhead). Por

... Modelo Dos-Niveles

Page 26: 4 Threads · 2013-03-10 · • Provee mayor concurrencia y paralelismo en multiprocesadores. • Crear un threads de usuario significa crear un thread del kernel (overhead). Por

3 Bibliotecas de Threads

• Las Bibliotecas de Threads le dan al programador API para crear y gestionar threads.

• Hay dos formas en las cuales están implementadas:

• La biblioteca está completamente en espacio usuario

• La biblioteca de Nivel-kernel es soportada por el OS.

Page 27: 4 Threads · 2013-03-10 · • Provee mayor concurrencia y paralelismo en multiprocesadores. • Crear un threads de usuario significa crear un thread del kernel (overhead). Por

Pthreads

• Pthreads es un estándar POSIX (API) para threads (IEEE 1003.1c).

• Puede ser proporcionada ya sea como nivel de usuario o nivel kernel.

• Se utiliza en SO UNIX (Solaris, Linux, Mac OS X)

Page 28: 4 Threads · 2013-03-10 · • Provee mayor concurrencia y paralelismo en multiprocesadores. • Crear un threads de usuario significa crear un thread del kernel (overhead). Por

Programa Ccon API Pthread

�ni=1 i

Page 29: 4 Threads · 2013-03-10 · • Provee mayor concurrencia y paralelismo en multiprocesadores. • Crear un threads de usuario significa crear un thread del kernel (overhead). Por

Ejemplo 2

• El siguiente ejemplo muestra el cálculo de números primos desde 2 hasta un número definido en el programa.

• El algoritmo no es muy eficiente, pero muestra la forma de activar threads.

Page 30: 4 Threads · 2013-03-10 · • Provee mayor concurrencia y paralelismo en multiprocesadores. • Crear un threads de usuario significa crear un thread del kernel (overhead). Por
Page 31: 4 Threads · 2013-03-10 · • Provee mayor concurrencia y paralelismo en multiprocesadores. • Crear un threads de usuario significa crear un thread del kernel (overhead). Por
Page 32: 4 Threads · 2013-03-10 · • Provee mayor concurrencia y paralelismo en multiprocesadores. • Crear un threads de usuario significa crear un thread del kernel (overhead). Por

Threads en Python

Page 33: 4 Threads · 2013-03-10 · • Provee mayor concurrencia y paralelismo en multiprocesadores. • Crear un threads de usuario significa crear un thread del kernel (overhead). Por

... Threads en Python

Page 34: 4 Threads · 2013-03-10 · • Provee mayor concurrencia y paralelismo en multiprocesadores. • Crear un threads de usuario significa crear un thread del kernel (overhead). Por

Java Threads

• Los Threads Java son manejados por la JVM.

• Normalmente se implementan usando los medelos de threads proporcionados por el SO base.

• Es posible crear threads de Java se la siguientes maneras:

• Extendiendo la clase Threads

• Implementando la interfaz “Runnable”

Page 35: 4 Threads · 2013-03-10 · • Provee mayor concurrencia y paralelismo en multiprocesadores. • Crear un threads de usuario significa crear un thread del kernel (overhead). Por

4 Aspectos adicionales sobre Threads

• Veremos:

• Semántica de las llamadas al sistema fork() y exec()

• Cancelación de threads:

• Asincrónicos o diferidos

• Manejo de señales (Signal)

• Pool de threads

• Datos específicos

• Activación de Itineradores

Page 36: 4 Threads · 2013-03-10 · • Provee mayor concurrencia y paralelismo en multiprocesadores. • Crear un threads de usuario significa crear un thread del kernel (overhead). Por

Semántica de fork() y exec()

• El fork(), ¿duplica sólo el thread que lo invoca o todos los threads?

• La semántica del fork() y exec() cambian en programas multihebras

• Algunos sistemas UNIX disponen de dos versiones para fork(), una que duplica todos los threads y otra que duplica sólo el thread que invocó el fork().

• Si un thread invoca exec(), el programa especificado en el parámetro sustituirá todos los threads.

Page 37: 4 Threads · 2013-03-10 · • Provee mayor concurrencia y paralelismo en multiprocesadores. • Crear un threads de usuario significa crear un thread del kernel (overhead). Por

Concelación de Threads

• La acción es cancelar un thread antes que termine.

• Ejemplo: un usuario oprime el botón para detener la carga de una página web. A menudo una página web es cargada usando muchos threads. Cada imagen se carga con un thread separado. En este caso se deben cancelar todos los threads.

Page 38: 4 Threads · 2013-03-10 · • Provee mayor concurrencia y paralelismo en multiprocesadores. • Crear un threads de usuario significa crear un thread del kernel (overhead). Por

... Cancelación

• El thread a cancelar se denomina target thread. La cancelación puede ser:

• Asincrónica: termina el target thread inmediatamente.

• Cancelación diferida: permite que el target thread periódicamente verifique si debe ser cancelado.

Page 39: 4 Threads · 2013-03-10 · • Provee mayor concurrencia y paralelismo en multiprocesadores. • Crear un threads de usuario significa crear un thread del kernel (overhead). Por

Manejo de Señales

• Los sistemas UNIX utilizan señales para notificar a procesos que ha ocurrido un evento particular.

• Para manejar las señales recibidas se utiliza un “signal handler”. La secuencia es:

1. Una señal es generada por un evento particular2. Una señal es entregada a un proceso3. La señal es manejada

Page 40: 4 Threads · 2013-03-10 · • Provee mayor concurrencia y paralelismo en multiprocesadores. • Crear un threads de usuario significa crear un thread del kernel (overhead). Por

... Manejo de señales

• Opciones:

• Entregar la señal al thread al cual aplica la señal.

• Entregar la señal a cada thread en el proceso

• Entregar la señal a algunos thread en el proceso.

• Asignar un thread específico para recibir todas las señales dirigidas al proceso

Page 41: 4 Threads · 2013-03-10 · • Provee mayor concurrencia y paralelismo en multiprocesadores. • Crear un threads de usuario significa crear un thread del kernel (overhead). Por

Señales

• La función estándar de UNIX para entregar una señal a un proceso es:

kill(pid_t pid, int signal)

• kill especifica el pid del proceso al cual una señal será despachada.

• POSIX Phtreads proporciona la llamada:

pthread_kill(pthread_t tid, int signal)

Page 42: 4 Threads · 2013-03-10 · • Provee mayor concurrencia y paralelismo en multiprocesadores. • Crear un threads de usuario significa crear un thread del kernel (overhead). Por

... Señales

• La llamada signal altera la acción por defecto:

#include <signal.h>

signal(SIGINT, SIG_IGN) // cause the interrupt to be ignored

Page 43: 4 Threads · 2013-03-10 · • Provee mayor concurrencia y paralelismo en multiprocesadores. • Crear un threads de usuario significa crear un thread del kernel (overhead). Por

Pool de Threads

• La idea es crear un pool de threads donde esperan que les asignen trabajo.

• Se logra con esto:

• Un poco de mayor rapidez al utilizar un thread creado en vez de crear uno nuevo.

• Permite que el número de threads de una aplicación esté limitado al tamaño del pool.

Page 44: 4 Threads · 2013-03-10 · • Provee mayor concurrencia y paralelismo en multiprocesadores. • Crear un threads de usuario significa crear un thread del kernel (overhead). Por

Threads con datos específicos

• Threads que pertenecen a un proceso comparten los datos del proceso.

• En algunas circunstancias, cada thread podría necesitar su propia copia de datos.

• Se permite que cada thread tenga su propia copia de datos.

• Es útil cuando uno no tiene control en el proceso de creación de threads, por ejemplo al utilizar un pool.

Page 45: 4 Threads · 2013-03-10 · • Provee mayor concurrencia y paralelismo en multiprocesadores. • Crear un threads de usuario significa crear un thread del kernel (overhead). Por

Itineración de Threads

• Los modelos M:M y Dos-niveles requieren comunicación para mantener un apropiado número de kernel threads asignados a la aplicación.

• Para resolver este problema, muchos sistemas ponen una estructura de datos intermedia entre el user y kernel thread.

Page 46: 4 Threads · 2013-03-10 · • Provee mayor concurrencia y paralelismo en multiprocesadores. • Crear un threads de usuario significa crear un thread del kernel (overhead). Por

... Itineración de Threads

• Esta estructura se conoce como lightweight process (LWP). Cada LWP está asignada a un kernel thread.

• La activación del Itinerador proporciona upcall, un mecanismo de comunicación desde el kernel a la biblioteca de thread.

• Esta comunicación permite a la aplicación mantener un adecuado número de kernel thread.

Page 47: 4 Threads · 2013-03-10 · • Provee mayor concurrencia y paralelismo en multiprocesadores. • Crear un threads de usuario significa crear un thread del kernel (overhead). Por

LWP

• Los kernel threads se pueden ver como LWP.

• Un LWP es como una CPU virtual en la cual el Scheduler de la biblioteca de threads, itinera los user-level threads.

• De esta forma se implementan los distintos modelos de mapeo entre user y kernel.

Page 48: 4 Threads · 2013-03-10 · • Provee mayor concurrencia y paralelismo en multiprocesadores. • Crear un threads de usuario significa crear un thread del kernel (overhead). Por

... LWP

LWP

K

Proceso 1

LWP

K

Proceso 2

LWP

K

Proceso 3

LWP

K

La itineración la hace la biblioteca para correr en un LWP

Aqui la itineración la hace el procesador

PCS

SCS

PCS: Process Contention ScopeSCS: System Contention Scope

Page 49: 4 Threads · 2013-03-10 · • Provee mayor concurrencia y paralelismo en multiprocesadores. • Crear un threads de usuario significa crear un thread del kernel (overhead). Por

.. LWP

• El Scope se fija al momento de creación de los threads

• En el modelo M:M, la biblioteca tiene dos tipos de threads:

• bound threads: se mapea a un LWP

• unbound threads: pueden ser mapeados al mismo LWP

Page 50: 4 Threads · 2013-03-10 · • Provee mayor concurrencia y paralelismo en multiprocesadores. • Crear un threads de usuario significa crear un thread del kernel (overhead). Por

5 Threads en Linux

• Además del fork(), Linux crea threads mediante la llamada clone(). La llamada clone() le permite al hijo compartir el espacio de direcciones del padre.

• Linux utiliza el término task en vez de process o thread al referirse al control de flujo de un programa.

Page 51: 4 Threads · 2013-03-10 · • Provee mayor concurrencia y paralelismo en multiprocesadores. • Crear un threads de usuario significa crear un thread del kernel (overhead). Por

... Threads en Linux

• Cuando se invoca clone(), son pasados un conjunto de flags que determinan como se comparten recursos entre padre e hijos:

Page 52: 4 Threads · 2013-03-10 · • Provee mayor concurrencia y paralelismo en multiprocesadores. • Crear un threads de usuario significa crear un thread del kernel (overhead). Por

IEEE Spectrum June 2009: Sun's Rock CPU Could Be a Gem for Oracle

Upcoming processor first to use "transactional memory," a boon to programming multicore processors

Rock will boast 16 processor cores—more than any other server CPU on the market—and, even more important, it will also be the first chip to offer a performance-enhancing feature called transactional memory. Transactional memory, or TM, allows programs simultaneously running multiple threads the ability to read from and write to memory registers more easily and without accidentally overwriting the data that other threads require.

Page 53: 4 Threads · 2013-03-10 · • Provee mayor concurrencia y paralelismo en multiprocesadores. • Crear un threads de usuario significa crear un thread del kernel (overhead). Por

Sistemas Operativos4 Threads

Prof. Javier Cañas R.