Sistemas Operativos 4 Threads Prof. Javier Cañas R. 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. Temario 1. Visión general 2. Modelos Multi-hebras 3. Bibliotecas 4. Aspectos adicionales sobre Threads 5. Threads en Linux 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. 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 ...Visión • La mayor parte del software que corre en un PC moderno es multi hebra. Proceso simple y proceso multihebra 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. ... 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. 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 Arquitectura de un Servidor Multithread Ejecución concurrente en un Core Ejecución paralela en un sistema Multicore 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 Threads del kernel • Están soportados por el kernel • Ejemplos: XP/2000 - Windows - Solaris - Linux UNIX - Tru64 - Mac OS X 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. 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 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 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 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 ... 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. 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 ... Muchos a muchos • Elimina las restricciones anteriores 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 ... Modelo Dos-Niveles 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. 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) Programa C con API Pthread �n i=1 i 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. Threads en Python ... Threads en Python 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” 4 Aspectos adicionales sobre Threads • Veremos: • • Semántica de las llamadas al sistema fork() y exec() • • • • Manejo de señales (Signal) Cancelación de threads: • Asincrónicos o diferidos Pool de threads Datos específicos Activación de Itineradores 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. 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. ... 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. 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 particular 2. Una señal es entregada a un proceso 3. La señal es manejada ... Manejo de señales • Opciones: • • • Entregar la señal al thread al cual aplica la señal. • Asignar un thread específico para recibir todas las señales dirigidas al proceso Entregar la señal a cada thread en el proceso Entregar la señal a algunos thread en el proceso. 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) ... Señales • La llamada signal altera la acción por defecto: #include <signal.h> signal(SIGINT, SIG_IGN) // cause the interrupt to be ignored 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. 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. 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. ... 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. 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. ... LWP Proceso 1 Proceso 2 Proceso 3 La itineración la hace la biblioteca para correr en un LWP PCS LWP SCS K LWP LWP LWP K K K Aqui la itineración la hace el procesador PCS: Process Contention Scope SCS: System Contention Scope .. 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 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. ... Threads en Linux • Cuando se invoca clone(), son pasados un conjunto de flags que determinan como se comparten recursos entre padre e hijos: 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. Sistemas Operativos 4 Threads Prof. Javier Cañas R.