sábado, 28 de mayo de 2016

UNIDAD 3 ARQUITECTURAS DE SOFTWARE

Arquitectura de software. La arquitectura de software es un conjunto de patrones que proporcionan un marco de referencia necesario para guiar la construcción de un software, permitiendo a los programadores, analistas y todo el conjunto de desarrolladores del software compartir una misma línea de trabajo y cubrir todos los objetivos y restricciones de la aplicación. Es considerada el nivel más alto en el diseño de la arquitectura de un sistema puesto que establecen la estructura, funcionamiento e interacción entre las partes del software. 

3.1 DESCOMPOSICIÓN MODULAR

La descomposición modular es un método de diseño que proporciona un mecanismo sistemático para descomponer el problema en subproblemas, reducir la complejidad de todo el problema, consiguiendo de esta manera una solución modular efectiva.  Se enfoca en  reutilizar código, además debido a esta descomposición cada módulo es desarrollado con un fin específico,  de esta manera los  futuros programadores comprenderán fácilmente la función de cada módulo. (HERNADEZ CARPIO JAVIER, 2010)

Los pasos a seguir son:
1. Identificar los módulos
2. Describir cada módulo
3. Describir las relaciones entre módulos

Las siguientes capacidades  son las que debe tener la descomposición modular.

  • Capacidad de descomposición modular: Si un método de diseño proporciona un mecanismo sistemático para descomponer el problema en subproblemas, reducirá la complejidad de todo el problema, consiguiendo de esta manera una solución modular efectiva.
  • Capacidad de empleo de componentes modulares: Si un método de diseño permite ensamblar los componentes de diseño (reusables) existentes en un sistema nuevo, producirá una solución modular que no inventa nada ya inventado.
  • Capacidad de comprensión modular: Si un módulo se puede comprender como una unidad autónoma (sin referencias a otros módulos) será más fácil de construir y de cambiar.
  • Continuidad modular: Si pequeños cambios en los requisitos del sistema provocan cambios en los módulos individuales, en vez de cambios generalizados en el sistema, se minimizará el impacto de los efectos secundarios de los cambios.
  • Protección modular: Si dentro de un módulo se produce una condición aberrante y sus efectos se limitan a ese módulo, se minimizará el impacto de los efectos secundarios inducidos por los errores.

Los módulos se descomponen normalmente de varios componentes del sistema simples. Hay dos estrategias para descomponer un subsistema en módulos:

  1. Descomposición orientada a objetos: donde se descompone un sistema en un conjunto de objetos que se comunican.
  2. Descomposición orientada a flujos de funciones: donde se descompone el sistema en módulos funcionales que aceptan datos y los transforman en datos de salida.



La descomposición modular debe poseer ciertas cualidades mínimas para que se pueda considerar suficiente validad, estas cualidades son: (IAN, 2013)

  • Independencia funcional: Cada módulo debe realizar una función concreta o un conjunto de funciones afines. Es recomendable reducir las relaciones entre módulos al mínimo. Para medir la independencia funcional hay dos criterios: acoplamiento y cohesión.
  • Acoplamiento: El acoplamiento es una medida de la interconexión entre módulos en la estructura del programa. Se tiende a que el acoplamiento sea lo menor  posible, esto es a reducir las interconexiones entre los distintos  módulos en que se estructure nuestra aplicación. El grado de   acoplamiento mide la interrelación entre dos módulos, según el tipo de conexión y la complejidad de la interfaces:
  1. Fuerte: Por contenido, cuando desde un módulo se puede cambiar datos locales de otro. Común, se emplea una zona común de datos a la que tienen acceso varios módulos.
  2. Moderado: De control, la zona común es un dispositivo externo al que están ligados los módulos, esto implica  que un cambio en el formato de datos los afecta a todos.
  3. Débil De datos, viene dado por los datos que intercambian los módulos. Es el mejor. Sin acoplamiento directo, es el acoplamiento que no existe
  4. Cohesión Un módulo coherente ejecuta una tarea sencilla en un procedimiento y requiere  poca interacción con procedimientos  que se ejecutan en otras partes de un  programa. Podemos decir que un módulo coherente es aquel que intenta  realizar solamente una cosa.
  • Comprensibilidad: Para facilitar los cambios, el mantenimiento y  la reutilización de módulos es necesario que  cada uno sea comprensible de forma aislada. Para ello es bueno que posea independencia funcional, pero además es deseable: Identificación, el nombre debe ser adecuado y descriptivo. Documentación, debe aclarar todos los detalles de diseño e implementación que no queden de manifiesto en el propio código.
  • Adaptabilidad: La adaptación de un sistema resulta más difícil cuando no hay independencia funcional, es decir, con alto acoplamiento y baja cohesión, y cuando el diseño es poco comprensible. 



