Sunteți pe pagina 1din 68

Escuela Politcnica

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

Comunicacin entre procesos

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();
}
}

Considere un tiempo de servicio mucho


mayor que el tiempo por cambio de contexto y
mucho mayor que el tiempo por
establecimiento de conexin.

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.

Opcin 3: Servidor concurrente


(multihilo/multithread)
Permitir diferentes flujos de ejecucin simultneas
asociados a un mismo proceso.
Qu se requiere para diferencia un flujo de ejecucin de
otro?

Pila (user stack).


PC (Program Counter).
Estados del thread
Valores de los registros.

El resto de informacin asociada a un proceso ser nico y


compartido por todos sus hilos.

Cdigo del programa.


Informacin sobre los dispositivos (Tabla de descriptores)
Gestin de seales (tabla de seales).

Opcin 3: Servidor concurrente


(multihilo/multithread)
Los recursos se siguen asignando en su mayora a los
procesos:
Espacio de direcciones.
Dispositivos.
Sin embargo la planificacin (scheduling) ahora se hace a
nivel de hilos.

Los hilos de un proceso comparten todos los recursos


asignados a un proceso, excepto:

PC
Pila
Registros
Identificador

Opcin 3: Servidor concurrente


(multihilo/multithread)
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(){
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:

1 sola regin para el cdigo del programa.


1 sola regin para los datos.
1 sola regin para el heap.
N pilas (1 por cada thread).

Cada thread un PC y registros.


Context switching ms barato.

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).

Cundo usar threads?


Algunos escenarios en donde son necesarios
los threads son:
Para explotar el paralelismo y la concurrencia.
Mejorar la modularidad de las aplicaciones.
Aplicaciones intensivas de operaciones de E/S.
Threads dedicados solo al acceso a dispositivos.

En servidores.

Ventajas de usar threads


sobre los procesos.
Menor costo de gestin (menor tiempo) en la
creacin, destruccin y context switching.
Mejor aprovechamiento de recursos.
Simplicidad del mecanismo de comunicacin
a travs de la comparticin de memoria.

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)

Sincronizacin de fin de flujo:


Procesos: wait, waitpid(pid, codigo_error, FLAGS)
Threads: pthread_join(thread_id, cdigo 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).

Retorna 0 si se creo el thread satisfactoriamente, otro


valor en caso contrario.

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.

Cambio de atributos del thread:


Por ejemplo la funcin
pthread_attr_setdetachstate(pthread_attr_t *attr, CONSTATE)
permite especificar si el thread puede o no esperar a que
termine:
Si CONSTANTE es PTHREAD_CREATE_JOINABLE esperar por el
thread. Si es PTHREAD_CREATE_DETACHED, se libera
automticamente.

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.

Devuelve cdigo de error o cero si se ejecuta


correctamente.

Ejercicio en clase (1)


Comprobar que el tiempo de creacin y
gestin de threads es menor que los procesos.
Construir dos aplicaciones que creen N
threads/procesos y medir el tiempo que
tardan en hacerlo.
Procesos: http://goo.gl/TlPnjK
Threads: http://goo.gl/TlPnjK

Ejercicio en clase (1)


salida procesos

Ejercicio en clase (1)


salida Threads

Ejercicio en clase (1)


procesos

Ejercicio en clase (1)


threads

Ejercicio en clase (1)


threads

Ejercicio en clase (1)


medicin de tiempos
Para la medir los tiempos de ejecucin de
ambos programas utilizamos el comando
time de GNU/Linux.
Tiempo para 50000 procesos:

Tiempo para 50000 threads

Ejercicio en clase (2)


Se requiere calcular la tangente de un nmero a
travs del clculo de las series de taylor del seno
y coseno.
Tenemos dos opciones:
1. Calcular a travs de un solo hilo.
2. Calcular a travs de dos hilos.
Uno para el seno
Otro para el coseno.

Comparar a travs del comando time de LINUX,


el tiempo que toma cada una de las opciones.

