lunes, 25 de junio de 2012



UNIDAD 3 PROCESOS Y PROCESADORES EN SISTEMAS

DISTRIBUIDOS.


3.1 Procesos y procesadores conceptos básicos.


Procesos


Un proceso es un programa en ejecución. Todos los procesos tienen asociados un espacio de direcciones en memoria, registros y el contador de programas.




· Un programa para poderse ejecutar necesita estar en memoria principal.


· Los procesos son dependientes del sistema operativo.


· El espacio de direcciones se compone además de direcciones para almacenar datos, código, la pila y el heap (montículo).


· Toda la información de los procesos en los SOs se guardan el PCB (Process Control Block) que es un arreglo o lista ligada que indica la descripción de cada uno de los procesos.


· Los procesos tienen asignados un identificador de procesos (PID), el cual es la forma en que el SO trabaja con los procesos.


· La finalidad del administrador de procesos es realizar una buena administración (planificación) del tiempo de CPU.


Los procesos presentan tres estados básicos: Ejecución, Listo y Bloqueado.


· Un proceso está en ejecución cuando tiene acceso real al tiempo de CPU.


· Un proceso está listo cuando se puede ejecutar, es decir, por algún motivo se suspendió para dejar ejecutar otro proceso.


· Un proceso está bloqueado cuando está en espera de algún recurso (E/S) o de que ocurra un evento.


Estos procesos pueden trabajar de manera cooperativa para la resolución de un problema muy particular. Para ello necesitan comunicarse entre sí y a lo que a nivel de SO se llama IPC (Inter Process Communication). La parte más importante de la comunicación entre procesos es sin duda la transferencia de mensajes entre los diversos procesos.


IPC


· La transferencia de mensajes puede llevarse acabo en base a dos primitivas, enviar y recibir, que se pueden aplicar a casi cualquier recurso como a los archivos (leer y escribir).


· La comunicación entre procesos IPC se debe dar a través del kernel del Sistema Operativo.


· Un procesador o mejor conocido como microprocesador es la unidad de hardware que se encarga de procesar los datos que están almacenados en una computadora para producir cualquier tipo de información de interés para los usuarios.


· Un microprocesador se compone de una Unidad Lógica-Aritmética (ALU) que se encarga de las operaciones básicas dadas a través de microprogramación.


· También se compone de una unidad de control encargada de la sincronización de todas las operaciones y de áreas de almacenamiento principal llamadas registros y memoria caché.


· La problemática principal es que existe una confusión muy amplia entre lo que es un sistema distribuido, un sistema multiprocesamiento, un sistema paralelo, etc.




Clasificación de SD


· Una de las clasificaciones más aceptadas es la de Flynn, la cual se basa en dos características esenciales: el número de flujos de instrucciones y el número de flujo de datos. La clasificación es la siguiente:


o Una computadora con un sólo flujo de instrucciones y un flujo de datos (SISD, Single Instruction Single Data). Computadoras con monoprocesador.


o Computadoras con un flujo de instrucciones y varios flujos de datos (SIMD, Single Instruction Multiple Data). Procesadores vectoriales.


o Computadoras con múltiples flujos de instrucciones y varios flujos de datos (MIMD, Multiple Instruction Multiple Data). Concepto de SD (no implementada como tal)


Los sistemas MIMD se subdividen en dos grupos:


· Máquinas multiprocesadores. Existe un espacio de direcciones virtuales, compartido por todos los CPU del sistema.


· Sistemas multicomputadoras. Cada máquina tiene su propia memoria en particular.


· Las categorías anteriores puede clasificarse de acuerdo a la red de comunicación con la que se interconectan los CPU, en las siguientes categorías:


o Tecnología de bus


o La tecnología de conmutador


Otras clasificaciones de SD.


· En todos los sistemas de equipo de cómputo, algunas máquinas están fuertemente acopladas, mientras que otras están débilmente acopladas.


· A continuación se muestran cuatro categorías de sistemas de cómputo, en base al acoplamiento y tipo de conexión.


o Multiprocesadores con base en buses.


o Multiprocesadores con conmutador.


o Multicomputadoras con base en buses.


o Multicomputadoras con conmutador.


En base al acoplamiento del software con el hardware los SD se dividen en:


· Software débilmente acoplado en hardware débilmente acoplado. LAN


· Software fuertemente acoplado en hardware débilmente acoplado (multicomputadoras). SD