Bibliografía:


IAN, S. (14 de mayo de 2013). Obtenido de http://c3l3sp4s4t.blogspot.mx/

HERNADEZ CARPIO JAVIER, M. O. (16 de mayo de 2010). sin nombre. Obtenido de http://sebas-krlos-sys.blogspot.mx/2010/05/unidad-6-diseno-y-arquitectura-de_16.html

3.2 PATRONES DE DISEÑO

Los patrones de diseño son la base para la búsqueda de soluciones a problemas comunes en el desarrollo de software y otros ámbitos referentes al diseño de interacción o interfaces.
Un patrón de diseño resulta ser una solución a un problema de diseño. Para que una solución sea considerada un patrón debe poseer ciertas características. Una de ellas es que debe haber comprobado su efectividad resolviendo problemas similares en ocasiones anteriores. Otra es que debe ser reutilizable, lo que significa que es aplicable a diferentes problemas de diseño en distintas circunstancias.

Objetivo de los patrones:

  • Proporcionar catálogos de elementos reusables en el diseño de sistemas software.
  • Evitar la reiteración en la búsqueda de soluciones a problemas ya conocidos y solucionados anteriormente.
  • Formalizar un vocabulario común entre diseñadores.
  • Estandarizar el modo en que se realiza el diseño.
  • Facilitar el aprendizaje de las nuevas generaciones de diseñadores condensando conocimiento ya existente.
Asimismo, no pretenden:

  • Imponer ciertas alternativas de diseño frente a otras.
  • Eliminar la creatividad inherente al proceso de diseño.
No es obligatorio utilizar los patrones, solo es aconsejable en el caso de tener el mismo problema o similar que soluciona el patrón, siempre teniendo en cuenta que en un caso particular puede no ser aplicable. "Abusar o forzar el uso de los patrones puede ser un error".

Categorías de los patrones
Según la escala o nivel de abstracción:

  • Patrones de arquitectura: Aquellos que expresan un esquema organizativo estructural fundamental para sistemas de software.
  • Patrones de diseño: Aquellos que expresan esquemas para definir estructuras de diseño (o sus relaciones) con las que construir sistemas de software.
  • Dialectos: Patrones de bajo nivel específicos para un lenguaje de programación o entorno concreto.
  • También es importante reseñar el concepto de "antipatrón de diseño", que con forma semejante a la de un patrón, intenta prevenir contra errores comunes de diseño en el software. La idea de los antipatrones es dar a conocer los problemas que acarrean ciertos diseños muy frecuentes, para intentar evitar que diferentes sistemas acaben una y otra vez en el mismo callejón sin salida por haber cometido los mismos errores. 


Plantillas O Estructuras De Patrones

Para describir un patrón se usan plantillas más o menos estandarizadas, de forma que se expresen uniformemente y puedan constituir efectivamente un medio de comunicación uniforme entre diseñadores. Se han propuesto plantillas ligeramente distintas, si bien la mayoría definen los mismos conceptos básicos.

La plantilla más común es la utilizada precisamente por el GoF y consta de los siguientes apartados:

  • Nombre del patrón: nombre estándar del patrón por el cual será reconocido en la comunidad (normalmente se expresan en inglés).
  • Clasificación del patrón: creacional, estructural o de comportamiento.
  • Intención: ¿Qué problema pretende resolver el patrón?
  • También conocido como: Otros nombres de uso común para el patrón.
  • Motivación: Escenario de ejemplo para la aplicación del patrón.
  •  Aplicabilidad: Usos comunes y criterios de aplicabilidad del patrón.
  • Estructura: Diagramas de clases oportunos para describir las clases que intervienen en el patrón.
  • Participantes: Enumeración y descripción de las entidades abstractas (y sus roles) que participan en el patrón.
  • Colaboraciones: Explicación de las interrelaciones que se dan entre los participantes.
  • Consecuencias: Consecuencias positivas y negativas en el diseño derivadas de la aplicación del patrón.
  • Implementación: Técnicas o comentarios oportunos de cara a la implementación del patrón.
  • Código de ejemplo: Código fuente ejemplo de implementación del patrón.
  • Usos conocidos: Ejemplos de sistemas reales que usan el patrón.
  • Patrones relacionados: Referencias cruzadas con otros patrones.

