Documente Academic
Documente Profesional
Documente Cultură
Nacional
Sistemas Operativos
Danny Guamn
danny.guaman@epn.edu.ec
danny.guamanl@gmail.com
Twitter: @dan2ysgl
2016
Threads (Hilos de
ejecucin)
hasta ahora
Modos de ejecucin
Permisos (Credenciales y
privilegios)
Interrupciones
Usuario
Scheduler
Llamadas al sistema
POSIX
WIN32
Aplicaciones
API
S.O.
Proceso
Proceso
Hardware
Memoria
CPU
Dispositivos de E/S
Archivos
Proveer servicios
Gestin de recursos
Proteccin
Gestin de recurso
Gestin de procesos
Gestin de memoria
Gestin de archivos
Seguridad
Etc.
Resultados de aprendizaje
Entender las diferencias entre hilo y proceso.
Implementar una aplicacin utilizando
threads en LINUX.
Procesos vs Hilos
Proceso:
Set de recursos asignados (1) + Flujo de ejecucin (1)
Si se requiere ms flujos de ejecucin?
Ms procesos -> Cada uno con su propio set de recursos
asignados.
Un thread:
Set de recursos asignados (1) + Flujo de ejecucin
(muchos)
Un thread hace posible ejecutar concurrentemente
varias funciones dentro de un mismo proceso.
Considere el siguiente
ejemplo
Cliente 1
{
..
Enviar_peticion();
Cliente 2
Esperar_respuesta();
{
Procesar_respuesta();
..
Enviar_peticion();
Cliente N
}
Esperar_respuesta();
{
Procesar_respuesta();
..
Enviar_peticion();
}
Esperar_respuesta();
Procesar_respuesta();
DATOS GLOBALES
Servidor
{
While(){
Esperar_peticion();
Preparar_respuesta();
Enviar_respuesta();
}
}
Opcin 1: Servidor
iterativo (monoproceso)
Cliente 1
{
.. Cliente 2
{
Enviar_peticion();
.. Cliente N
Esperar_respuesta();
Enviar_peticion();
{
Procesar_respuesta();
..
Esperar_respuesta();
Procesar_respuesta();
Enviar_peticion();
}
Esperar_respuesta();
} Procesar_respuesta();
DATOS GLOBALES
Servidor
{
While(){
Esperar_peticion();
Preparar_respuesta();
Enviar_respuesta();
}
}
Opcin 1: Servidor
iterativo (monoproceso)
Solo un cliente a la vez.
Se desaprovechan las ventajas de la
concurrencia y/o el paralelismo.
Opcin 2: Servidor
concurrente (multiproceso)
Cliente 1
{
..
Enviar_peticion();
Esperar_respuesta();
Procesar_respuesta();
}
Cliente 2
{
..
Enviar_peticion();
Esperar_respuesta();
Procesar_respuesta();
}
Cliente N
{
..
Enviar_peticion();
Esperar_respuesta();
Procesar_respuesta();
DATOS GLOBALES
Servidor
{
While(){
DATOS GLOBALES
Servidor
{
While(){
INICIO_proceso
Esperar_peticion();
Preparar_respuesta();
Enviar_respuesta();
FIN_proceso
}
}
DATOS GLOBALES
INICIO_proceso
Esperar_peticion();
Preparar_respuesta();
Enviar_respuesta();
FIN_proceso
}
}
Servidor
{
While(){
DATOS GLOBALES
Servidor
{
While(){
INICIO_proceso
Esperar_peticion();
Preparar_respuesta();
Enviar_respuesta();
FIN_proceso
}
}
INICIO_proceso
Esperar_peticion();
Preparar_respuesta();
Enviar_respuesta();
FIN_proceso
}
}
Opcin 2: Servidor
concurrente (multiproceso)
Ejecucin concurrente y/o paralela.
Sin embargo.
Se desaprovechan recursos Porqu?
Replicacin innecesaria de estructuras de datos que
almacenan los mismos valores (PCB, Tabla de
descriptores de archivos y sockets, tablas de seales,
etc)
Replicacin del espacio de memoria que almacena el
cdigo del programa y sus datos.
El context switching es caro.
PC
Pila
Registros
Identificador
}
Cliente 2
{
..
Enviar_peticion();
Esperar_respuesta();
Procesar_respuesta();
Cliente N
{
..
Enviar_peticion();
Esperar_respuesta();
Procesar_respuesta();
DATOS GLOBALES
Servidor
{
While(){
INICIO_FLUJO
INICIO_FLUJO
Esperar_peticion();
Esperar_peticion();
Preparar_respuesta();
Preparar_respuesta();
Enviar_respuesta();
Enviar_respuesta();
FIN_FLUJO
FIN_FLUJO
}
}
INICIO_FLUJO
Esperar_peticion();
Preparar_respuesta();
Enviar_respuesta();
FIN_FLUJO
INICIO_FLUJO
Esperar_peticion();
Preparar_respuesta();
Enviar_respuesta();
FIN_FLUJO
INICIO_FLUJO
Esperar_peticion();
Preparar_respuesta();
Enviar_respuesta();
FIN_FLUJO
Threads
1 proceso con N flujos 1 PCB
N flujos de ejecucin del proceso que se pueden
ejecutar de forma concurrente.
En el PCB hay espacio para guardar los contextos de
los N flujos.
Espacio de memoria:
Procesos vs Threads
Procesos vs Threads
Comparticin de memoria.
Entre procesos:
Por defecto la memoria es privada para un proceso y
nadie puede acceder directamente.
Las tuberas, los archivos, las seales y los sockets son
algunos mecanismos que permiten comunicar los procesos.
Entre threads:
Todos los threads pueden acceder a todo el espacio del
proceso al que pertencen (programa, datos y heap).
Importante:
Cada thread tiene su propia pila, de tal forma que puede
manejar sus variables locales, parmetros y control de
ejecucin (llamado a funciones).
En servidores.
POSIX THREADS
POSIX Threads
Estandarizado por la IEEE (Institute of
Electrical and Electronics Engineers).
Est definido como un conjunto de funciones,
desarrolladas con el lenguaje de
programacin C, que han sido incluidos en la
librera cuyo archivo de cabecera es
pthread.h
Para compilar un programa que usa threads con
gcc se debe incluir la directiva lpthread.
POSIX Threads
Existe un thread inicial que ejecuta la funcin
principal main().
El thread existente puede crear ms threads para
ejecutar otras funciones dentro del espacio de
direcciones del proceso.
Todos los threads de un proceso son hermanos,
es decir que se encuentran a un mismo nivel.
Los threads de un proceso comparten las
variables y recursos globales (archivos, signal
handlers, etc) del proceso.
Las variables locales son privadas de cada thread.
POSIX Threads
Las funciones incluidas en el API Pthread,
informalmente, puede ser agrupada de la siguiente
forma:
Gestin de threads.
Creacin, destruccin, unin, sepracin de
threadsmodificacin de atributos del thread.
Mtex:
Rutinas para sincronizacin
Variables de condicin:
Permiten la comunicacin entre threads que comparten un
mutex.
Sincronizacin
Rutinas para gestin de bloqueos.
POSIX Threads
Creacin:
Procesos: fork()
Threads: pthread_create(out thread_id, in NULL, in funcion, in
param)
Identificacin:
Procesos: getpid()
Threads:pthread_self()
Finalizacin:
Procesos: exit(codigo_error)
Threads:pthread_exit(codigo_error)
Creacin de threads
int pthread_create(pthread_t *thread, pthread_attr_t *attr, void
*rutina, void *args)
Crea un nuevo thread. Se puede llamar desde cualquier lugar del
cdigo y cuantas veces sea necesario.
thread: entero identificador del thread.
attr: Contiene los atributos del thread. Si se enva NULL se setean las
caractersticas por defecto.
rutina: Funcin que ejecutar el thread.
args: Un solo argumento que ser pasado a la funcin rutina. NULL
si no hay argumentos.
Si se requiere pasar ms de un parmetro, se debe enviar el
puntero a una estructura (Dicha estructura debe contener todos
los parmetros deseados).
Caractersticas de un thread
Cuando se crea un thread tendr algunos atributos por
defecto, que pueden ser cambiados por el programador:
pthread_attr_init y pthread_attr_destroy son usados para
inicializar y destruir objetos atributo.
pthread_attr_init(pthread_attr_t *attr);
pthread_attr_destroy(pthread_attr_t *attr);
attr: Estructura que contiene los atributos del thread.
Identificacin de un thread
int pthread_self(void);
Devuelve el identificador del thread
Terminacin de un thread
Un thread es terminado por varias causas:
El thread finaliza la rutina que ejecutaba.
Se llama a la funcin pthread_exit(*void), de
forma explcita. NULL por defecto.
El thread es cancelado por otro thread por medio
de pthread_cancel.
int pthread_exit(void *status);
status: valor de retorno del thread
Sincronzacin de threads
Bloquea al thread que la ejecuta hasta que el thread
indicado acabe y recoge el valor que ha pasado al
pthread_exit.
int pthread_join(pthread_t th, void **estado);
th: identificador del thread al que se espera
estado: contendr el parmetro que el flujo th le pas al
pthread_exit. Si NULL se ignora el parmetro del pthread_exit.
SINCRONIZACIN DE THREADS
Comunicacin mediante
memoria compartida
Los threads pueden intercambiar informacin
a travs de la memoria que comparten.
Ms de un thread puede acceder a un mismo
recurso (ejm: variable) de forma concurrente.
Problemas?
Inconsistencia
Solucin?
Mecanismos de sincronizacin.
Condicin de carrera
2 procesos (PA y PB) + 1 un recurso (R).
El recurso compartido es una variable inicialmente
con el valor 0.
PA
PB
Leer contador
contador++
Escribir contador
R
contador = 0
Leer contador
contador++
Escribir contador
Condicin de carrera
Cul ser el resultado final de la variable contador?
Considere un sistema monoprocesador y un
multiprocesador.
PA
PB
Leer contador
contador++
Escribir contador
Leer contador
contador++
Escribir contador
R
contador = 0
Condicin de carrera
Para evitar las condiciones de carrera se debe
identificar las secciones crticas (secciones con
recursos (variables) comunes) y garantizar
que se ejecuten de forma atmica (exclusin
mutua) .
Exclusin mutua
Seccin crtica: Una secuencia de instrucciones
que se debe ejecutar de forma indivisible o
atmica (todo o nada).
Mientras un thread est ejecutando cdigo de esa
regin ningn otro thread lo har (aunque haya
cambios de contexto).
Exclusin mutua
El sistema operativo ofrece
llamadas al sistema para marcar
el inicio y fin de la seccin
crtica:
Inicio: Si ningn otro thread ha
pedido acceso a la regin crtica se
deja que contine accediendo,
sino se hace que el thread espere
hasta se libere el acceso a la
seccin crtica.
Fin: Se libera el acceso a la seccin
crtica y si algn thread estaba
esperando el permiso para
acceder se le permite el acceso.
tarea_1();
} else {
pthread_mutex_unlock(& rc1); //Desbloqueo
tarea_2();
}
Consideraciones al implementar
la exclusin mutua
El programador debe tener en cuenta lo
siguiente:
Las regiones crticas deben ser lo ms pequeas
posibles para maximizar la concurrencia.
La incorrecta sincronizacin de threads puede
traer los siguientes problemas:
Interbloqueo (deadlock).
Inanicin (starvation).
Inversin de prioriad (priority inversion).
Interbloqueo (deadlock)
Interbloqueo
Otro ejemplo: Cuatro automviles llegan a una
interseccin sin semforos al mismo tiempo.
Regla: Tiene prioridad el automvil de la derecha.
Interbloqueo
2 procesos + 2 recursos.
El proceso P1 utiliza el recurso B y para continuar requiere el
recurso A.
El proceso P utiliza el recurso A y para continuar requiere el
recurso B.
Inanicin
(starvation)
A
E
B, C y E mueren de hambre.
Inanicin
3 procesos + 1 recurso.
El proceso A tiene mxima prioridad.
El proceso B tiene prioridad normal.
El proceso C tiene prioridad mnima.
PA
PB
PC
Inanicin
3 procesos + 1 recurso.
El proceso A tiene mxima prioridad.
El proceso B tiene prioridad normal.
El proceso C tiene prioridad mnima.
PA
PB
PC
Inanicin
3 procesos + 1 recurso.
El proceso A tiene mxima prioridad.
El proceso B tiene prioridad normal.
El proceso C tiene prioridad mnima.
PA
PB
PC
Inanicin
3 procesos + 1 recurso.
El proceso A tiene mxima prioridad.
El proceso B tiene prioridad normal.
El proceso C tiene prioridad mnima.
PA
PB
PC
El recurso R nuevamente es
tomado por el proceso A. Los
procesos B y C esperan.
R
Inanicin
3 procesos + 1 recurso.
El proceso A tiene mxima prioridad.
El proceso B tiene prioridad normal.
El proceso C tiene prioridad mnima.
PA
PB
El proceso C nunca se
ejecuta.
PC