Documentos de Académico
Documentos de Profesional
Documentos de Cultura
“Un sistema distribuido es aquel que se ejecuta en una colección de máquinas enlazadas
mediante una red pero que actúa como un único procesador virtual.”
Transparencia:
Flexibilidad:
Desempeño:
Claves y problemas:
Heterogeneidad
o Diferentes redes de comunicación
o Diferentes sistemas operativos
o Diferente hardware
o …
Extensibilidad
o Necesidad de publicar los interfaces
o Integración de componentes creados por diferentes programadores
Seguridad
o Proporcionar una protección adecuada: encriptación
o Mantener el secreto de la información que se transmite
o Evitar los ataques que deniegan el servicio
Escalabilidad
o El coste de añadir un nuevo usuario debe ser constante
Tratamiento de fallos
o Un proceso, un nodo, la red, etc. Pueden fallas de forma independiente
Concurrencia
o Los S. D. son fuentes de peticiones concurrentes
Transparencia
o Muchos aspectos deben aparecer ocultos al programador
o No debemos preocuparnos de la ubicación ni de los detalles de los accesos a
los recursos
La CPU utiliza el valor de PC para determinar cuál es la siguiente instrucción por ejecutar:
Entonces, si entendemos los threads como una extensión del proceso, podemos “mezclar” los
threads, para ejecutar diferentes procesos, dando así al CAMBIO DE CONTEXTO, el cual es
realizado por el SO.
Utilizar los threads para conseguir paralelismo con baja sobrecarga en la aplicación y en el
sistema, sin embargo, aparecen problemas causados por la concurrencia.
Aun así, con esto ganamos el que podamos evitar los cambios de contexto, es decir, aunque
sólo se esté ejecutando una instrucción a la vez, a efectos prácticos se están ejecutando varios
programas simultáneamente.
Multiprocesamiento simétrico
Más de un thread permiten aprovechar el hardware al máximo, además, la mayoría de los SO y
algunas aplicaciones requieren de este tipo de técnicas para su funcionamiento.
Podemos dar muchos usos a los threads, como evitar esperas activas, para simplificar
problemas de la programación. Aunque tenemos problemas de concurrencia puesto que
comparten los recursos de su entorno.
En conclusión, mucho cuidado con las condiciones de carrera en threads, pueden darse muy
fácilmente y causar problemas muy difíciles de depurar.
El estándar POSIX, para la creación de threads
Permite crear threads de forma transparente al usuario, con llamadas al sistema para creación
y destrucción dinámica de threads, mecanismos para la exclusión mutua, contiene también
llamadas al sistema para el manejo de variables condición. En resumen, todo lo que
necesitamos para gestionar la concurrencia de forma eficiente.
Funciones:
Todos los threads comparten el espacio de direcciones del proceso, pueden modificar
variables globales, acceder a descriptores de ficheros abiertos por el proceso y los threads
existentes pueden interferir entre ellos.
A nivel de kernel, se reconocen como una entidad a gestionar por el scheduler (como si un
proceso se tratara), compiten por los recursos a nivel de sistema, no de proceso, sin embargo,
compartir datos y sincronizarlos es menos costoso, pero su coste general es más alto.
Después tenemos los threads híbridos, que tienen las ventajas de ambos, que se implementan
partiendo de los threads de usuario, pero se configuran las unidades de planificación de kernel
se asocian a este, transformándolos en entidades manejadas por el kernel durante la ejecución
del proceso. El cómo se gestionan depende de la implementación.
Threads en Solaris
En solaris, los threads de usuario son threads y los de kernel, procesos ligeros. Su configuración
puede ser muy variada:
Threads de POSIX.1c
Tiene un modelo de soporte híbrido, soportando tanto threads a nivel de usuario como de
kernel.
Su modelo tiene dos niveles de scheduling, separando threads y las demás entidades de kernel
Los threads son análogos a los threads de usuario, mientas que las entidades de kernel son
manejadas por el scheduler a nivel de kernel.
Cada thread tiene asociado un objeto atributo con sus propiedades, pudiendo este estar
asociado a múltiples threads.
ATRIBUTOS:
- pthread_attr_init: inicializa el objeto atributo del thread con los valores por defecto
- pthread_attr_destroy: Invalida los valores del objeto atributo del thread
o Se puede examinar y alterar de un thread su pila y dirección de pila con:
pthread_attr_setstacksize
pthread_attr_setstackaddr
pthread_attr_getstacksize
pthread_attr_getstackaddr
- pthread_attr_setdetachstate y pthread_attr_getdetachscte
o Permiten modificar y examinar el atributo detachstate de un thread
o Este puede tener estos valores
PTHREAD_CREATE_JOINABLE: Se puede esperar su terminación
mediante la función pthread_join (default)
PTHREAD_CREATE_DETACHED: No se puede esperar su terminación
(está desanclado), para liberar sus recursos se deberá llamar a
pthread_detach
- Pthread_attr_setscope y pthread_attr_getsocpe
o Permiten alterar y examinar el contentionscope (MENCIONADO
ANTERIORMENTE)
PTHREAD_SCOPE_PROCESS
PTHREAD_SCOPE_SYSTEM
- Pthread_setincheritsched y pthread_getinheritshced
o Modifican o examinan el atributo inheritsched que controla los parámetros de
scheduling:
Pueden ser heredados del thread creador: PTHREAD_INHERIT_SCHED
Deben se explícitamente especificados: PTHREAD_EXPLICITI_SCHED
- Pthread_attr_setschedparam y pthread_attr_getschedparam
o Modifican u obtienen la estructura de datos de sctruct sched_param
o La política se scheduling se almacena en el miembro sched_policy de la
estructura struct shced_param
o Sched_policy puede tener valores
SCHED_FIFO
SCHED_RR
SCHED_OTHER
- Pthread_attr_setschedpolicy y pthread_attr_getshcedpolicy
o Permiten cambiar u obtener el miembro sched_policy de la estructura de
datos struct sched_param asociada al scheduling del thread
Tema 2: Modelos de Sistemas Distribuidos
“Un sistema distribuido es aquel en el que los componentes hardware y software localizados
en computadores, conectados en red, comunican y coordinan sus acciones únicamente
mediante el paso de mensajes.”
En este tema estudiaremos las partes de un SD y la relación entre ellas teniendo en cuenta que
está vinculadas con la red de computadores subyacentes.
Concurrencia global:
Los elementos del sistema se ejecutan realmente en paralelo
No existe un reloj común:
Afecta a cualquier aspecto de coordinación y mensajes
Fallos independientes:
Los modos de fallo del sistema pueden ser locales a un subconjunto de sus
componentes
Modelo Arquitectónico
Su función principal es simplificar y abstraer las funciones de los componentes individuales del
sistema. Para ellos debemos considerar:
Platform:
Middleware:
Servidor caché: Guardan objetos para que su acceso sea más rápido, poniéndose en medio en
la red para evitar “viajes de la información” más largos. Pueden estar ubicadas en los clientes o
en un servidor proxy compartido para diferentes tipos de servicios.
En el caso del código móvil, tenemos los applets, que tienen como ventaja una buena
respuesta interactiva, y como desventaja, que son una potencial brecha de seguridad en
nuestro sistema.
Agentes móviles
Entendemos por agente móvil como un programa en ejecución, que incluye código y datos que
se trasladan de un computador a otros a través de la red realizando una tarea.
Computadores de red
Clientes Ligeros
Hoy en día casi todos los dispositivos, sobre todo los móviles (celulares, tabletas, smartwatch,
etc.) permiten una conexión a una red sin cables. Esto requiere de un SERVICIO DE
DESCUBRIMIENTO, que admite usuarios y busca recursos.
Este servicio de descubrimiento ofrece una fácil conexión e integración a la red local,
perdiendo a cambio la seguridad de la conectividad, seguridad y privacidad (en cierto grado).
Objetos: Los procesos distribuidos que ofrecen servicios pueden ser construidos encapsulando
multitud de objetos. Las referencias a estos objetos se pasan a otros procesos para que se
pueda accedes a sus métodos mediante invocaciones remotas. Los objetos son DINÁMICOS.
El modelo arquitectónico: Requisitos de diseño para arquitecturas distribuidas
Entendemos como capacidad de respuesta como el tiempo que tarda un sistema en comenzar
un trabajo computacional.
En definitiva, podemos entender que cuantas menos capas de software tengamos mejor,
porque si no tenemos que repetir una y otra vez los dato que se pasan entre cada una de las
capas: los enlaces tienen coste. También podemos deducir que cuantos menos datos
transferidos mejor, estos resuelven en que cuantos menos datos y menos se tengan que repetir
estos, mejor.
En definitiva, influye el rendimiento de cada una de las capas de SW que interviene y la red que
los interconecta, viéndose está limitada por el nodo más débil de éstos (cuello de botella).
Tenemos la tolerancia a fallos, esto significa que las aplicaciones deben continuar funcionando
en presencia de fallos tanto hardware como software y también fallos de red.
Modelos de sistema
Presentando el entorno general tenemos un conjunto de procesos que se comunican unos con
otros mediante el envío de mensajes en una red de computadores
1. SD Síncronos, donde
a. El tiempo de ejecución de cada etapa de un proceso tiene límites superiores e
inferiores conocidos
b. Cada mensaje transmitido sobre un canal se recibe en un tiempo conocido
c. Cada proceso tiene un reloj local cuya diferencia al tiempo global es conocida
2. SD Asíncronos, donde no existen limitaciones sobre
a. La velocidad de proceso
b. Los retardos en la transmisión de mensajes
c. El reloj
En ambos tipos de SD, necesitamos un sistema que nos permita llevar una Ordenación de
eventos, donde es interesante saber cuándo ha ocurrido un evento en un proceso.
En un S. Distribuido puede fallar tanto la ejecución de los procesos como los canales de
comunicación. Tenemos diferentes clases de fallos:
- Por omisión
- Fallos arbitrarios
- Fallos de temporización
Se refiere a los casos en los que los procesos o canales de comunicación no consiguen llevar a
cabo su tarea. Distinguimos dos subtipos de fallos:
Fallos arbitrarios
Este tipo de fallos están principalmente dictados por las leyes de probabilidad y estadística.
Fallos de temporización
- La ejecución de un proceso
- En los repartos de los mensajes
Enmascaramiento de fallos
Los canales de comunicación pueden presentar fallos por omisión, pero se pueden construir
servicios de comunicación para enmascarar algunos de esos fallos
Protección de objetos
- Los procesos interaccionan enviando mensajes que viajan por la red, bajo un servicio
de comunicación abierto
- Los clientes y servidores son receptores de mensajes
Otras amenazas de un “enemigo”
- Autenticación
La base de la autenticación la forman el uso de los secretos compartidos y la
encriptación, se trata de incluir en un mensaje un fragmento encriptado que contenga
suficiente contenido del mensaje para garantizar su autenticidad.
- Canales seguros
Se trata de formar una capa de servicio sobre los servicios de comunicación existentes
mediante encriptación y autenticación
Cada proceso conoce bien a la identidad del proceso que solicita la ejecución de sus
servicios
Un canal seguro garantiza la privacidad y la integridad de la información transmitida
por él
Cada mensaje incluye una marca temporal para evitar el reenvía y para permitir la
ordenación de los mensajes
Ventaja
Ventaja:
- Son extensibles
- El modularidad es fácil de mantener
El soporte del sistema operativo: Funciones básicas del sistema operativo
- Gestor de procesos
Gestiona la creación y las diferentes operaciones sobre procesos
- Gestor de threads
Gestiona la creación, sincronización y planificación de threads
- Gestor de comunicaciones
- Gestor de memoria
Gestiona la memoria física y virtual
- Supervisor
Gestiona la resolución de interrupciones: Llamadas al sistema y excepciones
Controla la unidad de memoria y las caches, manipula la unidad de punto flotante y los
registros del procesador.
- El sistema Operativo
Facilita la encapsulación y protección de los recursos en los servidores
Soporta los mecanismos de invocación requeridos para el acceso a dichos recursos
(comunicación y planificación)
Dos niveles de ejecución para protección del sistema:
o A nivel de núcleo (kernel)
o A nivel de usuario
Proporcionar las abstracciones de los recursos físicos subyacentes:
o Comunicaciones
o Memoria
o CPU
o Dispositivos de almacenamiento
Sistemas operativos en Red vs. Sistemas Distribuidos
Los S. Distribuidos necesitan compartir sus recursos
Comunicación indirecta:
- Los mensajes son enviados y recibidos a través de mailboxes o puertos
A esto tenemos varias soluciones, como no permitir más de dos procesos por mailbox, permitir
que sólo se pueda hacer una receive a la vez o, permitir al sistema escoger quien de los dos
recibe el mensaje de forma arbitraria si P2 o P3, pero no ambos.
NOTA: TANTO RECEIVE COMO SEND PUEDEN SER BLOQUEADORAS O NO, ADEMÁS SEND
PUEDE SER POR COPIA O POR REFERENCIA
o Con capacidad 0
Los procesos deben sincronizarse para que la transferencia tenga lugar:
rendezvous – comunicación síncrona
o Con capacidad limitada (longitud máxima = n)
Relación Productor / Consumidor: el proceso que envía, si el enlace
está lleno, debe esperar
o Con capacidad ilimitada (sin longitud máxima)
El proceso que envía nunca debe esperar
Los enlaces de comunicación con capacidad no-nula tienen el problema de que el
proceso no sabe cuándo ha sido leído su mensaje, además, cuando ocurre un fallo
debe manejar las excepciones.
IPC en Unix: socket: La familia de protocolos TCP/IP
NOTAS:
Ahora discutiremos cómo funciona a diferentes niveles para llegar a un mejor entendimiento
Nivel de red: IP
- Proporciona un servicio sin conexión NO seguro
o No garantiza que todos los mensajes lleguen a su destino.
- Los mensajes no tienen por qué llegar en orden de envío
- IP acepta mensajes de cualquier tamaño < 64kb, los troceará si es necesario para
enviarlos
- Cada host de Internet debe tener una dirección de 32 bits única
Como programar una transferencia entre dos sistemas que sólo ofrecen IP
- Dos funciones, enviar y recibir, a las que pasaríamos las direcciones origen y destino
del mensaje
- Si el tamaño es grande, deberíamos trocear nuestro mensaje
- La aplicación debería estar preparada para reordenar los trozos a la llegada
- La aplicación debería tener algún método de detección y corrección de errores
- Hay que implementar algún método para identificar varios destinos dentro de una
máquina
Problema: Sincronización:
Esto se soluciona asegurando que una de ellas arranca su ejecución y espera indefinidamente
al contacto de la otra
Comunicación en grupo
Los mensajes multidifusión proporcionan una buena infraestructura para construir S.D.
Características:
- Tolerancia a fallos basada en servicios replicados:
o La solicitud de un cliente se dirige a todos los servidores para que realicen la
petición
o Necesitaremos que todos los servidores reciban las solicitudes de servicio en el
mismo orden
- Búsqueda de servidores en redes espontáneas:
o Los clientes pueden utilizar multidifusión para localizar servicios disponibles y
registrar sus interfaces
o La pérdida de una petición no representa un problema
- Los mensajes multidifusión proporcionan una buena infraestructura para construir SD
Buenas prestaciones en datos replicados:
o Cuando se produce una actualización de datos, se debe comunicar a los
procesos que mantienen las réplicas de datos mediante multidifusión
Propagación de las notificaciones de eventos:
o Sistema de noticias, cada vez que se produce una noticia, el sistema avisa a los
usuarios interesados
El Middleware
Def.- Capa de software cuyo propósito es enmascarar la heterogeneidad del sistema
subyacente y proporcionar un modelo de programación conveniente para los programadores
de aplicaciones
- Procedimiento remoto
- Comunicación entre un grupo de procesos
- Notificación de eventos
- Replicación de datos compartidos
- Transmisión de datos multimedia en tiempo real
Capas de Middleware
Ejemplos:
Características
ASCII 1 byte
Unicode 2 bytes
o Representación de enteros
big-endian
little-endian
- Evolución:
o RPC
o Invocación de métodos remotos en CORBA
o RMI en Java
Un proceso, cliente, para ejecutar una RPC envía un mensaje a otro proceso, servidor, y
después, esperará el resultado
El proceso servidor ejecutará el procedimiento remoto, extraerá los argumentos del mensaje,
realizará la llamada al procedimiento de forma local, obtendrá los resultados y los enviará en
otro mensaje al proceso cliente.
Notar que, los resguardos del cliente y del servidor se generan automáticamente a partir de la
interfaz escrita en algún IDL
Proceso de generación de una RPC en Unix
Notar que, los resguardos del cliente y del servidor son independientes de sus
implementaciones, sólo dependen del interfaz
La transferencia de parámetros en las RPC Unix
¿Qué problemas aparecen al empaquetar y desempaquetar los datos en las transferencias de
los mensajes?
- La representación de los datos puede ser distinta en las máquinas del cliente y del
servidor, por ejemplo, big-endian y little-endian
Solución:
- Utilizar una representación intermedia de los datos utilizando un estándar como por
ejemplo XDR: eXternal Data Representation
Enlace NO Persistente
- La conexión entre el cliente y el servidor se establece cada vez que se ejecuta una RPC
- Es ineficiente cuando el cliente ejecute muchas RPC de forma repetitiva
- Ventaja: los servidores pueden migrar de un procesador a otros y los clientes no se ven
afectados
Enlace Persistente
Notar que, la localización de los servicios es una tarea del resguardo del cliente
Notar que, existen servicios que permiten dar de baja un procedimiento en el servidor de
nombres
Semántica en presencia de fallos en las RPC en Unix
Problemas que presentan las RPC
Notar que, la semántica de las RPC determina qué ocurre cuando se repite una RPC
- Al menos una vez: garantizan con reintentos que la RPC se ejecuta al menos una vez
- A lo máximo una vez: no hay reintentos, puede que no se llegue a realizar la RPC ni
una sola vez
- Exactamente una vez: Se corresponde con las llamadas a procedimientos locales. Su
implementación es difícil en un S. Distribuido
Def.- Una operación es ídem potente si se puede repetir tantas veces como sea necesario sin
ocasionar ningún problema
Siendo:
Notar que, al nombre del procedimiento se le añade el número de versión, “V”, y el sufijo “svc”
CLIENTE *clnt_create ( char *host, u_long prognum, u_long vers_num, char * protocol );
Argumentos de la llamada:
El prototipo que debe emplear el cliente para las llamadas a procedimientos remotos es:
Notar que, las RPC de Sun utilizan los números de versiones para permitir que existen
servidores que ofrezcan los mismos servicios con interfaces distintas
Pasos para convertir llamadas locales en remotas
Protocolos de autenticación:
Sun RPC en sus mensajes proporcionan campos para la autenticación entre cliente y servidor
(responsable del control de acceso)
- Tipos:
o Ninguno
o Unix: uid y gid del usuario
o Se establece una clave compartida para firmar los mensajes RPC
o Autenticación Kerberos (MS)
rpcinfo
Informa sobre los servicios de RPC que están disponibles en un nodo dado
Son la extensión del modelo de llamadas a procedimientos remotos (RPC) con el modelo de
programación de objetos
Ejemplos:
- Transparencia en la ubicación
RPC, RMI y programas distribuidos basados en eventos no necesitan conocer la
ubicación del servidor
- Protocolos de comunicación
UDP y TCP
- Interfaz de servicio
Especifica los procedimientos que ofrece un servidor y define los tipos de argumentos
de entrada / salida para los procedimientos
- Interfaz remota
Especifica los métodos de un objeto disponible para su invocación por objetos de otros
procesos y define los tipos de argumentos de entrada / salida para cada método
El modelo de objetos
- Referencias a objetos
Se puede acceder a los objetos mediante las referencias del objeto
- Interfaces
Proporcionan la definición de un conjunto de métodos sin especificar su
implementación
- Acciones
Se inicia una acción en un objeto cuando se invoca a un método de otro objeto
Para iniciar una acción es necesaria la referencia del objeto
- Excepciones
Errores y condiciones inesperadas que pueden aparecer en un programa
En una RMI puede fallar tanto el proceso como el nodo
Los IDLs permiten lanzar excepción tanto a nivel de aplicación como a nivel de
distribución
- Compactación automática de la memoria
Es necesario proporcionar mecanismos de liberación del espacio ocupado por
aquellos objetos que ya no se necesitan
Se necesita mantener una cuenta de referencias
El modelo de objetos
- CORBA
Proporciona un IDL que permite definir interfaces remotas
Las clases de los objetos remotos y los programas cliente y servidor pueden
implementarse en cualquier lenguaje (C++, Java ,)
- Java RMI
Define las interfaces remotas igual que cualquier interfaz en Java y adquieren su
capacidad remota al extender la interfaz Remote.
- Módulo de comunicación
Realiza el protocolo de petición / respuesta entre el client e/ servidor
- Proxy
Permite que la invocación del método remoto sea transparente para los clientes
Se comporta como un objeto local y dirige el mensaje al objeto remoto
El cliente tiene un proxy para cada objeto remoto del que dispone su referencia
Un proxy ace de intermediario entre cliente y servidor
- Dispatch
Cada servidor tiene un dispatch para cada clase que representa a un objeto remoto
- Esqueleto
Implementa los métodos de la interfaz remota para cada clase de un objeto remoto
Desempaquetar los argumentos del mensaje de petición e invoca al método en el
objeto remoto
Empaqueta el resultado y las excepciones producidas en el mensaje de respuesta
- Ubicación de objetos
Un servicio de localización ayuda a los clientes a localizar los objetos remotos a partir
de sus referencias a objetos remotos
Introducción
- Java RMI extiende el modelo de objetos de Java para proporcionar soporte a objetos
distribuidos
- Un objeto conoce que su destino es remoto porque debe manejar Remote Exceptions
- La principal ventaja de utilizar las RMIs de Java es que las interfaces remotas se definen
en Java
- Debemos tener en cuenta el comportamiento de un objeto remoto en un entorno
concurrente
Interfaces remotas
- Se definen mediante la extensión de una interfaz denominada Remote que
proporciona el paquete java.rmi
- Los métodos deberían lanzar Remote Exception
Descarga de clases
- Ventajas
No es necesario que todos los usuarios presenten el mismo conjunto de clases en su
entorno de trabajo
Los programas clientes y servidores pueden hacer un uso transparente de instancias a
clases nuevas cuando se quieran añadir
- RMI registry
Es el enlazador para Java RMI
En cada nodo de servicios donde se alojen objetos remotos deberá haber un ejemplar
de RMI registry
La clase Naming de Java RMIregistry
void rebind (String name, Remote obj)
- Este método puede ser empleado por un servidor para registrar un objeto remoto
mediante su nombre
- Si el nombre ya está ligado a un objeto remoto, se lanza una excepción
- Este método es usado por los clientes para buscar un objeto remoto mediante su
nombre
String [] list()
- Este método devuelve una lista de Strings que contienen los nombres enlazados del
registro
Consta de un método main() y una clase sirviente para implementar cada una de sus interfaces
remotas.
El método main del servidor necesita crear un gestor de seguridad para que la seguridad de
java aplique la protección apropiada para un servidor RMI
Protege los recursos locales asegunrado que las clases que se descarguen desde
lugares remotos no tengan efecto algunos sobre ellos
El cliente
Los clientes proxy se generan mediante un compiladore denominado rmic desde las clases
compiladas del servidor y no desde la definición de la interfaz
Clases de Java que dan soporte a RMI
Notificación de eventos
Características de los S. Distribuidos basados en eventos
- Son heterogéneos
Posibilitan la interacción entre componentes del sistema que no han sido diseñados
con esa característica específica
- Son asíncronos
Las notificaciones de eventos son asíncronas