Aplicación de los  patrones de diseño
Además de su aplicación directa en la construcción de software en general, y derivado precisamente del gran éxito que han tenido, los patrones de diseño han sido aplicados a múltiples ámbitos concretos produciéndose "lenguajes de patrones" y extensos "catálogos" de la mano de diversos autores.

En particular son notorios los esfuerzos en los siguientes ámbitos:

  • Patrones de interfaces de usuario, esto es, aquellos que intentan definir las mejores formas de construir interfaces hombre-máquina.
  • Patrones para la construcción de sistemas empresariales, en donde se requieren especiales esfuerzos en infraestructuras de software y un nivel de abstracción importante para maximizar factores como la escalabilidad o el mantenimiento del sistema.
  • Patrones para la integración de sistemas, es decir, para la intercomunicación y coordinación de sistemas heterogéneos.
  • Patrones de flujos de trabajo, esto es para la definición, construcción e integración de sistemas abstractos de gestión de flujos de trabajo y procesos con sistemas empresariales.


Bibliografía:

Merlino, H. V.-M. (28 de Mayo de 2016). Universidad Nacional de Lanús. Obtenido de Departamento Desarrollo Productivo y Tecnológico: http://sedici.unlp.edu.ar/bitstream/handle/10915/19554/Documento_completo.pdf?sequence=1

3.3 ARQUITECTURAS DE DOMINIO ESPECIFICO

Al igual que los modelos generales, también pueden usarse los modelos arquitectónicos que son específicos para un dominio particular de aplicación. Si bien las instancias de estos sistemas difieren en los detalles, la estructura arquitectónica común puede realizarse cuando se desarrollan nuevos sistemas.
El reto para es diseñar el software y hardware para proporcionar características deseables a los sistemas distribuidos y, al mismo tiempo, minimizar los problemas propios a estos sistemas. Es necesario comprender las ventajas y desventajas de las diferentes arquitecturas de sistemas distribuidos. (identificado, s.f.)

 Existen dos modelos de dominio específico:
  1. Modelos genéricos que son abstracciones de varios sistemas reales. Estos son abstracciones de un número de sistemas reales y que encapsulan las características principales de estos sistemas. (Ian Sommerville, s.f.)
  2. Modelos de referencia que son modelos abstractos y describen a una clase mayor de sistemas. Estos son más abstractos, son modelos idealistas. Proporcionan un significado de información con respecto a sistemas de clases y comparación de diversas arquitecturas.



Modelo genérico
Flujo de datos de un compilador. Un modelo de Compilador es un ejemplo conocido a través de otros modelos que existen en dominios de aplicaciones especializadas:
  • Analizador Léxico
  • Tabla de Símbolos
  • Analizador de Sintáxis
  • Analizador Semántico
  • Generador/Optimizador de Código
  • Un modelo de compilador genérico puede ser organizado de acuerdo a diversos modelos de arquitectura.



Modelo de Referencia
Los modelos de referencias son derivados del estudio del dominio de una aplicación, en lugar del estudio de sistemas existentes. Pueden ser utilizados como una base para… la implementación de un sistema o para comparar sistemas diversos. Actúan como un estándar, contra el cual los sistemas que pueden ser evaluados.

El modelo OSI es un modelo en capas para sistemas de comunicación, y además, es un modelo de referencia. La arquitectura de software es la responsable de la derivación de un modelo de sistema estructural, un modelo de control y un modelo de descomposición en subsistemas. Los sistemas grandes rara vez conforman un modelo simple de arquitectura.
Los modelos de estructuración de un sistema incluyen modelos repositorios, los modelos cliente-servidor y los modelos de máquina abstracta. Los modelos de control incluyen control centralizado y modelos manejadores de eventos.Los modelos de descomposición modular incluyen los modelos orientados aobjetos y los modelos de flujo de datos.

