Vous êtes sur la page 1sur 16

RoboSim

Conceptos Bsicos de
Programacin
Robosim
Tecnologas en Robosim
Comunicaciones TCP-IP
Necesitamos utilizar cadenas alfanumricas y
las libreras de comunicaciones.
Programacin distribuida
Necesitamos utilizar objetos de sincronismo y
libreras para la gestin de threads.
Inteligencia Artificial
Necesitamos utilizar estructuras de datos y
variables dinmicas.
Robosim
Razones para Multi-hilo
Desarrollar un programa multi-hilo (multi-
thread) es ms complicado que uno
monohilo, as pues Por qu es necesario?
Respuesta 1: La funcin recv (o read)
detiene la ejecucin del programa hasta que
se recibe la informacin.
Respuesta 2: Si la informacin recibida por el
socket no se procesa (se ejecuta
inmediatamente recv read), esta
informacin se acumula => Necesitamos 1
hilo escuchando el puerto permanentemente.
Robosim
Qu es multitarea?
Una ilusin. La mayor parte de los
ordenadores son monotarea.
La multitarea consiste en repartir el
tiempo de ejecucin entre los procesos e
hilos que se estn ejecutando, de forma
que, aparentemente, se ejecutan todos a
la vez.
Existen programas llamados scheduler
que se encargan de repartir el tiempo de
ejecucin (en slots de ejecucin dedicados
a un hilo o proceso). Un scheduler es un
gestor de procesos e hilos.
Robosim
Pero Qu es un hilo?
Consideremos un programa para lnea de
comandos en C, ese programa tiene un punto de
invocacin: la funcin main y es monotarea
porque se ejecutan cada sentencia de ese main
secuencialmente. Slo se empieza una sentencia
cuando ha acabado la anterior.
Diseemos una tarea especfica e implementemos
una funcin con ella. Invoquemos a esa funcin,
pero dejemos que esa funcin se ejecute como si
fuese un programa aparte y por tanto que el
main siga su propia ejecucin si espera a la
finalizacin de la funcin. Ya tengo un hilo (un
thread).
Robosim
Arrancar un hilo
Para arrancar un hilo es necesario:
Una funcin con las sentencias del hilo.
Una forma de invocar la funcin que no sea
una simple llamada. Es decir, usar el gestor de
hilos.
En Windows:
CreateThread (est en la API de Windows)
Con parmetros importantes:
El punto de invocacin (es decir, la funcin)
Un parmetro opcional para esa funcin.
Otros parmetros: prioridad, tamao de stack,
Robosim
Compartir Datos entre Hilos
Normalmente los hilos deben compartir
informacin.
Los procesos de acceso y escritura de variables
(especialmente cuando son compuestas) puede
llegar a repartirse entre slots de ejecucin.
Si esto ocurre y 2 hilos entran a acceder o
modificar la misma variable se producen errores.
Por tanto, es necesario gestionar el acceso y
modificacin de datos compartidos entre hilos =>
sincronizacin de hilos.
Terminologa: Recursos Variables, datos,
archivos...
Robosim
Sincronizacin de Hilos
Idea fundamental: Semforo.
Impedir el acceso a un recurso de 2 hilos a la vez.
Cuando un hilo accede al recurso bloquea el acceso del
resto de recursos.
Ver sincronizacin de hilos
Implementacin:
Antes del cdigo de acceso-modificacin se hace una
peticin de bloqueo-espera.
Si se concede se pasa a ejecutar el cdigo y se bloquea
el semforo para el resto de hilos.
Si no se concede el hilo se bloquea (se detiene su
ejecucin) hasta que se libere el semforo.
Tarde o temprano se liberar el semforo y se ejecuta el
cdigo conflictivo.
Cuando se acaba el cdigo se debe liberar el semforo.
Robosim
Dnde se colocan?
En primer lugar es necesario conocer (o disear) con
claridad los recursos (es decir, las variables, datos
o archivos) compartidos entre hilos.
Si el recurso est preparado no es necesario hacer
nada (no es el caso corriente, pero existen). Se
suelen decir que son implementaciones multithread.
En caso contrario, se debe:
Declarar y compartir entre hilos un objeto de sincronismo
(un semforo).
Siempre que se acceda (se use el valor del recurso) o se
modifique en cualquier hilo se debe colocar el semforo (la
peticin-bloqueo-espera y la liberacin-desbloqueo).
Robosim
Objetos de Sincronismo
En Windows:
Mutex (RS_Server utiliza estos)
Critical Sections
Events (RS_Server tambin utiliza estos)