· Software fuertemente acoplado en hardware fuertemente acoplado. Sistemas Tiempo Compartido y Servidores Dedicados.


· La distribución del cómputo puede realizarse de diversas formas de acuerdo a su grado de acoplamiento en:


o Fuertemente acopladas: Multiprocesadores (memoria compartida). UMA (Uniform Memory Acces)


o Débilmente acopladas: Multicomputadoras (memoria privada). NUMA (Non Uniform Memory Access)


Sistemas multiprocesadores


· Son sistemas que tienen dos o más procesadores (CPU), comparten las misma memoria (espacio de direcciones).


· Los sistemas multinúcleos es la nueva tendencia en el desarrollo de sistemas multiprocesadores. En un solo chip se tienen varios procesadores (no es nada nuevo bajo el sol).


Sistemas multicomputadoras


· Son sistemas donde cada unidad de proceso es autónoma e independiente de las demás pero trabajan de manera conjunta.


· La interconexión de unidades de proceso se hace a través de redes de computadora de preferencia de altas velocidades.


· Este es el concepto más estandarizado de un SD.


3.2 Hilos y multihilos.


Concurrencia.


El término concurrencia indica que se tienen dos o más procesos al mismo tiempo en el mismo lugar; esto no implica que se estén ejecutando al mismo tiempo (paralelismo). El término concurrencia se ha utilizado para indicar que se ejecutan dos o más actividades quasi-paralelamente. En sistemas monoprocesadores esto se logra a través de esquemas de multitarea real y cooperativa.


“Granularidad” del paralelismo


Cuando queremos explotar el paralelismo, podemos hacerlo en niveles de detalle distintos:


· Instrucciones de máquina


· Sentencias de un lenguaje de programación


· Módulos dentro de un programa


· Programas ejecutables completos


· Grano fino à grano grueso


· El programador debe saber con qué “grano” debe trabajar ante cada problema y no trabajar en niveles de detalle inferior.


Ej. si trabajamos con Ada o Java, estamos en el nivel de “módulos”:


· Concurrencia basada en hilos (threads)


· no deberíamos perder el tiempo buscando sentencias simples que se pueden ejecutar en paralelo à crear un hilo nuevo para ejecutar una única instrucción no hace ganar tiempo, incluso puede tardar más.


¿Dónde se encuentra la concurrencia?
En el hardware (la herramienta para construir sistemas informáticos):


· ejecución paralela de instrucciones


· funcionamiento paralelo de los periféricos


· procesadores múltiples


· sistemas distribuidos


· En la Naturaleza (los sistemas que modelamos cuando hacemos ingeniería de software)






¿ejemplos? Concurrencia inherente o potencial


Concurrencia inherente:


· Hay sistemas que en los que forzosamente se dan actividades simultáneas.


· p.ej. GUI; red de cajeros automáticos; 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…


Terminación de procesos.


· Cuando un proceso termina devuelve un valor de retorno al proceso padre.


· Todos los procesos tienen un proceso padre. Este código de retorno puede ser consultado a través de la variable de entorno


· La forma más fácil de salir es devolver un código de retorno (e.g., return 0).


· Otra forma de salir es a través de exit(), realiza aparentemente el mismo comportamiento, ayuda a desbloquear procesos en espera.


· La función atexit() permite definir una función que se ejecutará al finalizar un programa.


· Un proceso huérfano es aquel que se ha quedado sin padre.


· Un proceso zombi es aquel que se ha quedado ocupando una posición de la tabla de descriptor de procesos.


· En algunas ocasiones un proceso padre necesita esperar a que sus hijos termine. Para ello necesita sincronizarse los procesos.


Variables de entorno.


En algunos casos es necesario compartir algunos valores entre aplicaciones, esto se puede hacer a través de la variable de entorno. Las variables de entorno pueden verse con el comando env (ambiente). Muchos comandos muestran información a través de este entorno. Hay algunas variables disponibles en la mayoría de los sistemas como HOME, SHELL, TERM, PATH.


Hilos.


Son procesos ligeros ya que no se duplican completamente, sólo duplican su segmento de código. Por tal motivo, comparten datos fácilmente, la desventaja es que ocurren muchos problemas del tipo “race conditions”, pero al igual que IPC se soluciona con mecanismos como regiones críticas, zonas de exclusión mutua, etc.


Los hilos son procesos ligeros a diferencia de los procesos hijos, los hilos sólo replican el segmento de código, por lo que comparten datos entre otros hilos haciendo mejor uso de la memoria.


