Los agentes móviles (o mobile agents) son agentes que tienen la capacidad de transmitirse a sí mismos a través de una red, y reanudar la ejecución en un sitio remoto. Los agentes móviles aparecieron gracias a General Magic, Inc., con su lenguaje de programación Telescript (del que hablaré en otro post más adelante), aunque ahora existen otras plataformas de agentes móviles disponibles para muchos lenguajes y plataformas. La motivación general que hay detrás de los agentes móviles es bastante simple. La idea era que los agentes móviles reemplazaran las llamadas a procedicimentos remotas a como una vía para que los procesos se comuniquen a través de una red.
Respecto a las llamadas a procedicimientos remotas, la idea es que un proceso pueda invocar un procedimiento (un método, en otras palabras) en otro proceso que se encuentra en una máquina remota. Suponemos que un proceso A invoca un método m en un proceso B con unos argumentos args; el valor devuelto por el proceso B se asigna a una variable v. Usando una sintaxis basada en Java, el proceso A ejecuta una instrucción parecida a lo siguiente:
v = B.m(args)
Crucialmente, en las llamadas remotas de procedimientos la comunicación es síncrona. Por ejemplo, un proceso A bloquea desde el momento que comienza a ejecutar la instrucción hasta que el proceso B devuelve un valor. Si B nunca devuelve un valor (porque la conexion falle, por ejemplo) entonces A debe permanecer suspendida indefinidamente, esperando una respuesta que nunca llegará. La conexión entre A y B también debe de permanecer abierta.

La idea de los agentes móviles es reemplazar la llamada de prodecimiento remota enviando un agente para hacer los cálculos. De esta manera en lugar de inconvar un método, el proceso A envía un programa (un agente móvil) al proceso B. Este programa interactua con el proceso B. Cuando el agente completa sus interacciones, devuelve al proceso A los resultados requeridos. Durante la operación, solamente el tiempo que se usa para la transmisión de datos es el envío del agente al proceso B y la vuelta de dicho agente al proceso A con los datos requeridos cuando completa su tarea. Este modo es potencialmente más eficiente que si las mismas interacciones fuesen llevadas a cabo todas mediante conexiones de datos. Uno de los principales objetivos de Telescript era proporcionar un modo eficiente de controlar los recursos de las conexiones en dispositivos como PDAs, aprovechándolos lo máximo posible debido el elevado coste de las conexiones móviles a Internet (hoy podemos ver que se va normalizando).
Hay varias cuestiones técnicas que se planean cuando se consideran los agentes móviles:
Seriación
Cuando hablamos de seriación nos referimos a la capacidad de un objeto para almacenar y recuperar su estado mediante un mecanismo de almacenamiento. Una cuestión bastante importante es de qué forma es seriado el agente, y en particular, qué aspectos del agente son seriados: el programa, los datos o el programa y sus datos.
Alojamiento y ejecucción remota
Cuando el agente llega a su destino, como es ejecutado. Por ejemplo si el alojamiento original del agente emplea un sistema operativo o un procesador distinto del alojamiento del destinatario.
Seguridad
Cuando el agente del proceso A se envía a la máquina donde reside el proceso B , hay un potencial obvio para que el agente provoque problemas. Podría potencialmente hacerlo de diferentes maneras:
- Se puede obtener información leyendo ficheros alojados en la máquina remota o leyendo directamente la memoria RAM
- Se puede denegar servicios a otros procesos de la máquina remota
- Se puede malusar los recursos disponibles de la máquina remota
- Puede simplemente causar molestias a la máquina remota (jugar con los dispositivos externos, manejar la GUI, …)
La cuestión de seguridad predomina en las discusiones de agentes móviles. Java es un lenguaje que arregla algunos agujeros. Por ejemplo, Java no tiene punteros, así que es intrínsecamente complicado que una aplicación en Java pueda acceder a un proceso que se encuentra en memoria. Además, las máquinas virtuales de Java poseen una clase llamada SecurityManager que permite establecer una política de seguridad (accesos a recursos, …). Sin embargo, es muy dificil asegurarse que (por ejemplo) un proceso no use más de un cierto número de ciclos del procesador.
Más información | Wikipedia
Más información | Seven good reasons for Mobile Agents (PDF)