Unidad I Arquitectura de Un Sistema Distribuido
Unidad I Arquitectura de Un Sistema Distribuido
Unidad I Arquitectura de Un Sistema Distribuido
Ingeniería en computación
Asignatura:
Sistemas Distribuidos
Profesor:
Verónica Salas Jiménez
Grupo:
8CM22
Alumno:
Rodriguez Bernabé Edwin Alberto Ángel
Tres ejemplos de sistemas distribuidos son: internet, una red gestionada por una
organización y la computación móvil y ubicua.
Compartir los recursos es uno de los motivos principales para construir sistemas
distribuidos. Los recursos pueden ser administrados por servidores y accedidos por los
clientes o pueden ser encapsulados como objetos y accedidos por otros objetos clientes.
Los desafíos que surgen en la construcción de sistemas distribuidos son la
heterogeneidad de sus componentes, su carácter abierto, que permite que se puedan
añadir o reemplazar componentes, la seguridad y la escalabilidad, que es la capacidad
para funcionar bien cuando se incrementa el número de usuarios, el tratamiento de los
fallos, la concurrencia de sus componentes y la transparencia.
Existen redes de computadores en cualquier parte. Una de ellas es internet, como lo son
las muchas redes de las que se compone. Las redes de teléfonos móviles, las redes
corporativas, las de las empresas, los campus, las casas, redes dentro del coche, todas,
tanto separadas como combinadas, comparten las características esenciales que las
hacen elementos importantes para su estudio bajo el título de sistemas distribuidos.
Definiendo un sistema distribuido como aquel en el que los componentes hardware y
software, localizados en computadores unidos mediante red, comunican y coordinan sus
acciones solo mediante paso de mensajes. Esta definición sencilla cubre el rango
completo de sistemas en los que se utilizan normalmente computadores en red. Los
computadores que están conectados mediante red pueden estar separados
especialmente por cualquier distancia. Pueden estar en continentes distintos, en el mismo
edificio o en la misma habitación.
Inexistencia de reloj global: cuando los programas necesitan cooperar coordinan sus
acciones mediante el intercambio de mensajes. La coordinación estrecha depende a
menudo de una idea compartida del instante en el que ocurren las acciones de los
programas. Pero hay límites a la precisión con lo que los computadores en una red
pueden sincronizar sus relojes, no hay una única noción global del tiempo correcto.
Fallos independientes: todos los sistemas informáticos pueden fallar y los diseñadores de
sistemas tienen la responsabilidad de planificar las consecuencias de posibles fallos. Los
sistemas distribuidos pueden fallar de nuevas formas. Los fallos en la red producen el
aislamiento de los computadores conectados a el, pero no significa que detengan su
ejecución.
1.2 Características de un sistema distribuido
Confiabilidad: Permite que, en caso de que una computadora falle, otra la pueda sustituir
en la realización de sus tareas asignadas.
Repartición de la carga: Se debe analizar con qué equipos cuenta el sistema y los
diferentes recursos de cómputo en cada uno de ellos, como capacidad de disco, velocidad
de la red, etc. Los tipos de arquitectura a usar pueden ser:
• Servidores-estación de trabajo.
• Pila de procesadores.
• Modificación.
• Caché.
• Falla.
• Replicación.
• Interfaz de usuario.
• Reloj.
1.2.1 Heterogeneidad
Internet permite que los usuarios accedan a servicios y ejecuten aplicaciones sobre un
conjunto heterogéneo de redes y computadores. Esta heterogeneidad se aplica a todos
los siguientes elementos:
Redes
Hardware de computadores
Sistemas operativos
Lenguajes de programación
A pesar de que internet consta de muchos tipos de redes diferentes sus diferencias se
encuentran enmascaradas dado que todos los computadores conectados a este utilizan
los protocolos de internet para comunicarse una con otra. Los tipos de datos, como los
enteros, pueden representarse de diferentes formas en diferentes clases de hardware, por
ejemplo, hay dos alternativas para ordenar los bytes en el caso de los enteros. Hay que
tratar con estas diferencias de representación si se va a intercambiar mensajes entre
programas que se ejecutan en diferente hardware.
Los sistemas diseñados de este modo para dar soporte a la compartición de recursos se
etiquetan como sistemas distribuidos abiertos para remarcar el hecho de ser extensibles.
Pueden ser extendidos en el nivel hardware mediante la inclusión de computadores a la
red y en el nivel software por la instrucción de nuevos servicios y la reimplementación de
los antiguos, posibilitando a los programas de aplicación la comparación de recursos. En
resumen:
1.2.3 Seguridad
Seguridad del código móvil: el código móvil necesita ser tratado con cuidado.
Supongamos que alguien recibe un programa ejecutable (algún gusano o cualquier virus
informático) adherido a un correo electrónico: los posibles efectos al ejecutar dicho
programa son impredecibles; por ejemplo, pudiera parecer que presentan un interesante
dibujo en la pantalla cuando en realidad están interesados en el acceso a los recursos
locales, o quizás pueda ser parte de un ataque de denegación de servicio.
1.2.4 Escalabilidad
Control del coste de recursos físicos: cuando crece la demanda de un recurso, debería
ser posible extender el sistema, a un coste razonable, para satisfacerla. Por ejemplo, la
frecuencia con la que se accede a los archivos de una intranet que suele crecer con el
incremento del número de usuarios y computadores, debe de ser posible añadir
servidores para evitar el embotellamiento que aparece cuando un solo servidor de
archivos ha de manejar todas las peticiones de acceso a estos.
Detección de fallos: algunos fallos son detectables, por ejemplo, se pueden utilizar sumas
de comprobación (checksums) para detectar datos corruptos en un mensaje o un archivo.
Enmascaramiento de fallos: algunos fallos que han sido detectados pueden ocultarse o
atenuarse. Dos ejemplos de ocultación de fallos son:
2. Los archivos con datos pueden escribirse en una pareja de discos de forma que si
uno está deteriorado el otro seguramente está en buen estado.
Tolerancia de fallos: la mayoría de los servicios en internet exhiben fallos; es posible que
no sea practico para ellos pretender detectar y ocultar todos los fallos que pudieran
aparecer en una red tan grande y con tantos componentes. Por ejemplo, cuando un
visualizador web no puede contactar con un servidor web no hará que el cliente tenga que
esperar indefinidamente mientras hace sucesivos intentos; informara al usuario del
problema, dándole la libertad de intentarlo más tarde.
Redundancia: puede lograrse que los servicios toleren fallos mediante el empleo
redundante de componentes. El diseño de técnicas eficaces para mantener réplicas
actualizadas de datos que cambian rápidamente sin una perdida excesiva de prestaciones
es un reto.
1.2.6 Concurrencia
Tanto los servicios como las aplicaciones proporcionan recurso que pueden compartirse
entre los clientes en un sistema distribuido. Existe por lo tanto una posibilidad de que
varios clientes intenten acceder a un recurso compartido a la vez. El proceso que
administra un recurso compartido puede atender las peticiones de cliente una por una en
cada momento, pero esta aproximación limita el ritmo de producción del sistema
(throughput). Por esto los servicios y aplicaciones permiten usualmente, procesar
concurrentemente múltiples peticiones de los clientes.
1.2.7 Transparencia
• Transparencia frente a fallos permite ocultar los fallos dejando que los usuarios y
programadores de aplicación completen sus tareas a pesar de fallos de hardware
o de los componentes software.
Proxy: Es un servidor que se emplea como intermediario entre las peticiones de recursos
que realiza un cliente a otro servidor. Por ejemplo, si una computadora A solicita un
recurso a una computadora C, lo hará mediante una petición a la computadora B que, a
su vez, trasladará la petición a la computadora C. De esta manera, la computadora C no
sabrá que la petición procedió originalmente de la computadora A. Esta situación
estratégica de punto intermedio suele ser aprovechada para soportar una serie de
funcionalidades, como:
• Proporcionar caché.
• Control de acceso.
• Mejorar el rendimiento.
• Mantener el anonimato.
• Alto rendimiento.
• Alta disponibilidad.
• Escalabilidad.
• Balanceo de carga.
• Homogéneo.
• Semihomogéneo.
• Heterogéneo.
Arquitectura de capas
Una arquitectura de capa resulta familiar en los sistemas distribuidos y está relacionado
con la abstracción. Con este enfoque, un sistema complejo puede ser dividido en cierto
número de capas, donde las capas superiores hacen uso de los servicios ofrecidos por las
capas inferiores. De esta manera, una determinada capa ofrece una abstracción de
software, sin que las capas superiores o inferiores a esta deban de estar al tanto de los
detalles de implementación.
Todos los modelos de sistemas anteriores, aunque bien diferentes, comparten algunas
propiedades fundamentales. En particular, todos ellos se componen de procesos que se
comunican unos con otros mediante el envío de mensajes en una red de computadores.
En general un modelo contiene solamente aquellos ingredientes esenciales que
necesitamos para comprender y razonar sobre algunos aspectos del comportamiento del
sistema.
Modelo de fallo intenta dar una especificación precisa de los fallos que se pueden producir
en procesos y en canales de comunicación.
Las funciones relacionadas a la API sockets que permiten establecer una comunicación
entre dos computadoras son:
socket( )
Esta rutina se usa para crear un socket y regresa un descriptor correspondiente a este
socket. Este descriptor es usado en el lado del cliente y en el lado del servidor de su
aplicación. Desde el punto de vista de la aplicación, el descriptor de archivo es el final de
un canal de comunicación. La rutina retorna -1 si ocurre un error.
close( )
Indica al sistema que el uso de un socket debe de ser finalizado. Si se usa un protocolo
TCP (orientado a conexión), close termina la conexión antes de cerrarlo. Cuando el socket
se cierra, se libera al descriptor, por lo que la aplicación ya no transmite datos y el
protocolo de transportación ya no acepta mensajes de entradas para el socket.
bind( )
Suministra un número a una dirección local a asociar con el socket, ya que cuando un
socket es creado no cuenta con dirección alguna.
listen( )
Esta rutina prepara un socket para aceptar conexiones y solo puede ser usada en sockets
que utilizan un canal de comunicación virtual. Esta rutina se deberá usar del lado del
servidor de la aplicación antes de que se pueda aceptar alguna solicitud de conexión del
lado del cliente. El servidor encola las solicitudes de los clientes conforme estas llegan. La
cola de solicitudes permite que el sistema detenga las solicitudes nuevas mientras que el
servidor se encarga de las actuales.
accept( )
Esta rutina es usada del lado del servidor de la aplicación para permitir aceptar las
conexiones de los programas cliente. Después de configurar una cola de datos, el
servidor llama accept, cesa su actividad y espera una solicitud de conexión de un
programa cliente. Esta rutina solo es válida en proveedores de transporte de circuito
virtual. Cuando llega una solicitud al socket especificado accept( ) llena la estructura de la
dirección, con la dirección del cliente que solicita la conexión y establece la longitud de la
dirección, accept( ) crea un socket nuevo para la conexión y regresa su descriptor al que
lo invoca, este nuevo socket es usado por el servidor para comunicarse con el cliente y al
terminar se cierra. El socket original es usado por el servidor para aceptar la siguiente
conexión del cliente.
connect( )
Esta rutina permite establecer una conexión a otro socket. Se utiliza del lado del cliente de
la aplicación permitiendo que un protocolo TCP inicie una conexión en la capa de
transporte para el servidor especificado. Cuando se utiliza para protocolos sin conexión,
esta rutina registra la dirección del servidor en el socket, esto permite que el cliente
transmita varios mensajes al mismo servidor. Usualmente el lado cliente de la aplicación
enlaza a una dirección antes de usar esta rutina, sin embargo, esto no es requerido.
send( )
Esta rutina es utilizada para enviar datos sobre un canal de comunicación tanto del lado
del cliente como del lado servidor de la aplicación. Se usa para sockets orientados a
conexión, sin embargo, podría utilizarse para datagramas pero haciendo uso de connect( )
para establecer la dirección del socket.
sendto( )
Permite que el cliente o servidor transmita mensajes usando un socket sin conexión
(usando datagramas). Es exactamente similar a send( ) solo que se deberán especificar la
dirección destino del socket al cual se quiere enviar el dato. Se puede usar en sockets
orientados a conexión pero el sistema ignorará la dirección destino indicada en sendto( ).
recv( )
Esta rutina lee datos desde un socket conectado y es usado tanto en el lado del cliente
como del lado del servidor de la aplicación.
recvfrom( )
Esta rutina lee datos desde un socket sin conexión. En este caso, el sistema regresa la
dirección del transmisor con los mensajes de entrada y permite registrar la dirección del
socket transmisor en la misma forma que espera sendto( ), por lo que la aplicación usa la
dirección registrada como destino de la respuesta.
Un servicio orientado a conexión requiere que dos aplicaciones establezcan una conexión
de transportación antes de comenzar el envío de datos. Para establecer la comunicación,
ambas aplicaciones primero interactúan localmente con protocolo de transporte y después
estos protocolos intercambian mensajes por la red. Una vez que ambos extremos están
de acuerdo y se haya establecido la conexión, las aplicaciones podrán enviar datos.
El advenimiento de los sistemas de cómputo propició un campo ideal para que los
sistemas fueran abiertos, es decir que diferentes plataformas de diferentes fabricantes se
pudieran comunicar. Los especialistas del ISO (International Standard Organization)
crearon el OSI (Open System Interconnection), un modelo de referencia para la
interconexión de sistemas abiertos. El modelo ISO/OSI utiliza siete capas para organizar
una red en módulos funcionales bien definidos, con la cual los diseñadores puedan
construir redes reales, sin embargo, al ser este solo un modelo y no una norma, el
diseñador puede modificar el número, nombre y función de la red.
• Cliente - servidor.
• Comunicación en grupo.
Los conceptos fundamentales que deben ser considerados para la comunicación son:
Los hilos se diferencian de los procesos en que los primeros comparten los mismos
recursos del programa que las contiene, en tanto los procesos tienen de manera separada
su código, así como sus datos. Se pueden identificar hilos de dos tipos de flujo:
• Flujo único: En este caso, un programa utiliza únicamente un hilo para controlar su
ejecución.
• Flujo múltiple: Son aquellos programas que utilizan varios contextos de ejecución
para realizar su trabajo.
En un sistema multihilos, cada tarea se inicia y termina tan pronto como sea posible, esto
facilita la entrada de datos en sistemas en tiempo real, especialmente si estos datos
provienen de diferentes fuentes. En un programa multihilo se tiene el hilo principal del
programa en ejecución, quien a su vez tiene otros hilos o tareas paralelas en ejecución.
Un hilo se define como una secuencia única de control de flujo dentro de un programa, en
un programa puede haber más de una secuencia de control o hilos. Un hilo es una parte
del programa que se ejecuta independientemente del resto.