Sistemas Operativos

Anuncio
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 (avi@cs.yale.edu) 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.
Descargar