La problemática 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.


· Threads Implementation


· Web Server Process


· PThreads (POSIX Threads) es la biblioteca para la creación de hilos más 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


Los hilos no están tan extendidos por que existen muchas variantes: hilos mach, hilos solaris, Gthreads, etc.


En general los hilos en Java debido a su portabilidad binaria son idénticos en todas las plataformas. Existen dos formas básicas de implementar procesos: heredar de la clase Thread o bien implementar la interfaz Runnable. En general en el método public void run() se agrega la funcionalidad del hilo.

3.3 Modelos de procesadores.


Modelos de Procesadores


En un sistema distribuido, con varios procesadores, un aspecto fundamental del diseño es cómo se los utiliza. Los procesadores distribuidos se pueden organizar de varias formas:


· Modelo de estación de trabajo.


· Modelo de la pila de procesadores.


· Modelo híbrido.


· De estación de trabajo.


· De pila de procesadores.


· Híbrido.


El sistema consta de estaciones de trabajo (PC) dispersas conectadas entre sí mediante una red de área local (LAN). Pueden contar o no con disco rígido en cada una de ellas.


Los usuarios tienen:


· Una cantidad fija de poder de cómputo exclusiva.
–Un alto grado de autonomía para asignar los recursos de su estación de trabajo.


Uso de los discos en las estaciones de trabajo:


Sin disco:


· Bajo costo, fácil mantenimiento del hardware y del software, simetría y flexibilidad.


· Gran uso de la red, los servidores de archivos se pueden convertir en cuellos de botella.


Con disco:


· Disco para paginación y archivos de tipo borrador:


· Reduce la carga de la red respecto del caso anterior.


· Alto costo debido al gran número de discos necesarios.


Los aspectos clave en el uso de las estaciones de trabajo inactivas son:


· ¿Cómo encontrar una estación de trabajo inactiva?.


· ¿Cómo lograr que un proceso remoto se ejecute de forma transparente?.


· ¿Qué ocurre si regresa el poseedor de la máquina?.


Generalmente se considera que una estación de trabajo está “inactiva” cuando se dan ambas condiciones:


· Nadie toca el ratón o el teclado durante varios minutos.


· No se ejecuta algún proceso iniciado por el usuario.


· Los algoritmos para localizar las estaciones de trabajo inactivas se pueden dividir en dos categorías: Controlados por el servidor y Controlados por el cliente.


La localización de estaciones de trabajo en sí no es problemático, el problema radica en la sincronización de procesos entre las diferentes estaciones de trabajo.


Modelo de Pila de Procesadores


· Se dispone de un conjunto de cpu que se pueden asignar dinámicamente a los usuarios según la demanda.


· Los usuarios no disponen de estaciones de trabajo sino de terminales gráficas de alto rendimiento.


· No existe el concepto de propiedad de los procesadores, los que pertenecen a todos y se utilizan compartidamente.


· Este modelo basa su funcionamiento en la teoría de colas.


· En general este modelo puede reducir significativamente el tiempo de espera al tener una sola cola de procesadores a repartir.


· La capacidad de cómputo se puede gestionar de mejor forma si se tiene micros con mayores capacidades.


Modelo Híbrido


Combina las mejores características del modelo de estación de trabajo y de pila de procesadores teniendo un mejor desempeño en las búsquedas y mejor uso de los recursos.


3.4 Asignación de procesadores.

Son necesarios algoritmos para decidir cuál proceso hay que ejecutar y en qué máquina.


Para el modelo de estaciones de trabajo:


· Decidir cuándo ejecutar el proceso de manera local y cuándo buscar una estación inactiva.


Para el modelo de la pila de procesadores


· Decidir dónde ejecutar cada nuevo proceso.


Modelos y algoritmos con sus aspectos de diseño e implantación.


Generalmente se utilizan las siguientes hipótesis:


Todas las máquinas son idénticas (o al menos compatibles en el código); difieren a lo sumo en la velocidad.


Cada procesador se puede comunicar con los demás.

Existen dos estrategias de asignación:


No migratorias:


Una vez colocado un proceso en una máquina permanece ahí hasta que termina.


Migratorias:


o Un proceso se puede trasladar aunque haya iniciado su ejecución.


o Permiten un mejor balance de la carga pero son más complejas.


o Los algoritmos de asignación intentan optimizar:


