Professional Documents
Culture Documents
Agenda
Introduccin
Modelos multi-hilo
Bibliotecas de hilo
Consideraciones sobre los hilos
Ejemplos de sistemas operativos
Pendientes
Prctica de Procesos en Sistemas *X.
Mircoles 17 de Febrero.
Cancelada. Investigacin sobre IPC en
Sistemas Operativos Distribuidos. Martes
23 de Febrero.
Prctica de RPC. Mircoles 24 de Febrero
RPC
Servidor que va a funcionar
administrador de procesos.
como
Calendarizacin
Suprimida. Programacin de hilos
sistemas *X. Martes 2 de marzo
en
Introduccin
El concepto de hilo es muy similar al
concepto de subproceso.
Los hilos van a permitir bifurcar el cdigo
de los programas haciendo que las
actividades
puedan
tomar
diversos
caminos de accin.
Para que puedan realizarse estas
actividades de forma concurrente el
sistema operativo debe soportarlas.
Concurrencia
El trmino concurrencia indica que se
tienen dos o ms procesos al mismo
tiempo en el mismo lugar; esto no implica
que se estn ejecutando al mismo tiempo
(paralelismo).
El trmino concurrencia se ha utilizado
para indicar que se ejecutan dos o ms
actividades
quasi-paralelamente.
En
sistemas monoprocesadores esto se logra
a travs de esquemas de multitarea real y
cooperativa.
Dnde se encuentra la
concurrencia?
En el hardware (la herramienta para
construir sistemas informticos):
ejecucin paralela de instrucciones
funcionamiento paralelo de los perifricos
procesadores mltiples
sistemas distribuidos
Concurrencia inherente o
potencial
Concurrencia inherente:
Hay sistemas que en los que forzosamente se
dan actividades simultneas.
p.ej. GUI; red de cajeros automticos; etc.
Concurrencia potencial:
Hay sistemas o problemas que se pueden
resolver de forma secuencial, pero en los que
se puede aprovechar la concurrencia p.ej.
para aumentar el rendimiento.
P.ej. multiplicar dos matrices, ordenar un
vector
Concurrencia Unix
Los subprocesos se crean con fork()
#include <sys/types.h>
pid_t pid;
pid = fork()
Se pueden copiar procesos con la familia de
funciones exec.
fork()
if (pid == -1)
perror(Error al crear proceso);
else
{
if (pid == 0)
/*Proceso hijo*/
else
/*Proceso padre*/
}
Seales
A el cdigo de estado de un proceso
formalmente se llama seal.
Un proceso hurfano es aquel que se ha
quedado sin padre.
Un proceso zombi es aquel que se ha
quedado ocupando una posicin de la
tabla de descriptor de procesos.
wait()
En algunas ocasiones un proceso padre
necesita esperar a que sus hijos termine.
Para ello necesita sincronizarse los
procesos.
La funcin que nos permite parar un
proceso hasta que termine otro es wait
pid = wait(&estado);
wait()
Algunas macros que nos ayudan en este
proceso son:
WIFEXITED
WEXITSTATUS
WIFSIGNALED
WTERMSIG
WCOREDUMP
Seales
Definidas en <signal.h>
1
2
3
4
5
6
7
8
9
SIGHUP
SIGINT
SIGQUIT
SIGILL
SIGTRAP
SIGIOT
SIGEMT
SIGFPE
SIGKILL
10
11
12
13
14
15
16
17
18
19
SIGBUS
SIGSEGV
SIGSYS
SIGPIPE
SIGALARM
SIGTERM
SIGUSR1
SIGUSR2
SIGCLD
SIGPWR
Seales
int kill(pid, sig) sirve para mandar una
seal de un proceso a otro.
pid > 0 proceso; pid = 0 a todos los
procesos que pertenecen al mismo grupo.
La funcin signal sirve para capturar una
seal y realizar una funcin con ella.
Seales
main() {
void sigint_handler();
if(signal(SIGINT,sigint_handler)== SIG_ERR)
perror(Error en la seal);
..
}
void sigint_handler(int sig) {
printf(seal recibida);
}
Hilos
Son procesos ligeros ya que no se
duplican completamente, slo duplican su
segmento de cdigo. Por tal motivo,
comparten
datos
fcilmente,
la
desventaja es que ocurren muchos
problemas del tipo race conditions, pero
al igual que IPC se soluciona con
mecanismos como regiones crticas,
zonas de exclusin mutua, etc.
Hilos
Los hilos son procesos ligeros a diferencia
de los procesos hijos, los hilos slo
replican el segmento de cdigo, por lo
que comparten datos entre otros hilos
haciendo mejor uso de la memoria.
La problemtica con los hilos es que cada
sistema operativo implementa sus hilos
de manera distinta. Por ejemplo existen
los hilos POSIX, los hilos C de Mach, los
hilos en Windows, etc.
Implementacin de Hilos
Bibliotecas de hilo
Para la programacin de hilos existen
diversas APIs.
En el caso de los sistemas *X hasta no
hace mucho (y de hecho aun muchos
sistemas se siguen implementando con
procesos hijos) se empez a realmente a
estandarizar el uso de hilos.
Lenguajes concurrentes como ADA,
modula2, Java y actualmente casi todos
los Sistemas Operativos lo implementan.
Hilos
PThreads (POSIX Threads) es la biblioteca
para
la
creacin
de
hilos
ms
implementada en sistemas *X.
Se utiliza la biblioteca pthread por lo que
algunos compiladores ya la incluyen de
manera predeterminada sino habr que
indicar su uso: gcc -lpthread
Hilos
Crear hilos:
int
pthread_create(pthread_t
*thread,
pthread_attr_t
*attr,
void
*
(*start_routine)(void *), void *arg)
Esperar la finalizacin de hilos:
int
pthread_join(pthread_t
th,
**thread_return)
void
Hilos
No guardar estado del hilo:
int pthread_detach(pthread_t h)
Salir de un hilo:
pthread_exit(void *retval)
Biblioteca
a
<pthread.h>
utilizar:
#include
Hilos
typedef struct parametros {
int id;
char *nombre
};
void *funcion(parametros *p) {
printf(%s %d, p->cadena, p->id);
pthread_exit(&(p->id))
Hilos
Referencia asi mismo:
Yo = pthread_self(); /*Dems funciones*/
Enviar una seal a un hilo:
pthread_kill(pthread_t hilo, int seal);
Los hilos no estn tan extendidos por que
existen muchas variantes: hilos mach,
hilos solaris, Gthreads, etc.
Hilos
Mutex:
pthread_mutex_init(pthread_mutex_t
const pthread_mutex_attr_t *attr)
*mutex,
Hilos
En general los hilos en Java debido a su
portabilidad binaria son idnticos en
todas las plataformas. Existen dos formas
bsicas
de
implementar
procesos:
heredar de la clase Thread o bien
implementar la interfaz Runnable.
En general en el mtodo public void run()
se agrega la funcionalidad del hilo.
Hilos
Si se heredo de la clase Thread el hilo
debe crearse de la siguiente forma:
Thread hilo = new Thread(new Objeto());
El mtodo Thread.sleep(ms); permite
dormir un proceso n cantidad de
milisegundos.
Hilos
En general se ejecuta el hilo poniendo el
mtodo start(), e.g.: hilo.start();
Otros mtodos de los hilos son: isAlive()
para determinar si un hilo est con vida,
el metodo stop()* finaliza un hilo, el
mtodo suspend()* lo suspende, el
mtodo resume() reanuda un proceso y
join() espera a que finalice un proceso
especificado.
Hilos
Se pueden asignar prioridades a los hilos
con el mtodo setPriority(), en donde la
prioridad puede ser MIN, MAX y
NORM_PRIORITY.
El mtodo yield() cede prioridad, mientras
que el mtodo setDaemon(true) hace que
un hilo sea demonio.
Hilos
Los demonios son hilos que pueden
correrse sin depender de otros procesos.
Se utilizan mucho para la programacin
de servicios del sistema.
Se pueden crear grupos de hilos con la
clase
GroupThread para un mejor
manejo.
Ejemplos de sistemas
operativos
Paralelismo
El problema del paralelismo radica en que
muchos
algoritmos
no
pueden
paralelizarse
(son
serializable
o
secuenciales).
Existen dos
paralelismo:
tecnologas
para
realizar
Algoritmo paralelos
for(int i = 0; i < 4; i++)
{
aleatorio(i);
}
aleatorio(1)
aleatorio(2)
aleatorio(3)
aleatorio(4)
micro1
micro2
micro3
en espera
Algoritmos paralelos
a11
a
21
am1
a12
a22
am 2
a1n x1
a 2 n x2
amn xn
Conviene
No conviene
b1
b2
bm
Algoritmos paralelos
Instrucciones como while son ms
difciles de paralelizar por que depende
de la condicin.
No siempre los compiladores pueden
paralelizar de manera automtica un
algoritmo.
En algunas ocasiones se invierte ms
tiempo tratando de paralelizar un
algoritmo que ejecutndolo de manera
secuencial.
Algoritmos paralelos
//Procesador uno
for( i=0; i<N/2; i++)
{
a[i]= c+i;
}
//Procesador uno
for( i=0; i<N/2; i++)
{
a[i]= c+i;
}
//Procesador dos
for( ; i<N; i++)
{
a[i]= c+i;
}
//Procesador dos
for( i = N/2; i<N; i++)
{
a[i]= c+i;
}
Algoritmos paralelos
A[0] = C;
//Procesador uno
for( i=1; i<N/2; i++)
{
a[i]= a[i-1]+1;
}
//Procesador 2
for( i=N/2; i<N; i++)
{
a[i]= a[i-1]+1;
}
Por qu no se puede
paralelizar?
Por que el segundo
proceso depende del
resultado del primero.
Si se puede si se
encuentra
un
algoritmo que permita
encontrar el valor de
a[N/2] directo.
N /2
i
i C
Holamundo.c en MPI
#include <stdio.h>
#include mpi.h
int main(int argc, char **argv)
{
int procesos, rango, tam;
char nombre[MPI_MAX_PROCESSOR_NAME];
MPI_Iinit (&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &procesos);
MPI_Comm_rank(MPI_COMM_WORLD, &rango);
MPI_Get_processor_name(nombre, &tam);
MPI_barrier(MPI_COMM_WORLD);
printf(Hola, mundo!, soy %d de %d y me ejecuto en:%s\n, rango,
procesos, nombre);
MPI_Finalize();
return 0;
}
Esquema de un programa en
MPI
Esquema de un programa en MPI
/*Cabecera de MPI*/
#include <mpi.h>
int main(int argc, char **argv)
{
int quiensoy, tamano;
MPI_Status estado;
/*Inicializamos MPI*/
MPI_Init(&argc, &argv);
/*Preguntamos quienes somos*/
MPI_Comm_rank(MPI_COMM_WORLD, &quiensoy);
/*Nos esperamos hasta quetodos hayan inicializado MPI*/
MPI_Barrier(MPI_COMM_WORLD);
/*Preguntamos cuanto somos*/
MPI_Comm_size(MPI_COMM_WORLD, &tamano);
/*PROGRAMA*/
Esquema de un programa en
MPI
if(quiensoy == root)
{
/*Inicializacin estrructuras repartidor
Reparte tareas
Espera resultados
Visualiza resultados*/
}
else
{
/*recibe la tarea
realiza clculos
manda resultados*/
}
/*Finaliza el programa*/
MPI_Finalize();
exit(0);
}
Paralelizacin Multiplicacin de
Matrices
Programa secuencial de multiplicacin de
matrices en Java o C.
Programa concurrente, partir del hecho
de que se puede poner un hilo en
ejecucin
para
multiplicaciones
no
dependientes.
Clasificacin de STR
Existen dos tipos de STR:
Crtico (rgido): para tareas que siempre
deben cumplir los plazos de terminacin.
Adecuados para la industria. Muy simples,
incompatibles con tiempo compartido,
memoria virtual, etc.
No crtico (flexible): intentan cumplir los
plazos, pero no los garantizan al 100%.
Adecuados para multimedia, etc.
Ejemplo de STR
Aeronave
Carro
Sistemas Embebidos de TR
Uso militar
Sistema de reconocimiento de blancos
automtico
Sistema de guiado de misiles y navegacin
E/S
Digital
E/S
Analgico
Medio
Ambiente
Comunicaciones
Otras
Computadoras
Software de Tiempo-Real
Microcontroladores y sistemas embebidos.
DSPs, PLCs.
Buses de multiprocesadores:VMEBUs,Multibus,FutureBus
Arquitecturas RISC, Transputers.
Uniprocesadores, Multiprocesadores.
Memorias chache, DMAs.
Reloj
Computadora (HW)
Otras
E/S
Control de
Velocidad
C=4ms.
T=20ms.
D=5ms.
Control de
combustible
Control de
Frenado
C=40ms.
T=80ms.
D=80ms.
C=10ms.
T=40ms.
D=40ms.
C=10ms.
Otro software T=40ms.
no-critico
Solucion Ciclica.
76
combustible-2
64
vel.
60
no
velocidad
critico
frenado
com
busti
ble-3
54
14
com
busti
ble-1
20
vel.
24
frenado
velocidad
44
combustible-2
40
Solucion Concurrente.
La solucion concurrente es mas simple de disenar y modificar.
task body speed is
begin
loop
speed_measurement;
next:=next+0.2
sleep_until_next;
end loop
end speed
Sistemas Distribuidos de TR
Son totalmente ms complejos debido a
la
gran
heterogeneidad
de
sus
componentes.
Debido a esta problemtica son poco los
Sistemas Operativos Distribuidos de
Tiempo Real aunque muchos SO de
Tiempo Real (ej. SO de dispositivos
empotrados)
tienen
capacidad
de
comunicacin distribuida.
Sistemas Operativos de TR
El problema de la distribucin radica en los
tiempos de latencia de los mecanismos de
comunicacin distribuida (sockets, RPC,
middlewares, etc.) dado que no hay una
garanta de servicio y ms si se enfoca en
redes pblicas como la Internet.
En la prctica la gran mayora de los
Sistemas
Operativos
Distribuidos
de
Tiempo Real se llegan a implementar en
sistemas multiprocesadores.
Sistemas Operativos
Distribuidos de TR
La mayora de los sistemas operativos
distribuidos de tiempo real caen en el
rea de multimedia (QNX) y de los
sistemas empotrados (Symbian). Los
sistemas de navegacin son otro claro
ejemplo de SOTR.
Referencias
Liberty, Jesse, Horvarth, David (200).
Aprendiendo C++ para Linux en 21 Das.
Mxico, Prentice Hall.
Mrquez,
Francisco
(1994).
Unix
Programacin Avanzada. Estados Unidos,
Addison-Wesley.
Referencias
Colouris,
George,
Dollimore,
Jean,
Kindberg,
Tim
(2001).
Sistemas
Distribuidos Conceptos y Diseo. 3a.
Edicin. Espaa, Pearson Addison-Wesley.
Horstmann, Cay, Cornell, Gary (2006).
Core Java 2 Volumen II Carctersticas
Avanzadas. Espaa, Perason Prentice
Hall.
Referencias
Deitel, Harvey, Deitel, Paul (2004). Java
Como Programar. Quinta Edicin. Mxico,
Pearson Prentice Hall.
Mrquez,
Francisco
(2004).
UNIX
Programacin Avanzada. Tercera edicin,
Mxico, Alfaomega Ra-Ma.
Referencias
Tanenbaum, Andrew (1996). Sistemas
Operativos Distribuidos. Mxico, Prentice
Hall.
Tanenbaum, Andrew, Van Steen, Maarten
(2006). Distributed Systems Principles
and Paradigms. Estados Unidos, Pearson
Prentice Hall.
Meja, P. (2009), Curso de Sistemas de
Tiempo Real, CINVESTAV, Mxico.
Preguntas, dudas y
comentarios?