Aquí se tratan dos tipos genéricos de arquitecturas de sistemas distribuidos:

  • Arquitectura cliente-servidor: En este caso el sistema puede ser visto como un conjunto de servicios que se proporcionan a los clientes que hacen uso de dichos servicios. Los servidores y los clientes se tratan de forma diferente en estos sistemas. Arquitecturas de objetos distribuidos.

  • Para esta arquitectura no hay distinción entre servidores y clientes, y el sistema puede ser visto como un conjunto de objetos que interaccionan cuya localización es irrelevante. No hay distinción entre un proveedor de servicios y el usuario de estos servicios. Ambas arquitecturas se usan ampliamente en la industria, pero la distribución de las aplicaciones generalmente tiene lugar dentro de una única organización. La distribución soportada es, por lo tanto, intraorganizacional. 


  • Los sistemas peer-to-peer: han sido usados principalmente para sistemas personales, pero están comenzando a usarse para aplicaciones de empresa. Los componentes en un sistema distribuido pueden implementarse en diferentes lenguajes de programación y pueden ejecutarse en tipos de procesadores completamente diferentes.



Los modelos de datos, la representación de la información y los protocolos de comunicación pueden ser todos diferentes. Un sistema distribuido, por lo tanto, requiere software que pueda gestionar estas partes distintas, y asegurar que dichas partes se puedan comunicar e intercambiar datos. El término middleware se usa para hacer referencia a ese software; se ubica en medio de los diferentes componentes distribuidos del sistema. Bernstein (Bernstein, 1996) resume los tipos de middleware disponibles para soportar computación distribuida. El middleware es un software de propósito general que normalmente se compra como un componente comercial más que escribirse especialmente por los desarrolladores de la aplicación. Ejemplos de middleware son software para gestionar comunicaciones con bases de datos, administradores de transacciones, convertidores de datos y controladores de comunicación. Los sistemas distribuidos se desarrollan normalmente utilizando una aproximación orientada a objetos.


Bibliografía:

Ian Sommerville, M. I. (s.f.). google book. Obtenido de https://books.google.com.mx/books?id=gQWd49zSut4C&pg=PA237&dq=arquitectura+de+dominio+especifico&hl=es&sa=X&ved=0ahUKEwjozbWBzP3MAhVlyoMKHVv5CvEQ6AEILTAA#v=onepage&q=arquitectura%20de%20dominio%20especifico&f=false

identificado, n. (s.f.). Olmcas2´s blog. Obtenido de https://olmcas2.wordpress.com/6-2-arquitectura-de-dominio-especifico/

3.4 DISEÑO DE SOFTWARE DE ARQUITECTURA MULTIPROCESADOR

