Aspectos de Diseño
Transparencia, flexibilidad, confiabilidad, rendimiento, escalabilidad, tolerancia a fallos.
Transparencia
La transparencia se define como la ocultación al usuario y al programador de aplicaciones de la separación de los componentes de un sistema distribuido, de manera que el sistema se percibe como un todo, en vez de una colección de componentes independientes. La transparencia ejerce una gran influencia en el diseño del software de sistema.
El manual de referencia RM-ODP [ISO 1996a] identifica ocho formas de transparencia. Estas proveen un resumen útil de la motivación y metas de los sistemas distribuidos. Las transparencias definidas son:
- Transparencia de Acceso : Permite el acceso a los objetos de información remotos de la misma forma que a los objetos de información locales.
- Transparencia de Localización: Permite el acceso a los objetos de información sin conocimiento de su localización
- Transparencia de Concurrencia: Permite que varios procesos operen concurrentemente utilizando objetos de información compartidos y de forma que no exista interferencia entre ellos.
- Transparencia de Replicación: Permite utilizar múltiples instancias de los objetos de información para incrementar la fiabilidad y las prestaciones sin que los usuarios o los programas de aplicación tengan por que conoces la existencia de las replicas.
- Transparencia de Fallos: Permite a los usuarios y programas de aplicación completar sus tareas a pesar de la ocurrencia de fallos en el hardware o en el software.
- Transparencia de Migración: Permite el movimiento de objetos de información dentro de un sistema sin afectar a los usuarios o a los programas de aplicación.
- Transparencia de Prestaciones. Permite que el sistema sea reconfigurado para mejorar las prestaciones mientras la carga varia.
- Transparencia de Escalado: Permite la expansión del sistema y de las aplicaciones sin cambiar la estructura del sistema o los algoritmos de la aplicación.
Las dos más importantes son las transparencias de acceso y de localización; su presencia o ausencia afecta fuertemente a la utilización de los recursos distribuidos. A menudo se las denomina a ambas transparencias de red. La transparencia de red provee un grado similar de anonimato en los recursos al que se encuentra en los sistemas centralizados.
La flexibilidad:
Representa facilidades para cambios posteriores al diseño (retroalimentación). Los sistemas distribuidos son nuevos; es importante, por ende, que se puedan adaptar a nuevas tecnologías y a nuevos avances en el tema.
SOD debe ser adaptable:
- Facilidad para incorporar cambios y extensiones al sistema
- Uso preferible de arquitectura microkernel
- Importancia de sistemas abiertos:
- Sus interfaces y protocolos deberían ser públicos.
- Contrario a ”tecnología propietaria”.
- Uso de estándares siempre que sea posible.
- Disponibilidad de su código fuente (libremente o no).
- Regulación por parte de un colectivo (usuarios u organizaciones) y no por particulares (fabricantes).
Un proyecto en desarrollo como el diseño de un sistema operativo distribuido debe estar abierto a cambios y actualizaciones que mejoren el funcionamiento del sistema. Esta necesidad ha provocado una diferenciación entre las dos diferentes arquitecturas del núcleo del sistema operativo: el núcleo monolítico y el micronúcleo. Las diferencias entre ambos son los servicios que ofrece el núcleo del sistema operativo. Mientras el núcleo monolítico ofrece todas las funciones básicas del sistema integradas en el núcleo, el micronúcleo incorpora solamente las fundamentales, que incluyen únicamente el control de los procesos y la comunicación entre ellos y la memoria. El resto de servicios se cargan dinámicamente a partir de servidores en el nivel de usuario.
Confiabilidad:
Un importante objetivo de los sistemas distribuidos es que si una máquina falla, alguna otra debe encargarse del trabajo.
La confiabilidad global teórica del sistema podría ser el “or” booleano de la confiabilidad de los componentes; ejemplo:
- Se dispone de 5 servidores de archivos, cada uno con una probabilidad de 0,95 de funcionar en un instante dado.
- La probabilidad de falla simultánea de los 5 es (0,05)5 = 0,000006.
- La probabilidad de que al menos uno esté disponible es 0,999994.
La confiabilidad práctica se ve disminuida ya que muchas veces se requiere que ciertos servidores estén en servicio simultáneamente para que el todo funcione, debido a ello algunos sistemas tienen una disponibilidad más relacionada con el “and” booleano de las componentes que con el “or” booleano.
Un aspecto de la confiabilidad es la disponibilidad, que se refiere a la fracción de tiempo en que se puede utilizar el sistema.
La disponibilidad se mejora mediante:
- Un diseño que no exija el funcionamiento simultáneo de un número sustancial de componentes críticos.
- La redundancia, es decir la duplicidad de componentes clave del hardware y del software.
Los datos no deben perderse o mezclarse y si los archivos se almacenan de manera redundante en varios servidores, todas las copias deben ser consistentes
.
Un aspecto también relacionado con la confiabilidad es la tolerancia a fallas, según la cual las fallas se deben ocultar brindando una recuperación transparente para el usuario, aunque haya cierta degradación del rendimiento.
Los datos no deben perderse o mezclarse y si los archivos se almacenan de manera redundante en varios servidores, todas las copias deben ser consistentes.
Un aspecto también relacionado con la confiabilidad es la tolerancia a fallas, según la cual las fallas se deben ocultar brindando una recuperación transparente para el usuario, aunque haya cierta degradación del rendimiento.
La confiabilidad global del sistema es mayor que la confiabilidad de un servidor individual.
Otra herramienta para el mejoramiento de la disponibilidad es la redundancia (duplicar piezas de hard y soft). Un sistema altamente confiable debe ser altamente disponible, y además los datos confiados al sistema no deben perderse o mezclarse de manera alguna (todas las copias deben ser consistentes).
Rendimiento:
Cuando se ejecuta una aplicación en un sistema distribuido no debe parecer peor que su ejecución en un único procesador, pero esto es difícil de lograr.
Metricas
- Tiempo de respuesta.
- Rendimiento (número de trabajos por hora).
- Uso del sistema y cantidad consumida de la capacidad de la red.
El problema se complica por el hecho de que la comunicación entre equipos es lenta comparada con:
- La velocidad de proceso.
- La velocidad de la comunicación dentro de un mismo procesador.
Para optimizar el desempeño:
- Minimizar el numero de mensajes
- Centralizar el trabajo en una sola maquina
Minimizar el numero de mensajes:
La dificultad es que la mejor forma de mejorar el desempeño es tener muchas actividades en ejecución paralela en distintos procesadores, pero esto requiere el envío de muchos mensajes
Centralizar el trabajo en una sola maquina
Resulta poco apropiado para un sistema distribuido
Tamaño de Grano:
Paralelismo de Grano Fino
Corresponde a trabajos con un gran número de pequeños cálculos y mucha interacción con otros trabajos, debido a ello requieren mucha comunicación que puede afectar el desempeño.
Paralelismo de Grano Grueso
Corresponde a trabajos con grandes cálculos, poca interacción y pocos datos, por lo tanto requieren poca comunicación y no afectan la performance
Escalabilidad
Los sistemas distribuidos operan de manera efectiva y eficiente a muchas escalas diferentes. La escala más pequeña consiste en dos estaciones de trabajo y un servidor de ficheros, mientras que un sistema distribuido construido alrededor de una red de área local simple podría contener varios cientos de estaciones de trabajo, varios servidores de ficheros, servidores de impresión y otros servidores de propósito especifico. A menudo se conectan varias redes de área local para formar internetworks, y éstas podrían contener muchos miles de ordenadores que forman un único sistema distribuido, permitiendo que los recursos sean compartidos entre todos ellos.
Tanto el software de sistema como el de aplicación no deberían cambiar cuando la escala del sistema se incrementa. La necesidad de escalabilidad no es solo un problema de prestaciones de red o de hardware, sino que esta íntimamente ligada con todos los aspectos del diseño de los sistemas distribuidos. El diseño del sistema debe reconocer explícitamente la necesidad de escalabilidad o de lo contrario aparecerán serias limitaciones.
La demanda de escalabilidad en los sistemas distribuidos ha conducido a una filosofía de diseño en que cualquier recurso simple -hardware o software- puede extenderse para proporcionar servicio a tantos usuarios como se quiera. Esto es, si la demanda de un recurso crece, debería ser posible extender el sistema para darla servicio,. Por ejemplo, la frecuencia con la que se accede a los ficheros crece cuando se incrementa el numero de usuarios y estaciones de trabajo en un sistema distribuido. Entonces, debe ser posible añadir ordenadores servidores para evitar el cuello de botella que se produciría si un solo servidor de ficheros tuviera que manejar todas las peticiones de acceso a los ficheros. En este caso el sistema deberá estar diseñado de manera que permita trabajar con ficheros replicados en distintos servidores, con las consideraciones de consistencias que ello conlleva.
Cuando el tamaño y complejidad de las redes de ordenadores crece, es un objetivo primordial diseñar software de sistema distribuido que seguirá siendo eficiente y útil con esas nuevas configuraciones de la red. Resumiendo, el trabajo necesario para procesar una petición simple para acceder a un recurso compartido debería ser prácticamente independiente del tamaño de la red. Las técnicas necesarias para conseguir estos objetivos incluyen el uso de datos replicados, la técnica asociada de caching, y el uso de múltiples servidores para manejar ciertas tareas, aprovechando la concurrencia para permitir una mayor productividad.
Tolerancia a Fallos
Los sistemas informáticos a veces fallan. Cuando se producen fallos en el software o en el hardware, los programas podrían producir resultados incorrectos o podrían pararse antes de terminar la computación que estaban realizando. El diseño de sistemas tolerantes a fallos se basa en dos cuestiones, complementarias entre sí: Redundancia hardware (uso de componentes redundantes) y recuperación del software (diseño de programas que sean capaces de recuperarse de los fallos).
En los sistemas distribuidos la redundancia puede plantearse en un grano mas fino que el hardware, pueden replicarse los servidores individuales que son esenciales para la operación continuada de aplicaciones criticas.
La recuperación del software tiene relación con el diseño de software que sea capaz de recuperar (roll-back) el estado de los datos permanentes antes de que se produjera el fallo.
Los sistemas distribuidos también proveen un alto grado de disponibilidad en la vertiente de fallos hardware. La disponibilidad de un sistema es una medida de la proporción de tiempo que esta disponible para su uso. Un fallo simple en una maquina multiuruario resulta en la no disponibilidad del sistema para todos los usuarios. Cuando uno de los componentes de un sistema distribuidos falla, solo se ve afectado el trabajo que estaba realizando el componente averiado. Un usuario podría desplazarse a otra estación de trabajo; un proceso servidor podría ejecutarse en otra maquina.
Modelo Cliente-Servidor.
Arquitectura Cliente/Servidor
Una arquitectura es un conjunto de reglas, definiciones, términos y modelos que se emplean para producir un producto. La arquitectura Cliente/Servidor agrupa conjuntos de elementos que efectúan procesos distribuidos y computo cooperativo.
Beneficios:
Beneficios:
- Mejor aprovechamiento de la potencia de cómputo (Reparte el trabajo).
- Reduce el tráfico en la Red. (Viajan requerimientos).
- Opera bajo sistemas abiertos.
- Permite el uso de interfaces gráficas variadas y versátiles.
Segmentación de Aplicaciones:
Cliente:
Conjunto de Software y Hardware que invoca los servicios de uno o varios servidores.
Cliente:
Conjunto de Software y Hardware que invoca los servicios de uno o varios servidores.
Características:
- El Cliente oculta al Servidor y la Red
- Detecta e intercepta peticiones de otras aplicaciones y puede redireccionarlas
- Dedicado a la sesión del usuario ( Inicia...Termina ).
- El método más común por el que se solicitan los servicios es através de RPC (Remote Procedure Calls).
Funciones Comunes del Cliente:
- Mantener y procesar todo el dialogo con el usuario.
- Manejo de pantallas.
- Menús e interpretación de comandos.
- Entrada de datos y validación.
- Procesamiento de ayudas.
- Recuperación de errores.
Servidor:
Conjunto de Hardware y Software que responde a los requerimientos de un cliente.
Tipos Comunes de Servidores:
- Servidor de Archivos (FTP, Novell).
- Servidor de Bases de Datos (SQL, CBASE, ORACLE, INFORMIX).
- Servidor de Comunicaciones
- Servidor de Impresión.
- Servidor de Terminal.
- Servidor de Aplicaciones (Windows NT, Novell).
Funciones Comunes del Servidor:
- Acceso, almacenamiento y organización de datos.
- Actualización de datos almacenados.
- Administración de recursos compartidos.
- Ejecución de toda la lógica para procesar una transacción.
- Procesamiento común de elementos del servidor (Datos, capacidad de CPU, almacenamiento en disco, capacidad de impresión, manejo de memoria y comunicación).
Red de Comunicación
Es todo aquel conjunto de elementos basados en hardware y software que permite establecer un enlace entre los clientes y los servidores, se clasifican por su tamaño LAN, MAN y WAN.
Características de la comunicación:
- A través de este medio, el cliente debe localizar e iniciar la comunicación con el servidor.
- No se utiliza la metodología de compartición de archivos, ya que todos los accesos a la información se llevan a cabo a través de peticiones por medio de comunicación.
- Debido a que los programas de manejo y control de información ( Archivos y bases de datos solo se envían y reciben los resultados de las operaciones (Tráfico igual a Datos leídos o escritos).
- Debido a la flexibilidad de establecer sesiones con múltiples servidores y manejo de información en varias bases de datos (en sitios remotos es requerido el uso de estilos transaccionales y cooperativos).
Estilo de la Base de Datos con arquitectura Cliente/Servidor
Modelos o Tecnicas de Procesamiento y Protocolos Comunmente Utilizados
- Llamadas a procedimientos remotos (RPC).
- Interacciones SQL Cliente/Servidor.
- Memoria compartida.
- Paso de Mensajes.
- SPX/IPX
- NETBEUI (NETBIOS)
- NAME PIPES
- TCP/IP
- UDP
- SOCKETS
Distribución entre Cliente y Servidor
Dentro de los procesos que son manejados en una arquitectura Cliente/Servidor, se tiene 3 elementos básicos que deben de distribuirse entre el cliente y el servidor, estos elementos son:
- El manejo de Datos
- La aplicación.
- La presentación.
Llamadas de procedimientos remotos
Middleware
El término middleware se discute en [Lewandosky 1998]. El software distribuido requerido para facilitar las interacciones cliente-servidor se denomina middleware. El acceso transparente a servicios y recursos no locales distribuidos a través de una red se provee a través del middleware, que sirve como marco para la comunicaciones entre las porciones cliente y servidor de un sistema.
El middleware define: el API que usan los clientes para pedir un servicio a un servidor, la transmisión física de la petición vía red, y la devolución de resultados desde el servidor al cliente. Ejemplos de middleware estándar para dominios específicos incluyen: ODBC, para bases de datos, Lotus para groupware, HTTP y SSL para Internet y CORBA, DCOM y JAVA RMI para objetos distribuidos.
El middleware fundamental o genérico es la base de los sistemas cliente-servidor. Los servicios de autentificación en red, llamadas a procedimiento remoto, sistemas de ficheros distribuidos y servicios de tiempo en red se consideran parte del middleware genérico. Este tipo de middleware empieza a ser parte estándar de los sistemas operativos modernos como Windows NT. En sistemas donde no se disponga deberá recurrirse a middlware del tipo OSD DCE (Distributed Computing Environment) [OSF 1994]. El middleware especifico para un dominio complementa al middlware genérico de cara a aplicaciones mucho mas especificas.
El protocolo de comunicaciones mas usado por el middlware, tanto genérico como especifico, es TCP/IP. Esto se debe a su amplia difusión en todos los sistemas operativos del mercado y en especial en los ordenadores personales.
Servicios Middleware
Es un servicio de propósito general que se encuentra localizado entre las plataformas y las aplicaciones: la plataforma viene a ser un conjunto de servicios de bajo nivel y elementos de procesamiento definidos por la arquitectura del procesador y la API del OS, tales como Intel x86 y Win32. Como la gran mayoría de los conceptos de sistemas de alto nivel, es difícil definir técnicamente que es un middleware. Tienen aplicaciones genéricas e industriales que corren sobre plataformas múltiples, son además distribuidos, soportan interfases estándar y protocolos; dicho en otras palabras es un servicio de plataforma, un ejemplo de middleware es un DBMS. Para correr en plataformas múltiples un servicio middleware refuerza la plataforma de cobertura de aplicaciones que dependen de él, también puede ser accesado en forma remota o activar también en esa misma forma otros servicios y aplicaciones. Idealmente soporta protocolos estándar (p. e. TCP/IP), un servicio middleware debería soportar un API estándar, es llamado transparente con respecto a una API si es fácilmente accesado vía esta, sin modificar la API misma y se considera no transparente si se requiere una nueva API.
Los siguientes componentes son o podrían ser servicios middleware:
Administrador de presentaciones, Servicios de cómputo, Administrador de información, Sistemas de comunicaciones, Sistemas de control, Administrador de Sistemas.
No todos estos servicios son distribuidos normalmente, portátiles o estándar, pero existe un número lo suficientemente grande de ellos que son o pueden ser abstracciones middleware
Existen 4 categorías de Middleware
Transaccional; Soporta transacciones que involucran componentes que corren en terminales distribuidas
Orientado a mensajes; Soporta la comunicación entre componentes de sistemas distribuidos facilitando el intercambio de mensajes
De procedimientos; Maneja las llamadas a procedimientos remotos (RPC)
De objetos y componentes; utiliza los principios de la orientación a objetos para el desarrollo de sistemas distribuidos; ejemplos CORBA, DCOM) y RMI
Tendencias de desarrollo de los Middleware; estas se dirigen hacia proporcionar las siguientes características:
- Flexibilidad; con la creación de ambientes flexibles de ejecución
- Escalabilidad; para su uso global en sistemas distribuidos.
- En tiempo real; en la actualidad son solo de uso muy limitado en tiempo real y sistemas implícitos ya que todas las consultas tienen la misma prioridad.
- Cómputo móvil; la tendencia es hacia el cómputo móvil, y en este momento requieren una conexión continua a la red, teniéndose problemas con los host móviles
Protocolos de Comunicación.
Los protocolos son como reglas de comunicación que permiten el flujo de información entre computadoras distintas que manejan lenguajes distintos, por ejemplo, dos computadores conectados en la misma red pero con protocolos diferentes no podrían comunicarse jamás, para ello, es necesario que ambas "hablen" el mismo idioma, por tal sentido, el protocolo TCP/IP fue creado para las comunicaciones en Internet, para que cualquier computador se conecte a Internet, es necesario que tenga instalado este protocolo de comunicación
TCP/IP
El protocolo TCP/IP (Transmition Control Protocol/Internet Protocol) hace posible enlazar cualquier tipo de computadoras, sin importar el sistema operativo que usen o el fabricante. Este protocolo fue desarrollado originalmente por el ARPA (Advanced Research Projects Agency) del Departamento de Defensa de los Estados Unidos. Actualmente, es posible tener una red mundial llamada Internet usando este protocolo. Este sistema de IP permite a las redes enviar correo electrónico (e-mail), transferencia de archivos (FTP) y tener una interacción con otras computadoras (TELNET)no importando donde estén localizadas, tan solo que sean accesibles a través de Internet.
Arquitectura de Interconexión de Redes en TCP/IP
Características
• Protocolos de no conexión en el nivel de red.
• Conmutación de paquetes entre nodos.
• Protocolos de transporte con funciones de seguridad.
• Conjunto común de programas de aplicación.
Para entender el funcionamiento de los protocolos TCP/IP debe tenerse en cuenta la arquitectura que ellos proponen para comunicar redes. Tal arquitectura ve como iguales a todas las redes a conectarse, sin tomar en cuenta el tamaño de ellas, ya sean locales o de cobertura amplia. Define que todas las redes que intercambiarán información deben estar conectadas a una misma computadora o equipo de procesamiento (dotados con dispositivos de comunicación); a tales computadoras se les denominan compuertas, pudiendo recibir otros nombres como enrutadores o puentes.
Direcciones IP
• Longitud de 32 bits.
• Identifica a las redes y a los nodos conectados a ellas.
• Especifica la conexión entre redes.
• Se representan mediante cuatro octetos, escritos en formato decimal, separados por puntos.
Para que en una red dos computadoras puedan comunicarse entre sí ellas deben estar identificadas con precisión Este identificador puede estar definido en niveles bajos (identificador físico) o en niveles altos (identificador lógico) de pendiendo del protocolo utilizado. TCP/IP utiliza un identificador denominado dirección Internet o dirección IP, cuya longitud es de 32 bytes. La dirección IP identifica tanto a la red a la que pertenece una computadora como a ella misma dentro de dicha red.
Tomando tal cual está definida una dirección IP podría surgir la duda de cómo identificar qué parte de la dirección identifica a la red y qué parte al nodo en dicha red. Lo anterior se resuelve mediante la definición de las "Clases de Direcciones IP". Para clarificar lo anterior veamos que una red con dirección clase A queda precisamente definida con el primer octeto de la dirección, la clase B con los dos primeros y la C con los tres primeros octetos. Los octetos restantes definen los nodos en la red específica.
Los servicios más importantes de TCP/IP son:
Transferencia de Archivos FTP (File Transfer Protocol). Este protocolo permite a los usuarios obtener o enviar archivos a otras computadoras en una red amplia (Internet). En esto, hay que implementar cierta seguridad, para restringir el acceso a ciertos usuarios y además a ciertas partes del servidor (computadora).
Acceso Remoto: El acceso remoto(Telnet) en un protocolo que permite el acceso directo de un usuario a otra computadora en la red. Para establecer un Telnet, se debe establecer la dirección o nombre de la computadora a la cual se desea conectar. Mientras se tenga el enlace, todo lo que se escriba en la pantalla, será ejecutado en la computadora remota, haciendo un tanto invisible a la computadora local. Cuando se accede por este tipo de protocolos, generalmente la computadora remota pregunta por un nombre de usuario (user name, login, etc.) y por una clave (password). Cuando ya se desea terminar con la sesión, basta con terminar este protocolo, para salir generalmente con los comandos: logout, logoff, exit, etc.
Correo en las Computadoras (e-mail): Este protocolo permite enviar o recibir mensajes a diferentes usuarios en otras computadoras. Generalmente se tiene una computadora como servidor de correo electrónico, la cual debe estar todo tiempo corriendo este programa, ya que cuando se envía algún mensaje, la computadora trata de enviarlo a la que le corresponde y si esta estuviera apagada o no corriendo este programa, el mensaje se perdería. Esta es la inconveniencia de tener un servidor de correo en una computadora del tipo PC, ya que estas no están permanentemente encendidas ni corriendo el protocolo de correo electrónico.
Sistemas de archivo en red (NFS): Esto permite a un sistema acceder archivos en otra computadora de una manera mas apropiada que mediante un FTP. El NFS da la impresión de que los discos duros de la computadora remota están directamente conectados a la computadora local. De esta manera, se crea un disco virtual en el sistema local. Esto es bastante usado para diferentes propósitos, tales como poner gran cantidad de información en una cuantas computadoras, pero permitiendo el acceso a esos discos. Esto aparte de los beneficios económicos, además permite trabajar a los usuarios en varias computadoras y compartir archivos comunes.
Impresión Remota: Esto permite acceder impresoras conectadas en la red, para lo cual se crean colas de impresión y el uso de dichas impresoras se puede restringir, ya sea mediante alguna contraseña o a ciertos usuarios. Los beneficios son el poder compartir estos recursos.
Ejecución remota: Esto permite correr algún programa en particular en alguna computadora. Es útil cuando se tiene un trabajo grande que no es posible correr en un sistema pequeño, siendo necesario ejecutarlo en uno grande. Se tiene diferentes tipos de ejecución remota, por ejemplo, se puede dar algún comando o algunos para que sean ejecutados en alguna computadora en especifico. Con un sistema mas sofisticado, es posible que ese proceso sea cargado a alguna computadora que se encuentre disponible para hacerlo.
Servidores de Nombres: En instalaciones grandes, hay un una buena cantidad de colección de nombres que tienen que ser manejados, esto incluye a usuarios y sus passwords, nombre y direcciones de computadoras en la red y cuentas. Resulta muy tedioso estar manejando esta gran cantidad de información, por lo que se puede destinar a una computadora que maneje este sistema, en ocasiones es necesario acceder estos servidores de nombres desde otra computadora a través de la red.
Servidores de Terminales: En algunas ocasiones, no se requiere tener conectadas las terminales directamente a las computadoras, entonces, ellos se conectan a un servidor de terminales. Un servidor de terminales es simplemente una pequeña computadora que solo necesita correr el Telnet (o algunos otros protocolos para hacer el acceso remoto). , Si se tiene una computadora conectada a uno de estos servidores, simplemente se tiene que teclear el nombre de la computadora a la cual se desea conectar. Generalmente se puede tener varios en laces simultáneamente, y el servidor de terminales permitirá hacer la conmutación de una a otra en un tiempo muy reducido.
No hay comentarios:
Publicar un comentario