Title: Hebras
1Hebras
2Qué es un proceso?
- Consiste
- Espacio de direccionamiento
- Código a ejecutar
- Datos estáticos y dinámicos
- Pila o stack
- CPU PC, SP y valores en registros de propósito
general - Conjunto de recursos
- Archivos, pipes, conecciones,etc
3Concurrencia y paralelismo
- Imaginar un servidor web que requiere manejar
múltiples requerimientos concurrentemente - Mientras verifica la tarjeta de crédito de un
cliente, podría recuperar de disco la información
para otro cliente o realizar una búsqueda para
otro - Imaginar un cliente web (web browser) que desee
realizar múltiples requerimientos simultaneamente - Múltiples búsquedas, lectura de mails, chat, etc
- Imaginar un programa paralelo ejecutándose en un
multiprocesador, el cual no necesite concurrencia
en términos de la multiplexación de una CPU - Ejemplo típico, multiplicación de matrices,
dividir las matrices en un k regiones y calcular
la multiplicación de las k regiones en k CPUs
4Que se necesita?
- En cada uno de ejemplos por separado
- Todos los requerimientos quieren ejecutar el
mismo código - Gran parte de los datos son los mismos (excepto
caso paralelo) - Todos tienen los mismos privilegios
- Todos usan los mismos recursos (archivos abiertos
y conecciones) - Nos gustaría tener múltiples estados de ejecución
- Cada estado de ejecución requiere
- Estado en CPU
- Pila de ejecución y su puntero SP
- PC, indicando próxima instrucción a ejecutar
- Conjunto de valores de registros de propósito
general
5Podemos hacer esto con procesos
- Podríamos crear varios procesos con fork() y
hacer que cada uno atienda un requerimiento? - Al crearse un proceso hijo
- Desempeño
- No tan bueno, porque SO ocupa tiempo y memoria
para crear tabla de página y PCB de hijo - Sin embargo, SO no copia datos y código, sino que
sólo hace que tablas de páginas de procesos
apunten a lo mismo - COW (Copy On Write) SO asigna memoria a proceso
hijo cuando desea escribir.
6Podemos hacerlo mejor
- Idea
- Separar concepto de proceso (espacio de
direccionamiento, estado CPU, recursos) - Que es lo mínimo que necesitamos para identificar
un estado de ejecución? - Estado de CPU A esto se le llama hebra de
control - Incluye estado PC,SP y valores registros
generales - También se le llama proceso liviano
7Hebras y procesos
- Mayoría de SOs modernos (Mach, NT, Unix, Linux)
soportan - Proceso, el cual define espacio de
direccionamiento y recursos como archivos
abiertos, conecciones, etc - Hebra, define un flujo de ejecución secuencial
dentro de un proceso - Una hebra vive dentro de un proceso
- Múltiples hebras pueden vivir en un proceso
- Compartir datos entre hebras es barato, comparten
mismo espacio de direccionamiento - Crear hebras es rápido, manipulación del espacio
de direccionamiento y estructura de datos de SO
que conoce de hebras - Hebras pueden pasar a ser unidades planificables
por SO - Procesos pasan a ser contenedores de hebras
8Hebras en sistemas/lenguajes disponibles
clave
UNIX antiguos
MS/DOS
Una hebra/proceso
Espacio direcc.
Una hebra/proceso
Un proceso
Muchos procesos
hebra
Java
Mach, NT, Linux,
Muchas hebras/proceso
Muchas hebras/proceso
Muchos procesos
Un proceso
9Proceso ayer/hoy
Stack hebra 1
SP (H1)
0xFFFFFFFF
Stack hebra 2
SP (H2)
Stack hebra 3
SP (H3)
Espacio de direccionamiento
heap (mem dinámica)
Datos estáticos (data segment)
código (text segment)
PC (H2)
PC (H1)
0x00000000
PC (H3)
10Proceso
11Hebras
12Separación Hebra/proceso
- Multithreading (concurrencia) útil para
- Manejar eventos concurrentemente
- Cuál es la ganada en una CPU?
- Construir programas paralelos
- Hebras se ejecutan en distintas CPUs
- Mejorando estructura de programas
- En lugar de crear múltiples procesos concurrentes
crear múltiples hebras concurrentes - Más rápido / menos memoria / más fácil compartir
13Quién crea/maneja hebras?
- Opción 1 Hebras de Kernel (SO)
- Llamadas a sistema permiten creación
- Asignar stack de ejecución dentro del espacio de
direccionamiento de un proceso - Crear e inicializar un TCB
- SP, PC, registros
- Planificación de hebras realizada por OS
14Quién crea/maneja hebras?
- Opción 2 Creadas y manejadas en nivel usuario,
dentro de un proceso - Una biblioteca linkeada con el programa que usa
hebras - Operaciones de creación, destrucción, etc sobre
hebras son llamadas a procedimientos (no llamadas
a sistema) - Descritas como muchas to una
- Muchas hebras mapeadas a un proceso/hebra del
kernel - Biblioteca posee planificador de hebras creadas
por proceso
proceso
Hebra kernel
15Ilustración hebras de kernel
Mach, NT, Linux,
Espacio Direccionamiento
kernel
hebra
CPU
Operaciones sobre hebras mediante llamadas a
sistema al kernel
16Hebras nivel usuario
Mach, NT, Linux,
Espacio de direccionamiento
Hebras de kernel
kernel
hebra
CPU
Kernel crea maneja hebras de kernel
17Manejando mejor hebras nivel usuario
Mach, NT, Linux,
Espacio de direccionamiento
Hebras kernel
kernel
hebra
CPU
Manejo hebras kernel
18Implementación de hebras nivel usuario
- Kernel ve a proceso como cualquier otro
- Hebras de nivel usuario invisibles al SO
- Pero proceso incluye funcionalidad proporcionada
por biblioteca de hebras la cual tiene su propio
planificador - Planificador de biblioteca decide que hebra del
proceso se ejecuta a determinado tiempo - SO provee de llamadas a sistema no bloqueantes,
de manera que si una hebra de usuario hace E/S
biblioteca de hebras sabe que puede hacer cambio
de contexto en hebras de usuario
19Hebras de nivel usuario
- POSIX Threads API
- En biblioteca libpthreads.so en linux
- t pthread_create(attributes, start_procedure)
- Crea hebra de control, que comienza ejecución en
procedimiento dado - Puede especificar creación de hebras nivel kernel
en attributes - pthread_cond_wait(condition_variable)
- Hebra se bloquea hasta que condición se cumple
- pthread_signal(condition_variable)
- Señaliza a hebra que espera por condicion
- pthread_exit()
- Termina la hebra
- pthread_join(t)
- Espera por hebra t hasta que termine
20Resumen
- Hebras de kernel son más eficientes que procesos
- Hebras de nivel usuario son más rápidas que las
de kernel - Operaciones no pasan a través de SO
- Si hebras de nivel usuario residen en un proceso
representado por sólo una hebra de kernel - No puede proporcionar paralelismo si solo una
hebra de kernel asociada a proceso - Si una hebra de proceso de usuario se bloquea en
E/S entonces todo el proceso se bloquea
(asumiendo que solo una hebra de kernel está
asociada a proceso) - Normalmente biblioteca maneja llamadas a sistema
no bloqueantes por hebras de usuario de manera
que pueda utilizar hebra de kernel para otra
hebra de usuario