Ejercicio en clase (2)


Solucin con 1 solo hilo: http://goo.gl/TlPnjK
Solucin con 2 hilos: http://goo.gl/TlPnjK

Ejercicio en clase (2)


Solucin con 1 solo hilo (primera parte):

Ejercicio en clase (2)


Solucin con 1 solo hilo (segunda parte):

Ejercicio en clase (2)


Solucin con dos hilos (primera parte):

Ejercicio en clase (2)


Solucin con dos hilos (segunda parte):

Ejercicio en clase (2)


Solucin con dos hilos (tercera parte):

Resultado ejercicio (2)

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.

La cena de los filsofos


Cinco filsofos de una mesa.
Cada uno requiere dos palillos para comer sus tallarines.
Cada filsofo solo puede tomar los palillos de su izquierda y derecha.

La cena de los filsofos


Opcin 1: Cada uno de los filsofos intenta tomar los
palillos al mismo tiempo.
Resultado del da Lunes:
C
D

Condicin de carrera (race condition)


A

B, C y E se quedan sin comer.

La cena de los filsofos


Opcin 1: Cada uno de los filsofos intenta tomar los
palillos al mismo tiempo.
Resultado del da Martes:
C
D

Condicin de carrera (race condition)


A

A, C y D se quedan sin comer.

Condicin de carrera (race


condition)
No se tiene certeza de cul ser el resultado
de la ejecucin de un programa.
Se dice que existe una condicin de carrera
(race condition) si el resultado de la ejecucin
depende del orden en que se intercalan las
instrucciones de los procesos intervinientes.
Se debe evitar una condicin de carrera (race
condition) en los programas multiproceso
implementados.

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

El valor final (luego de finalizan los 2 procesos) de la


variable contador puede ser 1 o 2. Por qu?
La solucin es evitar los cambios de contexto? NO

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).

La forma de sincronizacin que se usa para


proteger una seccin crtica y evitar una
condicin de carrera se llama exclusin mutua.
El programador debe:
Identificar las secciones crticas de su cdigo.
Debe marcar el inicio y fin de la seccin crtica usando las
herramientas soportadas en el sistema.

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.

Ejemplo: Mutex (Mutual


Exclusion)
int contador = 1; /* variable compartida */
pthread_mutex_t rc1; // Tambin compartida
pthread_mutex_init(& rc1,NULL); // Se inicializa el mutex (una vez)
pthread_mutex_lock(& rc1); // Bloqueo
if (primero) {
contador ++;
pthread_mutex_unlock (& rc1); //Desbloqueo

tarea_1();
} else {
pthread_mutex_unlock(& rc1); //Desbloqueo

tarea_2();
}

Dos threads no pueden mantener el mismo MUTEX


bloqueado al mismo tiempo.

Ejemplo: Mutex (Mutual


Exclusion)

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).

La cena de los filsofos


Opcin 2. Cada filsofo toma el palillo de la
derecha.

La cena de los filsofos


Opcin 2. Cada filsofo toma el palillo de la
derecha.

Interbloqueo (deadlock)

Todos se mueren de hambre

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.

La cena de los filsofos


Opcin 3. Los filsofos A y D de mayor jerarqua
(prioridad) toman los 2 palillos y dada su
jerarqua nunca lo sueltan.
C
D

La cena de los filsofos


Opcin 3. Los filsofos A y D de mayor jerarqua
(prioridad) toman los 2 palillos y dada su
jerarqua nunca lo sueltan.
C
D

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

El proceso A toma el recurso R, los


procesos B y C tambin lo requieren y
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

PC

El proceso termina de usar el


recurso R, dado que PB tiene
mayor prioridad que PC lo obtiene.
En este punto PA requiere
nuevamente el recurso 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

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

El proceso termina de usar el


recurso R, dado que PB tiene
mayor prioridad que PC lo obtiene.
En este punto PA requiere
nuevamente el recurso R.

S-ar putea să vă placă și