Sistemas Operativos
72.11
Threads
Threads
● Tradicionalmente un proceso tiene su espacio de direcciones y un único hilo (thread) de
ejecución.
● Existen casos en los que es muy útil tener múltiples hilos en un mismo espacio de direcciones
corriendo de forma pseudo paralela como si fueran procesos separados, salvo por el espacio de
direcciones
Tanenbaum, Modern Operating Systems 4e, 2015 Prentice-Hall
Threads
Justificación
¿Para qué queremos un proceso dentro de un proceso?
● Muchas actividades simultáneas, algunas bloqueantes
○ Desglosar la solución en hilos secuenciales
■ Aumenta el uso del CPU
■ Simplifica la programación
■ Aprovecha arquitecturas con múltiples CPUs
● La misma noción de modelo de procesos
○ Abstraer detalles y pensar en procesos secuenciales
○ Con el agregado de que comparten un espacio de direcciones
● Son más “baratos”
○ Creación y destrucción
○ Hasta 10-100 veces más rápido que un proceso
Threads
Ejemplo: Procesador de texto
● Corrector ortográfico
● Auto guardado
● Procesar input
● Visualizar contenido
¿Cómo sería con procesos separados?
Threads
Ejemplo: Web server
● Atender conexiones
● Enviar páginas en cache
● Buscar páginas en disco (bloqueante)
Threads
Ejemplo: Web server
Threads
Ejemplo: Web server
¿Cómo sería el servidor sin threads?
¿Y si no tengo threads y lo quiero más eficiente?
● Syscalls no bloqueantes
● Almacenar el estado de cada pedido para retomarlo cuando llegue la página del disco
● Se pierde la noción de computación secuencial
● Estamos simulando threads “the hard way”
● Las syscalls bloqueantes facilitan la programación
● El paralelismo aumenta el rendimiento
Threads
Modelo de threads
● El modelo de procesos está basado en 2 conceptos independientes
○ Agrupación de recursos
○ Ejecución
Threads
Modelo de threads
● Proceso vs thread
○ Un thread está contenido en un proceso, pero…
■ El proceso agrupa recursos
■ El thread es una entidad programada (scheduled) para ejecución en el CPU
○ Los threads permiten múltiples ejecuciones en el mismo conjunto de recursos
● Tener múltiples threads en un proceso es análogo a tener múltiples procesos en una PC
○ En un caso se comparte el espacio de direcciones, files, señales, etc
○ En el otro se comparte la memoria, dispositivos de entrada y salida, etc
● Thread -> light weight process
Threads
Modelo de threads
Threads
Modelo de threads
Threads
Modelo de threads
● Analogía misma historia narrada desde diferentes perspectivas
Threads
Modelo de threads
● Los threads comparten el espacio de direcciones, por tanto, un thread podría modificar
información mientras otro la está leyendo. Esto tiene un nombre, ¿cuál es?
● No existe protección provista por el kernel ante esta situación ¿por qué?
Threads
POSIX: API
Threads
POSIX: Ejemplo
Threads
Implementación en espacio de usuario
● El kernel desconoce de su existencia
● Desde la perspectiva del kernel son procesos con un único thread
● Provee soporte para threads en caso de que el kernel no los provea
● Se implementan como una librería
Threads
Implementación en espacio de usuario
● Cada proceso necesita su tabla de threads privada -> análoga a la tabla de procesos del kernel
● Si un thread se bloquea localmente (esperando por otro thread del mismo proceso) se realiza el
switch en espacio de usuario
○ Es un orden (o más) de magnitud más rápido que el switch usual con interrupciones y la
intervención del kernel.
○ No es necesario flushear la cache
● Cada proceso puede tener su propio algoritmo de scheduling de threads
Todo muy lindo, pero ¿qué pasa con syscalls bloqueantes?
Threads
Implementación en espacio de usuario: desventajas
Syscall bloqueante
● ¿Que se bloquee todo el proceso y listo?
○ Cambiar las syscalls a no boqueantes -> modificar el kernel
○ Select(2) -> polling
Page faults
● Un thread causa un page fault -> el kernel bloquea el proceso entero hasta que llega la página
Inanición
● Un thread puede correr indefinidamente hasta que voluntariamente libere el CPU
○ Se puede solicitar una señal -> ineficiente
Analogía timer (externo) - kernel / señal - librería de threads
Uso de threads
● Separar hilos que fundamentalmente se bloquean
Threads
Implementación en espacio de usuario: desventajas
Threads
Implementación en espacio de kernel
● No es necesario el run-time system ni tabla de threads (en espacio de usuario)
● Un thread se bloquea como es usual y el kernel elige otro thread (u otro proceso)
● Debido al mayor costo, se pueden reutilizar los threads
Threads
Implementación en espacio de kernel
● ¿Qué pasa cuando un proceso con threads ejecuta fork?
● ¿Qué pasa con las señales? Por defecto son por proceso.
Threads
Implementación híbrida
● The kernel solo es consciente del kernel-thread
● Por sobre cada kernel-thread puede haber múltiples user-threads
Threads
Scheduler activations
● Threads en espacio de usuario con la funcionalidad de aquellos en
espacio de kernel.
● Al bloquearse, se crea un nuevo thread y se notifica al run-time
system (thread manager) - upcall - signal
● Viola la estructura de un sistema de capas
[Link]
Ejercicio 1
Desarrolle un programa que mediante el uso de threads threads(7) tenga una condición de carrera. Por ejemplo, varios threads
incrementando una variable sin mecanismos de sincronización. Luego resuelva la condición de carrera mediante el uso de semáforos.
Glosario
●