Uso de las cpu:


o Maximizar el número de ciclos de cpu que se ejecutan para trabajos de los usuarios.


o Minimizar el tiempo de inactividad de las cpu.


Tiempo promedio de respuesta:


o Minimizar no los tiempos individuales de respuesta sino los tiempos promedio.


Los algoritmos de asignación intentan optimizar.
Uso de las cpu:
–Maximizar el número de ciclos de cpu que se ejecutan para trabajos de los usuarios.
–Minimizar el tiempo de inactividad de las cpu.
Tiempo promedio de respuesta:
–Minimizar no los tiempos individuales de respuesta sino los tiempos promedio.
Tasa de respuesta:
–Minimizar la tasa de respuesta, que es el tiempo necesario para ejecutar un proceso en cierta máquina dividido por el tiempo que tardaría en cierto procesador de referencia. Los principales aspectos a tomar en cuenta en el diseño de algoritmos de asignación de procesos son los siguientes:


o Algoritmos deterministas vs. heurísticos.


o Algoritmos centralizados vs. distribuidos.


o Algoritmos óptimos vs. subóptimos.


o Algoritmos locales vs. globales.


o Algoritmos iniciados por el emisor vs. iniciados por el receptor.


En general son muchos aspectos que se deben considerar para la generación de algoritmos de asignación de procesadores, por ejemplo, que el micro este conciente de su carga de trabajo implica una serie de mediciones que pueden ser realmente inciertas. Los algoritmos de asignación en primera instancia deben buscar la estabilidad del sistema.

3.5 Coplanificación.


Planificación de Procesos


La planificación de procesos es la etapa más importante del administrador de procesos ya que se encarga de administrar la disponibilidad del uso de CPU. Los planificadores no importando su complejidad deben respetar los siguientes elementos: equitatividad, eficiencia, tiempo de respuesta, retorno, volumen de producción.


La problemática con este tipo de administración es que los recursos son únicos e imprendecibles. Por este motivo el planificador trata de estimar algunas características.


Un planificador no sabe cuanto tiempo tardará en ejecutarse un proceso y si este en algún momento se bloquea por alguna petición de entrada o de salida.


Por este motivo un planificador debe de asignar un tiempo predeterminado llamado Quantum para la ejecución de procesos. Un proceso puede ser interrumpido por otro proceso cuando este último requiera de una atención inmediata. Esto da origen a planificadores de prioridades.


El planificador de procesos se encarga de mantener el contexto de cada una de las aplicaciones para poder realizar multitarea.


Existen diversos algoritmos de planificación de tareas:


o El algoritmo de round robin (torneo)


o Planificación por prioridad


o Colas múltiples


o Planificación de Procesos


o Primero el trabajo más corto


o Planificación garantizada


o Planificación por loteria


o Planificación por niveles


En los Sistemas Distribuidos, generalmente cada micro hace su propia administración local. Después de tener un modelo de procesamiento y de un algoritmo de asignación de procesadores, el siguiente gran reto es la administración conjunta de los tiempos de uso de CPU de los procesos de forma global. Para poder realizar esto, se necesita de algoritmos de planificación y métodos de comunicación más eficiente. A continuación se describen algunos algoritmos de coplanificación.


El algoritmo de Ousterhout toma en cuenta los patrones de comunicación entre los procesos durante la planificación. Debe garantizar que todos los miembros del grupo se ejecuten al mismo tiempo.


Se emplea una matriz conceptual donde:Las filas son espacios de tiempo.Las columnas son las tablas de procesos de los procesadores. Cada procesador debe utilizar un algoritmo de planificación Round Robin. Todos los procesadores ejecutan el proceso en el espacio “0” durante un cierto período fijo.Todos los procesadores ejecutan el proceso en el espacio “1” durante un cierto período fijo, etc.


Se deben mantener sincronizados los intervalos de tiempo. Todos los miembros de un grupo se deben colocar en el mismo número de espacio de tiempo pero en procesadores distintos.


A continuación se describe un cómputo paralelo y coplanificación de procesos.


¿Es el cómputo paralelo un sistema distribuido? Sí y No. Depende de la implementación.




Los objetivos de la programación en paralelo de acuerdo con son:


· Reducir el tiempo de procesamiento utilizado por un algoritmo convencional


· Reducir la complejidad del algoritmo


· Se trata de aprovechar mejor el hardware.


Cómputo Paralelo