Un sistema multiproceso o multitarea es aquel que permite ejecutar varios procesos de forma concurrente, la razón es porque actualmente la mayoría de las CPU’s sólo pueden ejecutar un proceso cada vez. La única forma de que se ejecuten de forma simultánea varios procesos es tener varias CPU’s (ya sea en una máquina o en varias, en un sistema distribuido.

Este sistema consiste de varios procesos que pueden ejecutarse sobre procesadores diferentes (aunque no es necesario), es muy común en sistemas grandes de tiempo real, recolectan información, toman decisiones, con la afirmación, y envían señales a los actuadores que modifican el entorno del sistema. (HERNADEZ CARPIO JAVIER, 2010)

La ventaja de un sistema multiproceso reside en la operación llamada cambio de contexto. Esta operación consiste en quitar a un proceso de la CPU, ejecutar otro proceso y volver a colocar el primero sin que se entere de nada. Mejora el rendimiento y adaptabilidad del sistema. La distribución de los procesos de los procesadores se puede predeterminar o puede estar bajo el control de un despachador que decide cuales procesos ubicar en cada procesador. Los sistemas de múltiples procesos no son necesariamente sistemas distribuidos. Si se dispone de más de un procesador, entonces se puede implementar la distribución, pero los diseñadores del sistema no siempre consideran forzosamente cuestiones de distribución mediante el proceso de diseño.

El multiproceso no es algo difícil de entender: más procesadores significa más potencia computacional. Un conjunto de tareas puede ser completado más rápidamente si hay varias unidades de proceso ejecutándolas en paralelo. Esa es la teoría, pero otra historia es la práctica, como hacer funcionar el multiproceso, lo que requiere unos profundos conocimientos tanto del hardware como del software.

Es necesario conocer ampliamente como están interconectados dichos procesadores, y la forma en que el código que se ejecuta en los mismos ha sido escrito para escribir aplicaciones y software que aproveche al máximo sus prestaciones.





Bibliografía:

HERNADEZ CARPIO JAVIER, M. O. (16 de mayo de 2010). sin nombre. Obtenido de http://sebas-krlos-sys.blogspot.mx/2010/05/unidad-6-diseno-y-arquitectura-de_16.html


3.5 DISEÑO DE SOFTWARE DE ARQUITECTURA CLIENTE-SERVIDOR

En el mundo de TCP/IP las comunicaciones entre computadoras se rigen básicamente por lo que se llama modelo Cliente-Servidor, éste es un modelo que intenta proveer usabilidad, flexibilidad, interoperabilidad y escalabilidad en las comunicaciones. El término Cliente/Servidor fue usado por primera vez en 1980 para referirse a PC’s en red. 
Este modelo Cliente/Servidor empezó a ser aceptado a finales de los 80’s. Su funcionamiento es sencillo: se tiene una máquina cliente, que requiere un servicio de una máquina servidor, y éste realiza la función para la que está programado.

El Modelo Cliente-Servidor
Desde el punto de vista funcional, se puede definir la computación Cliente/Servidor como una arquitectura distribuida que permite a los usuarios finales obtener acceso a la información en forma transparente aún en entornos multiplataforma.
En el modelo cliente servidor, el cliente envía un mensaje solicitando un determinado servicio a un servidor (hace una petición), y este envía uno o varios mensajes con la respuesta (provee el servicio). En un sistema distribuido cada máquina puede cumplir el rol de servidor para algunas tareas y el rol de cliente para otras.

La idea es tratar a una computadora como un instrumento, que por sí sola pueda realizar muchas tareas, pero con la consideración de que realice aquellas que son más adecuadas a sus características. Si esto se aplica tanto a clientes como servidores se entiende que la forma más estándar de aplicación y uso de sistemas Cliente/Servidor es mediante la explotación de las PC’s a través de interfaces gráficas de usuario; mientras que la administración de datos y su seguridad e integridad se deja a cargo de computadoras centrales tipo mainframe. Usualmente la mayoría del trabajo pesado se hace en el proceso llamado servidor y el o los procesos cliente sólo se ocupan de la interacción con el usuario (aunque esto puede variar).
En otras palabras la arquitectura Cliente/Servidor es una extensión de programación modular en la que la base fundamental es separar una gran pieza de software en módulos con el fin de hacer más fácil el desarrollo y mejorar su mantenimiento.
Esta arquitectura permite distribuir físicamente los procesos y los datos en forma más eficiente lo que en computación distribuida afecta directamente el tráfico de la red, reduciéndolo grandemente.

Características de la arquitectura Cliente/Servidor

  • Combinación de un cliente que interactúa con el usuario, y un servidor que interactúa con los recursos compartidos. El proceso del cliente proporciona la interfaz entre el usuario y el resto del sistema. El proceso del servidor actúa como un motor de software que maneja recursos compartidos.
  • Las tareas del cliente y del servidor tienen diferentes requerimientos en cuanto a recursos de cómputo como velocidad del procesador, memoria, velocidad y capacidades del disco y dispositivos de E/S.
  • Se establece una relación entre procesos distintos, los cuales pueden ser ejecutados en la misma máquina o en máquinas diferentes distribuidas a lo largo de la red.
  • Existe una clara distinción de funciones basada en el concepto de "servicio", que se establece entre clientes y servidores.
  • La relación establecida puede ser de muchos a uno, en la que un servidor puede dar servicio a muchos clientes, regulando su acceso a recursos compartidos.
  • Los clientes corresponden a procesos activos en cuanto a que son éstos los que hacen peticiones de servicios a los servidores. Estos últimos tienen un carácter pasivo ya que esperan las peticiones de los clientes.
  • No existe otra relación entre clientes y servidores que no sea la que se establece a través del intercambio de mensajes entre ambos. El mensaje es el mecanismo para la petición y entrega de solicitudes de servicio.
  • El ambiente es heterogéneo. La plataforma de hardware y el sistema operativo del cliente y del servidor no son siempre la misma. Precisamente una de las principales ventajas de esta arquitectura es la posibilidad de conectar clientes y servidores independientemente de sus plataformas.
  • El concepto de escalabilidad tanto horizontal como vertical es aplicable a cualquier sistema Cliente/Servidor. La escalabilidad horizontal permite agregar más estaciones de trabajo activas sin afectar significativamente el rendimiento. La escalabilidad vertical permite mejorar las características del servidor o agregar múltiples servidores.

Ventajas del esquema Cliente/Servidor

  • Existencia de plataformas de hardware cada vez más baratas. Se pueden utilizar componentes, tanto de hardware como de software, de varios fabricantes, lo cual contribuye considerablemente a la reducción de costos y favorece la flexibilidad en la implantación y actualización de soluciones.
  • Facilita la integración entre sistemas diferentes y comparte información permitiendo integrar PCs con sistemas medianos y grandes, sin necesidad de que todos tengan que utilizar el mismo sistema operacional.
  • Al favorecer el uso de interfaces gráficas interactivas, los sistemas construidos bajo este esquema tienen mayor interacción y más intuitiva con el usuario. En el uso de interfaces gráficas para el usuario, el esquema Cliente/Servidor presenta la ventaja, con respecto a uno centralizado, de que no es siempre necesario transmitir información gráfica por la red pues esta puede residir en el cliente, lo cual permite aprovechar mejor el ancho de banda de la red.
  • Es más rápido el mantenimiento y el desarrollo de aplicaciones.
  • La estructura inherentemente modular facilita además la integración de nuevas tecnologías y el crecimiento de la infraestructura computacional, favoreciendo así la escalabilidad de las soluciones.

Desventajas del esquema Cliente/Servidor

  • El mantenimiento de los sistemas es más difícil pues implica la interacción de diferentes partes de hardware y de software, distribuidas por distintos proveedores, lo cual dificulta el diagnóstico de fallas.
  • Se cuenta con muy escasas herramientas para la administración y ajuste del desempeño de los sistemas.
  • Es importante que los clientes y los servidores utilicen el mismo mecanismo (por ejemplo sockets o RPC), lo cual implica que se deben tener mecanismos generales que existan en diferentes plataformas.
  • Además, hay que tener estrategias para el manejo de errores y para mantener la consistencia de los datos.
  • La seguridad de un esquema Cliente/Servidor es otra preocupación importante.
  • El desempeño es otro de los aspectos que se deben tener en cuenta en el esquema Cliente/Servidor. Problemas de este estilo pueden presentarse por congestión en la red, dificultad de tráfico de datos, etc.


Bibliografía:

- Martínez Gomáriz , E. (28 de Mayo de 2016). Departament d'Enginyeria de Serveis i Sistemes d'Informació. Obtenido de http://www.essi.upc.edu/~gomariz/index_archivos/IntroduccionSD-EnricMartinez.pdf

Santa Catarina Mártir. (28 de Mayo de 2016). Universidad de Santa Catarina Mártir. Obtenido de http://catarina.udlap.mx/u_dl_a/tales/documentos/lis/marquez_a_bm/capitulo5.pdf

3.6 DISEÑO DE SOFTWARE DE ARQUITECTURA DISTRIBUIDA


Un sistema distribuido es una colección de computadoras independientes que aparecen ante los usuarios del sistema como una única computadora. (Tanenbaum, 1996)

 Aspectos:
 Hardware: Las máquinas son autónomas.
 Software: Los usuarios piensan que el sistema es como una única computadora.

Cada máquina posee sus componentes de hardware y software que el usuario percibe como un solo sistema (no necesita saber qué cosas están en qué máquinas). El usuario accede a los recursos remotos (RPC) de la misma manera en que accede a recursos locales, o un grupo de computadores que usan un software para conseguir un objetivo en común.

Los sistemas distribuidos deben ser muy confiables, ya que si un componente del sistema se descompone, otro componente debe ser capaz de reemplazarlo, esto se denomina Tolerancia a Fallos.



Ejemplos de Sistemas Distribuidos

Ejemplo 1
  • Una red de estaciones de trabajo en un departamento de una universidad o compañía.
Ø  De cada estación de trabajo personal podría existir una pila de procesadores en el cuarto de máquinas que no estén asignados a usuarios específicos sino que se utilicen de manera dinámica conforme sea necesario.

Ø  Tal sistema podría tener un sistema de archivos único con todos los archivos accesibles desde todas las máquinas de la misma forma y con el mismo nombre de ruta de acceso.

Ø  Además cuando el usuario escriba un comando el sistema podría buscar el mejor lugar para ejecutarlo tal vez en la propia estación de ti abajo del usuario o en una estación de trabajo inactiva que pertenezca a otra persona o en uno de los procesadores no asignados en el cuarto de máquinas.

Ø  Si el sistema se ve como un todo y actúa como un sistema de tiempo compartido clásico con un único procesador podría considerarse como un sistema distribuido.




Ejemplo 2
  • Una fábrica de robots

Ø  Cada uno de los cuales contiene una poderosa computadora para el manejo de visión, planeación, comunicación y otras tareas.

Ø  Cuando el robot de la línea de ensamble nota que parte por instalar es defectuosa le pide al robot del departamento de partes que le traiga una refacción.

Ø  Si todos los robots actúan como dispositivos periféricos unidos a la misma computadora central y el sistema se puede programar de esta manera también se le considera como sistema distribuido.




Ejemplo 3
  • Un Banco con cientos de sucursales por todo el mundo.

Ø  Cada oficina tiene una computadora maestra para guardar las cuentas locales y el manejo de las transacciones locales.

Ø  Cada computadora tiene la capacidad de comunicarse con las de otras sucursales y con una computadora central en las oficinas centrales.

Ø  Si las transacciones se pueden realizar sin importar dónde se encuentre el cliente o la cuenta y si los usuarios no observan diferencia alguna entre este sistema y el antiguo centralizado que ha remplazado también se podría considerar como un sistema distribuido.




Objetivos

El simple hecho de poder construir sistemas distribuidos no significa necesariamente que sea buena idea. Después de todo con la tecnología actual es posible colocar cantidades enormes de información en una sola computadora personal. El hecho es que esto no tendría sentido. En siguientes secciones se mostrarán las ventajas y desventajas en comparación con los sistemas centralizados.


Características

  • Concurrencia: Esta característica de los sistemas distribuidos permite que los recursos disponibles en la red puedan ser utilizados simultáneamente por los usuarios o los agentes que interactúan en la red.
  • Una de las características de los sistemas distribuidos es su modularidad, lo que le permite una gran flexibilidad y posibilita su escalabilidad, definida como la capacidad del sistema para crecer sin aumentar su complejidad ni disminuir su rendimiento. Uno de los objetivos del diseño de un sistema distribuido es extender la escalabilidad a la integración de servicios.
  • Transparencia El objetivo esencial de un sistema distribuido es proporcionar al usuario y a las aplicaciones una visión de los recursos del sistema como gestionados por una sola máquina virtual. La distribución física de los recursos es transparente. 
  • Fallos independientes de los componentes.- Cada componente del sistema pudiera fallar de manera independientemente, y los demás continuar ejecutando sus acciones. Esto permite el logro de las tareas con mayor efectividad, pues el sistema en su conjunto continua trabajando.
  • Apertura (opennesss): Un sistema informático es abierto si el sistema puede ser extendido de diversas maneras. La apertura de los sistemas distribuidos se determina primariamente por el grado hacia el que nuevos servicios de compartición de recursos se pueden añadir sin perjudicar ni duplicar a los ya existentes.
  • Carencia de reloj global.- Las coordinaciones para la transferencia de mensajes entre los diferentes componentes para la realización de una tarea, no tienen una temporización general, está más bien distribuida a los componentes.


Ventajas de los Sistemas Distribuidos sobre los Sistemas Centralizados



  1. Los sistemas computacionales en red ofrecen en promedio un mejor rendimiento/precio que los sistemas centralizados.
  2. La redundancia incrementa la disponibilidad cuando partes de un sistema fallan
  3. Las aplicaciones que pueden ser fáciles de ejecutar simultáneamente también ofrecen beneficios en términos de mayor rendimiento contra las soluciones centralizadas.
  4. Los sistemas distribuidos pueden extenderse a través de la adición de componentes, proporcionando de este modo una mejor escalabilidad en comparación con los sistemas centralizados

ELEMENTO
DESCRIPCIÓN
Económicos
Mejor rendimiento/precio para las computadoras en red que los centralizados.
Velocidad
Un sistema distribuido puede tener más potencia de cálculo que una
Distribución Inherente
Algunas aplicaciones involucran a las máquinas separadas espacialmente
Confiabilidad
Si una de las máquinas colapsa, el sistema como un todo podría sobrevivir.
Crecimiento Incremental
El poder computacional puede ser añadido en pequeños incrementos


Ventajas de los Sistemas Distribuidos sobre las computadoras independientes

ELEMENTO
DESCRIPCIÓN
Compartir Datos
Permite a muchos usuarios accesar a una base de datos en común.
Compartir Dispositivos
Permite a muchos usuarios compartir dispositivos costosos.
Comunicación
Hace de la comunicación humano – humano más fácil.
Flexibilidad
Reparte el trabajo sobre las máquinas disponibles de la manera más rentable


Ventajas del medio ambiente de la computación distribuida sobre las aplicaciones independientes.

  1. Alto rendimiento: Las aplicaciones pueden ejecutarse en paralelo y distribuir la carga a través de múltiples servidores.
  2. Colaboración: Múltiples aplicaciones pueden ser conectadas a través de mecanismos de sistemas computacionales distribuidos estándares.
  3. Alta confiabilidad y disponibilidad: Aplicaciones o servidores pueden almacenarse en múltiples maquinas.
  4. Escalabilidad: Para desarrollar componentes distribuidos reusables en poderosos servidores.
  5. Extensibilidad: Dinámica reconfiguración de aplicaciones distribuidas a través de la red.
  6. Alta productividad y bajo ciclo de tiempo de desarrollo: Rompiendo los grandes problemas en otros más pequeños, estos componentes individuales pueden ser desarrolladas por pequeños equipos de desarrollo de manera aislada.
  7. Reúso: Servicios que pueden potencialmente ser usados por múltiples aplicaciones clientes. 
  8. Costos reducidos: Debido a la reutilización de los componentes una vez hayan sido desarrollados que son accesibles a través de la red.

Desventajas
  1. Complejidad: Los sistemas distribuidos son más complejos que los sistemas centralizados. Esto hace más difícil comprender sus propiedades emergentes y probar estos sistemas. 
  2. Seguridad: Puede accederse al sistema desde varias computadoras diferentes, y el tráfico en la red puede estar sujeto a escuchas indeseadas. Esto hace más difícil el asegurar que la integridad de los datos en el sistema se mantenga y que los servicios del sistema no se degraden por ataques de denegación de servicio.
  3. Manejabilidad: Las computadoras en un sistema pueden ser de diferentes tipos y pueden ejecutar versiones diferentes de sistemas operativos. Los defectos en una máquina pueden propagarse a otras máquinas con consecuencias inesperadas. Esto significa que se requiere más esfuerzo para gestionar y mantener el funcionamiento del sistema.
  4. Impredecibilidad: Los sistemas distribuidos tienen una respuesta impredecible. La respuesta depende de la carga total en el sistema, de su organización y de la carga de la red. Como todos ellos pueden cambiar con mucha rapidez, el tiempo requerido para responder a una petición de usuario puede variar drásticamente de una petición a otra.


Bibliografía:

- Sommerville, I. (2005). Ingeniería del Software. España: Addison-Wesley.

- Lafuente, A. (28 de Mayo de 2016). Universidad del País Vasco. Obtenido de Departamento de Arquitectura y Tecnología de Computadores: http://www.sc.ehu.es/acwlaroa/SDI/Apuntes/Cap1.pdf

- Tanenbaum, A. (1996). Sistemas Operativos Distribuidos. Amsterdam: Prentice Hall Inc.