En otros sistemas:
Nombres parecidos, pero cuidado, el mismo
nombre de objeto de sincronismo puede
representar distinto tipo de semforo en otro
sistema o librera.
Robosim
Bloqueo y Liberacin
La peticin de bloqueo y la liberacin
se hacen a travs de funciones (o
mtodos, interfaces, ) que tienen
como parmetros el objeto de
sincronismo.
Por ejemplo:
WaitForSingleObject (espera y bloquea
un objeto de sincronismo)
ReleaseMutex (libera un objeto de
sincronismo tipo mutex)
Robosim
Compartir memoria entre hilos
No siempre se pueden compartir datos en
memoria entre hilos o procesos (hay que
consultar la documentacin del sistema).
Generalmente la memoria se comparte en
la zona de heap (variables dinmicas,
suele ser comn para todos los hilos de un
proceso), las zonas de stack (variables
locales de las funciones) de los hilos
suelen estar separadas.
Robosim
Sincronizacin va
Pila de Mensajes
Cuando la comunicacin entre hilos es muy
frecuente es muy til utilizar una pila de
mensajes (mala traducin de message queuing
en realidad es una cola).
La idea consiste en enviar informacin (un
mensaje) a otro hilo de forma asncrona (es
decir, en cualquier momento y slo
opcionalmente esperando una respuesta).
El hilo que recibe almacena los mensajes en una
estructura tipo cola o FIFO.
Procesa los mensajes sacndolos de la fifo en un
bucle infinito que no hace nada si no hay
mensajes pendientes de resolver.
Robosim
Implementacin de
la pila de mensajes
Se necesita:
Una estructura tipo lista comn a todos los hilos con una
operacin de insercin al final y otra de extraccin del
primer elemento y preparada para multihilo mediante
semforos.
Un bucle infinito que compruebe si la lista est vaca y si
no lo est quite el primer elemento y lo procese.
Alternativamente podemos usar el message
queuing de Windows (esta es la opcin que se usa
para comunicar RS_Server y RS_Visual y algunos
hilos dentro de RS_Server).
til si utilizis distintos tipos de control a largo y
corto plazo para comunicar sus algoritmos.
Robosim
Otra tcnica para mejorar la
sincronizacin
Compare-and-swap
Aunque la implementacin de esta tcnica es
bastante compleja podemos usar la idea
subyacente para mejorar el inter-bloqueo de
nuestros algoritmos.
Podemos:
Usar varios recursos de un mismo tipo (quizs
tantos o ms como hilos), los apuntamos con
distintos punteros. Lo normal es que el recurso sea
una estructura de datos, por ejemplo, una lista.
Cada hilo acta sobre un puntero distinto y cuando
acaba intercambiamos los punteros.
Robosim
Y que hago con mis hilos?
Los hilos los introducimos si queremos
realizar tareas concurrentes (a la vez) y
no queremos ocuparnos de distribuir el
tiempo de ejecucin nosotros mismos
(cosa complicada por otro lado).
Cada hilo debera realizar una tarea
distinta.
Muchos hilos pueden funcionar en bucles
infinitos. Simplemente hay que asegurarse
que el schuduler es capaz de suspender la
ejecucin de ese hilo y pasar al siguiente
(en ocasiones hace falta poner un sleep).

Vous aimerez peut-être aussi