· Analogía con el Tráfico de una Autopista ¿Qué se puede lograr con el paralelismo?


Planificación del Sistema Operativo


El problema del paralelismo radica en que muchos algoritmos no pueden paralelizarse (son serializable o secuenciales). Existen dos tecnologías para realizar paralelismo:
–PVM (Parallel Virtual Machine)
–MPI (Message Parking Interface)


3.6 Tolerancia a fallos.

Tolerancia a Fallas


La tolerancia a falla en sistemas con multiprocesamiento puede lograrse a través de una buena sincronización entre procesos (IPC). Los IPC de POSIX son: cola de mensajes, tuberías, semáforos y memoria compartida (discutida en la siguiente unidad). Los IPC se ejecutan a nivel de kernel y no a nivel de usuario.


Tuberías


Las tuberías nos permiten redireccionar el flujo de salida de un proceso para ser la entrada de otro. A nivel de comandos se puede realizar con el operador | (pipe). Por ejemplo ls –l | more, hace que la salida del comando –ls sea la entrada de more, por lo que se verá pantalla por pantalla la información.


Al dejar de utilizar una tubería, esta se debe de cerrar en sus dos extremos: close(pipe). Por un extremo de la tubería se lee, y por el otro se escribe. Ya depende de la lógica del programa ubicar que lado escribe y que lado lee.


Las tuberías no son bidireccionales, sólo van en un sentido, pero se pueden utilizar dos tuberías para pasar mensajes en ambas direcciones. Las tuberías utilizadas sólo están disponibles para los descendientes de un proceso que lo crean. Por este motivo, no están disponible para otros procesos.


Las tuberías entre procesos iguales se les llama sin nombre. El otro tipo de tuberías tienen nombre y generalmente se les llama FIFO. Las tuberías con nombre se manejan igual que las tuberías sin nombre con la salvedad de que presentan un nombre que ocupa una entrada de directorio. Se trabajan igual que un archivo sólo que se bloquea cuando un proceso escribe en la tubería. Las comunicaciones vistas hasta ahora son half-duplex. Se puede utilizar un poll o select para realizar comunicación full-duplex




Semáforos


Los semáforos son mecanismos que permiten sincronizar procesos. Todos los mecanismos IPC tienen una entrada en una tabla especial con una llave definida por el usuario.


· Es un mecanismo para prevenir colisiones cuando uno o más procesos solicitan simultáneamente un recurso.


· Dijsktra los define como un objeto tipo entero en los cuales se puede aplicar dos operaciones: P (Proberen, comprobar) y V (Verhogen, incrementar), donde P sirve para obtener el recurso y V para liberarlo.


· Las operaciones sobre un semáforo son semget para crear un semáforo o habilitar uno existente, semctl para realizar operaciones de control e inicialización, semop para realizar operaciones P y V.


Colas de mensajes.


La filosofía de las colas de mensajes es similar a las tuberías, pero con mayor versatilidad.


Una cola es una estructura de datos gestionada por el kernel, en la cual varios procesos pueden escribir sobre ella. El sincronismo para evitar colisión lo realiza el kernel.


3.7 Sistemas distribuidos de tiempo real.


Sistemas de tiempo real


Son sistemas para poder ejecutar satisfactoriamente tareas que han de completarse en un plazo prefijado de tiempo (ej. sistemas de control industrial, sistemas multimedia, sistemas de misión crítica).


Se caracterizan porque los procesos tienen que ejecutar en instantes predeterminados.


Clasificación de STR


Existen dos tipos de STR:


Crítico (rígido): para tareas que siempre deben cumplir los plazos de terminación. Adecuados para la industria. Muy simples, incompatibles con tiempo compartido, memoria virtual, etc.


No crítico (flexible): intentan cumplir los plazos, pero no los garantizan al 100%. Adecuados para multimedia, etc.


Sistemas Embebidos de TR


Aplicaciones de los STR


· Dominio Industrial


· Controlador de la planta


· Robot para tratamiento de material peligroso


· Uso militar


· Sistema de reconocimiento de blancos automático


· Sistema de guiado de misiles y navegación


· Sistemas altamente críticos


· Plantas nucleares


· Sistemas de aviónica


Sistemas de Tiempo Real


Los tipos de tiempo pueden ser:


· Los de plazo fijo se ejecutan una vez en un instante determinado.


· Los periódicos se ejecutan cada cierto tiempo.


Los sistemas en tiempo real críticos tienen asignada una franja de tiempo que no pueden rebasar. Suelen tener pocos procesos en estado de listo a fin de que no se retrase la ejecución de los mismos. Se introducen retardos en la ejecución, como puede ser la memoria virtual, puesto que la paginación puede producir retrasos inadmisibles para el proceso.


Los STR son altamente tolerante a fallas manejados por el sistema.


Arquitecturas de Tiempo Real


Ejemplo de un sistema en tiempo real.


Solucion Ciclica.


Solucion Concurrente.


Sistemas Distribuidos de TR


Son totalmente más complejos debido a la gran heterogeneidad de sus componentes.


Debido a esta problemática son poco los Sistemas Operativos Distribuidos de Tiempo Real aunque muchos SO de Tiempo Real (ej. SO de dispositivos empotrados) tienen capacidad de comunicación distribuida.


Sistemas Operativos de TR


El problema de la distribución radica en los tiempos de latencia de los mecanismos de comunicación distribuida (sockets, RPC, middlewares, etc.) dado que no hay una garantía de servicio y más si se enfoca en redes públicas como la Internet.


En la práctica la gran mayoría de los Sistemas Operativos Distribuidos de Tiempo Real se llegan a implementar en sistemas multiprocesadores. La mayoría de los sistemas operativos distribuidos de tiempo real caen en el área de multimedia (QNX) y de los sistemas empotrados (Symbian). Los sistemas de navegación son otro claro ejemplo de SOTR.


SOD de Tiempo Real


Estos sistemas deben de ser totalmente determinísticos y predecibles.


Otro tópico que es un gran reto en este tipo de sistema es la seguridad y en específico el control de acceso.


El balanceo de cargas de trabajo es de suma importancia para el uso eficiente del sistema La concurrencia y sincronización de procesos es aún más complicada (un recurso que es utilizado por un proceso debe de ser liberado automáticamente para que otro proceso más crítico pueda trabajar inmediatamente).


La selección de hardware es más compleja.


La caracterización (medición de tiempos) de estos sistemas es compleja y no muy exacta.


El uso de SOD de Tiempo Real tiene que ser manejado con las aplicaciones, ya que de lo contrario no tendría una utilidad práctica; por este motivo, es necesario la adaptación de herramientas como: compiladores, utilerías, base de datos y software de sistema.



Referencias
Liberty, Jesse, Horvarth, David (200). Aprendiendo C++ para Linux en 21 Días. México, Prentice Hall.
Márquez, Francisco (1994). Unix Programación Avanzada. Estados Unidos, Addison-Wesley.
Referencias
Colouris, George, Dollimore, Jean, Kindberg, Tim (2001). Sistemas Distribuidos Conceptos y Diseño. 3a. Edición. España, Pearson Addison-Wesley.
Horstmann, Cay, Cornell, Gary (2006). Core Java 2 Volumen II Carácterísticas Avanzadas. España, Perason Prentice Hall.
Referencias
Deitel, Harvey, Deitel, Paul (2004). Java Como Programar. Quinta Edición. México, Pearson Prentice Hall.
Márquez, Francisco (2004). UNIX Programación Avanzada. Tercera edición, México, Alfaomega Ra-Ma.
Referencias
Froufe, Agustín, Jorge, Patricia (2004). J2ME Java 2 Micro Edition Manual de usuario y tutorial. México, Alfaomega.
Firtman, Maximiliano (2004). Programación de celulares con Java. Argentina, MP Ediciones.
Ruíz, Diego (2005). C# La guía total del programador. Argentina, MP Ediciones.
Referencias
Tanenbaum, Andrew (1996). Sistemas Operativos Distribuidos. México, Prentice Hall.
 Tanenbaum, Andrew, Van Steen, Maarten (2006).  Distributed Systems Principles and Paradigms. Estados Unidos, Pearson Prentice Hall.
Mejía, P. (2009), Curso de Sistemas de Tiempo Real, CINVESTAV, México.
Referencias
J. Senn, “Análisis y Diseño de Sistemas de Información”, 2da. Edición, McGraw-Hill, México, 1992, ISBN: 968-422-991-7.
A. Tanenbaum, et al., “Sistemas Operativos. Diseño e implementación”, 2da. Edición, Prentice Hall, México, 1998, ISBN: 970-17-0165-8.
Aguas, N. (2009) Procesos y Procesadores en Sistemas Distribuidos.