4.4 Documentacion de Sistemas Distribuidos



El ciclo de vida del desarrollo del software contempla a la documentación como una etapa de gran importancia para el producto final. Resulta crucial guardar las especificaciones establecidas que fundamentan el funcionamiento del software, así como de los componentes a partir de los que se forma la aplicación final.
Se pueden distingir siete roles de usuarios para la documentación del diseño:
1. El administrador del proyecto requiere información para planear, controlar y administrar el proyecto. Debe estar en posibilidades de identificar cada componente del sistema y entender su propósito y funcionamiento.
2. El administrador de configuración necesita información para poder ensamblar varios componentes en un solo sistema y poder controlar los cambios.
3. El diseñador requiere de información acerca del uso y funcionamiento de cada componente, y su interfaz con otros componentes.
4. El programador debe conocer los algoritmos que se utilizarán, las estructuras de datos y la comunicación entre componentes.
5. Se requiere que el probador de unidades conozca información detallada de los componentes, como algoritmos y datos requeridos.
6. Al probador de integración le corresponde conocer las relaciones entre componentes y la función y uso de los componentes envueltos.
7. El programador de mantenimiento debe tener una visión de cómo se satisfacen los requerimientos usando todos los componentes.

4.3 Herramientas de Diseño



Los principios comunes del diseño, proveen un modelo consistente de procesamiento de información a través de un sistema, el cual facilita la tarea de integrar diversos paquetes de aplicaciones en un sistema coherente.

los principios de diseño deben aumentar la productividad, mejorar la reusabilidad del software y facilitar la generación automática de software, a partir de sentencias declarativas de requerimientos. El uso de los principios de diseño reduce también, el tramo que separan la interconexión de sistemas separados

Acontinuacion se resumen 3 componentes disponibles para el desarrollo de aplicaciones distribuidas

CORBA ha existido desde 1990, es un estándar de objetos distribuidos. Permite que una aplicación solicite una operación a ser ejecutada por un objeto distribuido, el que regresará resultados a la aplicación solicitante.

Los datos pueden pasar del cliente al servidor y están asociados a una operación en particular en un objeto en particular, luego se regresan datos al cliente en la forma de una respuesta.

CORBA provee de comunicaciones en un modelo solicitud – respuesta.

DCE fue creada por la Fundación de Software Abierto (OSF, por sus siglas en inglés), que ahora se denomina Open Group [DCE98]. Consiste en múltiples componentes que han sido integrados para trabajar en conjunto. A continuación se listan los componentes que conforman a DCE:
• Llamadas a procedimientos remotos (RPC).
• Servicios de directorios globales e individuales (CDS y GDS).
• Servicios de seguridad.
• Hilos de ejecución DCE.
• Servicio de tiempo distribuido (DTS).
• Sistema de archivos distribuidos (DFS).
Provee nuevas capacidades que van más allá de lo que existe en el mercado con anterioridad. Los servicios de seguridad proveen una forma confiable de determinar si un usuario tiene los derechos para utilizar un determinado recurso o ejecutar alguna acción.

DCOM es la tecnología que permite que componentes de software se comuniquen entre ellos a través de redes de computadoras, DCOM se caracteriza por lo siguiente:
• Rapidez en el desarrollo. Permite a los desarrolladores construir soluciones más rápido, ensamblando software a partir de partes preconstruidas.
• Reducción de los costos de integración. Se requiere menos tiempo para integrar componentes en soluciones completas, ya que existen conjuntos de interfaces comunes, distribuidas por diferentes proveedores.
• Reducción de los costos de mantenimiento. Al aislar la función del software en pequeños componentes provee un mecanismo eficiente de bajo costo para actualizar un componente sin tener que rediseñar toda la aplicación.

4.2 Estandares



Definicion:
Especificacion que regula la realizacion de ciertos procesos o la fabricacion de componentes para garantizar interoperabilidad
Es una propiedad que puede predicarse de sistemas de naturaleza muy diferente, como pueden ser los sistemas informáticos (en cuyo caso se le suele denotar también como neutralidad tecnológica).

La Interoperabilidad es un factor crítico para recoger los beneficios de la telefonía IP y permite a su empresa comunicar y operar como una entidad integrada y altamente efectiva.

Para los sistemas distribuidos son necesarios los estándares por dos razones:

Diversidad. El trabajar en diferentes lugares , la recolección y almacenamiento de la información se realiza en diferentes locaciones. Para lograr una interaccion entre todos,es necesario obtener respuestas rápidas e independencia Los sistemas distribuidos se tienen que adaptar a diferentes requerimientos operacionales.

Fragmentación. Hasta ahora, no existe una arquitectura abierta que facilite la construcción de sistemas distribuidos en una base de diversos vendedores, la cual pueda expandirse a diversos dominios de aplicación.

4.1 Especificaciones de Alto Nivel

Un sistema distribuido es un objeto abstracto que puede usarse invocando a varias operaciones, así que el sistema es una instancia de un tipo de datos abstracto. Las especificaciones de un sistema describen el comportamiento de las operaciones invocadas por los usuarios y si el sistema esta activo, las operaciones que el sistema realizará internamente.

Un sistema puede tener usuarios que trabajen concurrentemente y todos estos usuarios pueden invocar sus operaciones en paralelo.

En las especificaciones, cada operación es vista como una acción atómica. Estas operaciones atómicas poseen dos propiedades importantes:
La serializabilidad se refiere a que la ejecución concurrente de un grupo de acciones es equivalente a la ejecución secuencial de las mismas operaciones.
La totalidad quiere decir que cada operación, o se ejecuta total y exitosamente, o falla y no tiene efecto sobre el estado del sistema.



Un diccionario distribuido.
El diccionario es modelado como un conjunto, con una operación insertar para agregar un elemento al conjunto, borrar para remover un elemento y listar para observar los miembros del conjunto. El objetivo es hacer al sistema altamente disponible, en el sentido de que cualquiera de los nodos con posibilidades de operar, deberían ejecutar cualquiera de las tres operaciones en cualquier momento, sin importar el estado de la red o de los otros nodos.

La implementación funciona procesando cada operación en un sólo nodo, cada uno de los cuales cuenta con una copia del diccionario. Si se realiza una operación de inserción o eliminación en un nodo, sólo se actualiza la copia de ése nodo, y posteriormente, por medio del envío de mensajes, se propagan las modificaciones a los demás nodos del sistema. Debido a que un nodo puede no saber de las operaciones ejecutadas en otros nodos.

UNIDAD IV METODOLOGIA PARA EL DESARROLLO DE PROYECTOS EN SISTEMAS DISTRIBUIDOS




4.1 Especificaciones de Alto Nivel
4.2 Estandares
4.3 Herramientas de Diseño
4.4 Documentacion de Sistemas Distribuidos

3.2 Teoria de Transacciones Anidadas

La estructura de una transacción usualmente se le da el nombre de modelo de la transacción, estas pueden ser planas (simples) o anidadas. Un aspecto muy importante es el mantener y aplicar algoritmos de control sobre los datos o recursos, también se utilizan protocolos que proporcionan confiabilidad:
• Atomicidad.
• Protocolos de recuperación total.
• Protocolos de compromiso global.
El control de las transacciones también requiere de controlar la concurrencia del acceso y uso hacia el recurso que se esta manipulando, ese control de concurrencia tiene 2 objetivos:
1. Como sincronizar la ejecución concurrente de transacciones.
2. Consistencia intratransacción (aislamiento).
Propiedades de las transacciones.
Atomicidad de fallas. Consiste en efectuar todas las transacciones, pero en caso de falla no se realiza ninguna.
Permanencia. Consiste en que una vez completada una transacción satisfactoriamente los cambios ya no pueden perderse.
Seriabilidad. Consiste en asegurarse que los cambios siguen un orden adecuado.
Aborto de transacciones propio para cada transacción. Es la capacidad que se tiene para abortar el proceso transaccional en cualquier punto, el resultado de esta operación no puede ser revelado para otras transacciones.
Punto de inicio y terminación. Consiste en especificar un bloque inicial y un punto que termina el fin de ese bloque.

Dentro de este proceso en bloque los demás usuarios no pueden modificar nada hasta que no se presente un estado estable de los datos, esto ocasiona inconsistencia temporal y conflictos. Para evitar lo anterior se implementan dos maneras diferentes:
Ejecutar transacciones serializadas. Es un sistema que permite el procesamiento de transacciones en forma secuencial o serializado y consiste en asignarle una secuencia a cada transacción, este proceso reduce el rendimiento del sistema.
Ejecutar transacciones calendarizadas. Es un sistema que permite el proceso de transacciones asignándole tiempos de procesamiento el cual permite incrementar el rendimiento del sistema ya que se ejecuta un máximo de proceso en forma concurrente y no a través de una serie.

3.1 Proceso de Transacciones en Sistemas Distribuidos

Las transacciones son un mecanismo que ayuda a simplificar la construcción de sistemas confiables a través de procesos que proveen soporte uniforme para invocar y sincronizar operaciones como:

* Operaciones de compartición de datos.
* Aseguramiento de la seriabilidad de las transacciones con otras.
* Atomicidad en su comportamiento.
* Recuperación de fallas provocadas en red y nodos.

El manejo de transacciones fue desarrollado en el campo de las operaciones financieras donde se tenía 3 reglas básicas:
• Consistencia: Obedecer ciertas reglas.
• Atomicidad: Debe ocurrir completo o abortar.
• Durabilidad: Una vez iniciada una transacción y terminada completamente no puede ser abortada.
• Dentro del área de los sistemas computacionales el concepto de transacciones fue inicialmente utilizado para definir la consistencia entre múltiples usuarios de una base de datos.
Motivos del uso de transacciones.
Los sistemas distribuidos tienen varios aspectos que representan problemas para la integridad de los recursos, los cuales motivan el uso de transacciones:
1. Dificultad para mantener consistencia en los datos.
2. Una misma vía de comunicación no siempre puede ser utilizada para proveer interacción entre 2 procesos.
3. Requerimientos de procesamiento en paralelo.
4. Manejo interactivo de uno o más usuarios

UNIDAD III TRANSACCIONES



3.1 Proceso de Transacciones en Sistemas Distribuidos
3.2 Teoria de Transacciones Anidadas

2.8 Beneficios de Duplicidad

En un sistema distribuido, es común que la información se duplique para mejorar el desempeño y la disponibilidad. Almacenando copias de información compartida en procesadores donde sea frecuentemente accesada, se decrementará el uso de accesos de lectura remotos.

Además, almacenando copias de la información que resulta crítica en procesadores con modos de falla independientes, se aumentará la probabilidad de que estará disponible al menos una copia de la información crítica.

Es común que la duplicidad resulte central al resolver algunos problemas de computación distribuida.
Cualquier demora impuesta por la red a los controladores debe ser resuelta, pero en un sistema donde la información no es duplicada o almacenada en caché, esto es difícil de garantizar debido a la perdida de paquetes. Por lo anterior, los sistemas distribuidos de tiempo real necesitan de algún método para duplicar información crítica requerida en rutas críticas.

La duplicidad de la información beneficia altamente el trabajo en red, ya que en el caso de alguna caída de alguna máquina se puede propagar la falla a otras más. Puede ser necesario tener respaldos de procesos que se restablecerán para completar el proceso interrumpido.

2.7 Fallos de Particion



Cuando llega a fallar la comunicación entre dos sitios que contienen copias de los mismos datos lógicos, se hace difícil asegurar la consistencia mutua entre las copias. Las fallas más dañinas son las fallas de partición, las cuales fragmentan la red en subredes aisladas llamadas particiones. A menos que las fallas de partición sean detectadas y reconocidas por todos los procesadores afectados, las modificaciones independientes y no coordinadas pueden aplicarse a las diferentes copias de la información, comprometiendo la correctitud (integridad) de ella.

Sin embargo, los problemas relacionados con el funcionamiento correcto de un sistema de archivos distribuidos particionado no se limita sólo a aquellos asociados con que la información almacenada sea correcta. Debido al costo y la complejidad de mantener información duplicada, la mayoría de los sistemas de archivos distribuidos limitan la cantidad de réplicas a algunas cuantas copias. Ya que la información no se encuentra duplicada en todos los sitios de la red, se pueden montar consultas durante una partición de la red, por lo que no toda la información se encuentre disponible en determinado momento.

2.6 Duplicidad de Datos



Se usa la duplicidad de los datos para mantener en línea copias de información y de otros recursos. La duplicidad resulta un campo clave en los sistemas distribuidos, ya que provee un mejor desempeño, alta disponibilidad y tolerancia a fallas.

A continuación se mencionan algunas de las razones principales de la duplicidad.

• Desempeño. La réplica de información puede ser usada para incrementar el tiempo de respuesta a un servicio, ya que la información compartida por un número grande de usuarios no debería ser almacenada en un sólo sitio, pues esa computadora se convertiría en un cuello de botella y aumentarían los tiempos de respuesta. Es preferible distribuir varias copias de información en varios servidores y lograr que cada uno de ellos atienda a un número de usuarios más reducido.
• Disponibilidad. Al tener varias copias de información en dos o más servidores independientes a fallas ejecutando software similar, si llegase a fallar el servidor por defecto, el software cliente puede accesar a un servidor alternativo y obtener los servicios requeridos.
• Tolerancia a fallas. Si cada uno de los servidores de una colección procesa en paralelo cada petición de un cliente, entonces es posible garantizar el procesamiento correcto de una petición, aún si uno o más de los servidores llegaran a fallar.
El mayor requerimiento que se presenta al duplicar información, es la transparencia de almacenamiento. Esto quiere decir que los usuarios no deben preocuparse o tener en cuenta de que existen varias copias físicas de la información.

Otro requerimiento para la información duplicada es la consistencia. Consideremos el caso en que los clientes hacen peticiones de lectura y de escritura a un conjunto de partidas en la información. No es correcto que diferentes clientes que realicen la misma operación que afectan al mismo grupo de datos, obtengan diferentes resultados.

2.5 Archivos Distribuidos

Todos los usuarios en un sistema distribuido son creadores y consumidores potenciales de información. En ocasiones, los usuarios desearían modificar o consultar su información desde una terminal remota; lo que trae que la ubicación física o territorial del usuario requiere que la información esté disponible desde cualquier lugar. El gran reto técnico a esta necesidad, es lograr que la información que sea compartida o no, esté segura, sea confiable y eficiente, en una forma en que no importe el tamaño del sistema distribuido.

Los sistemas de archivos distribuidos son la principal clase de mecanismos que han evolucionado para compartir información en un ambiente de múltiples usuarios.

Al hablar de archivos, debemos tener en cuenta el medio de almacenamiento para éstos; y debemos hablar de medios de almacenamiento permanente. Los medios de almacenamiento permanente consisten en un conjunto de objetos que explícitamente desde su creación, son inmunes a fallas del sistema, y persisten hasta que son físicamente destruidos.

En un modelo de un sistema de computación con un sólo usuario, en un sólo sitio de procesamiento; se observan cuatro apartados clave en el sistema de archivos:

1. Nombres. Tiene que ver con la forma en que los usuarios pueden nombrar a los archivos, que tan largos pueden ser los nombres de los archivos o si tienen alguna extensión.
2. Interfaz de programación. Contempla la forma en los archivos serán accesados desde las aplicaciones, ya sea por un mapa en donde se dirigen los archivos a una dirección de memoria usada por un proceso y accesar su contenido como si fuese memoria virtual, o incorporar en el sistema operativo una serie de operaciones para tratar a los archivos.
3. Almacenamiento físico. Trata en la forma en que será llevada a cabo la organización de los archivos en los medios de almacenamiento físico, si la interfaz de programación es independiente del medio de almacenamiento, como se balancean los requerimientos de ejecución con los problemas de fragmentación.
4. Integridad. Se debe considerar la consistencia de los archivos en contra de fallas en la alimentación eléctrica, hardware, medio de almacenamiento y software.

2.4 Seguridad



La seguridad y la protección se encargan del control del uso y del acceso no autorizado a los recursos de hardware y software de un sistema de computación, ya que organizaciones de negocios y oficinas de servicios usan en gran medida a las computadoras para almacenar información, por lo que es necesario prevenir su uso y acceso no autorizado.

Podemos clasificar a las violaciones de seguridad en tres categorías :

• Liberación no autorizada de información. Ocurre cuando una persona no autorizada tiene la posibilidad de leer y tomar ventaja de la información almacenada en una computadora. También se incluye el uso no autorizado de un programa.
• Modificación no autorizada de información. Este tipo de violación se da cuando una persona tiene la posibilidad de alterar la información almacenada en un sistema computacional.
• Bloqueo no autorizado de servicios. Se da cuando una persona no autorizada bloquea la capacidad de algún usuario autorizado, a accesar la información almacenada en un sistema computacional.

La seguridad en los sistemas computacionales puede dividirse en dos tipos:

• La seguridad externa (llamada comúnmente seguridad física), se encarga de regular el acceso al hardware del sistema, incluyendo: discos, cintas, reguladores y no-breaks, acondicionadores de aire, terminales, procesadores.
• La seguridad interna se encarga del acceso y uso del software almacenado en el sistema. A diferencia de la seguridad física, existe el tema de autenticación, en el cual el usuario se registra (login) en el sistema para accesar a los recurso de hardware y software del mismo.

2.3 Proteccion



La seguridad en los sistemas de computadoras incluye muchos aspectos: confiabilidad, autenticidad, integridad, privacía; y se relaciona con la prevención de que usuarios no autorizados hagan uso de los datos y recursos.

Los mecanismos que previenen el acceso no autorizado se denominan como mecanismos de protección. Podemos hablar de la protección como una área que abarca varios aspectos de la seguridad.
El fin de estos mecanismos es el de prevenir que algunos usuarios puedan robar espacio en disco, ciclos de procesamiento, que los archivos no sean leídos por personas ajenas o que modifiquen bases de datos que no les pertenezcan. Los mecanismos de protección tienen que poner atención en los siguientes temas:
1. Privacidad de almacenamiento. Se refiere a que los usuarios deben poder mantener su información en secreto.
2. Privacidad en el paso de mensajes. La privacidad tiene que ver con que a los usuarios se les garantice que la información que entreguen sea usada solamente para los propósitos para los que fue remitida.
3. Autenticidad. La información que se entregue a algún usuario debe ser auténtica, es decir; se debe poder verificar y asegurar la fuente de donde proviene la información.
4. Integridad. La información almacenada por el sistema no debe ser corrupta ya sea por el sistema o por algún usuario no autorizado.
Es común que asociemos los derechos para accesar ciertos objetos a cierta persona en específico y los derechos de acceso comúnmente son pasados de un usuario (o servidor), a cualquier proceso ejecutado por ese usuario. Se usa el término dominio para indicar al conjunto de cosas (usuarios, servidores y procesos) que pueden accesar a ciertos objetos.

Los objetos resguardados por los mecanismos de protección van desde los archivos y los directorios, hasta los procesos, y aún los mismos dominios de protección.

2.2 Criptografia



En un sistema en el que participan varios usuarios, existe la posibilidad de que algún usuario no autorizado intente tener acceso a información confidencial. Debido a esto, es necesario agregar otros mecanismos de protección para que los intrusos (usuarios no autorizados), si logran irrumpir en el sistema; no entiendan o hagan uso de la información que puedan obtener de manera no autorizada.

La criptografía es un proceso para transformar datos, generalmente texto claro a un texto clave o cifrado, y que sólo puede ser convertido nuevamente en un texto claro y entendible usando una llave en particular y aplicándole un algoritmo apropiado. Por lo general, las técnicas de criptografía se aplican antes de que la información sea almacenada o transmitida por algún canal físico, en el caso de una red. Existen varios tipos o categorías en que se clasifican las técnicas de encriptación de información.

Sistemas de encriptación

• Sistemas convencionales
• Sistemas modernos
• Sistemas de llave pública
• Sistemas de llave privada

Sistemas convencionales de encriptación.
Este tipo de encriptación se basa en la sustitución de cifras, en la cual, cada caracter en un texto claro o base es sustituido por otro caracter. Existen varias técnicas:

• Cifra Caesar.
En éste método, cada letra del texto original se transforma en la tercer letra siguiente Por ejemplo, "CASA" es transformado en "FDVD", de acuerdo al equivalente en la tabla de códigos ASCII.
Los problemas principales con esta técnica son que 1) ya que la transformación es lineal, determinar la llave es muy simple y 2) el número de llaves es muy pequeño ya que se restringe al tamaño del código usado (ASCII en el ejemplo).

• Sustitución simple.
En este método, cualquier permutación de letras puede ser identificado al lenguaje Español o Inglés y elimina la relación posicional de la Cifra Caesar, debido a que cada permutación de letras es una llave, hay (>1026) llaves en una cifra como ésta, lo que hace muy costosa una búsqueda exhaustiva. Sin embargo, la cifra por sustitución simple preserva la frecuencia de sustitución de las letras de un alfabeto porque se ejecuta la misma sustitución en todas las ocurrencias de una letra, y puede usarse un análisis estadístico para desencriptar la cifra.

• Cifra polialfabética.
La cifra polialfabética usa una secuencia periódica de n letras de sustitución, es decir; el método actúa con n sustituciones alfabéticas periódicamente. Este método puede tener un mayor impacto si se escoge apropiadamente la sustitución. Una forma de aplicar este método es usar la Cifra Caesar con diferentes llaves. Por ejemplo, se puede tener la secuencia de enteros 11, 19, 4, 22, 9, 25 y se obtendría el texto cifrado agregando repetidamente cada entero al texto original.
Este método es también vulnerable, porque si se conoce el periodo (secuencia de enteros), las diferentes cifras de cada periodo se pueden determinar por una búsqueda exhaustiva.

Sistemas modernos de encriptación
Usan información representada en forma binaria. Generalmente, en estos métodos se conocen las técnicas de encriptación y desencriptación, pero la llave requerida para desencriptar el texto cifra se mantiene en secreto. Los esquemas de criptografía moderna se basan en el principio de la búsqueda exhaustiva, aunque se conozca el mecanismo de desencriptación, el procedimiento de desencriptación es tan intensivo computacionalmente, que tomaría un tiempo prohibitivo para encontrar la llave.

Método de llave privada
La criptografía por llave privada se ha convertido en un estándar. Fue desarrollado por IBM. Este método es conocido como el Estándar de Encriptación de Datos (DES, por sus siglas en inglés), y utiliza básicamente dos operaciones:
Se usa una operación de permutación para permutar los bits de una palabra y su objetivo es difundir o esparcir la correlación y las dependencias entre los bits de una palabra.
Una operación de sustitución reemplaza una entrada de m bits por una salida n de bits, sin que exista una relación directa entre ambas. Generalmente, una operación de sustitución consta de tres pasos: primero, la entrada de m bits se convierte a una forma decimal; segundo, se permuta la forma decimal (para obtener otro número decimal); y finalmente, la salida decimal se convierte en una salida de n bits.

Método de llave pública
El método de encriptación por llave privada (así como los métodos convencionales) requiere la distribución de llaves secretas a través de una red de comunicaciones insegura, antes de que se pueda tener una comunicación segura. Este problema es conocido como problema de distribución de llaves.
El método de criptografía por llave pública resuelve este problema anunciando al dominio público el método de encriptación E (y su llave asociada); sin embargo, se mantiene secreto el método de desencriptación D (y su llave asociada).

2.1 Nombres

En un sistema distribuido, se usa algún nombre para hacer referencia a algún recurso como nodos de procesamiento (computadoras), puertos, servicios y usuarios. Los nombres son útiles al momento en que se desea establecer una comunicación o compartir recursos en un sistema distribuido. A continuación se listan algunos tipos de nombres:

• Identificadores de puertos y procesos.
• Nombres textuales de servicios.
• Identificadores de recursos.
• Nombres de archivos.
• Direcciones físicas y lógicas de redes.

Debido a que en un sistema distribuido los administradores de sistemas tienen que hacer referencia a la mayoría de los componentes del sistema y configuración del mismo, que los programadores tienen que hacer referencia a los servicios por su nombre y los usuarios necesitan comunicarse entre ellos, los nombres deben ser totalmente legibles.
A la asociación entre un nombre y un objeto se llama liga o conexión.

Servicio de nombres.

En sistemas distribuidos, el uso de nombres para propósitos de comunicación no es del todo suficiente, por que los procesos de comunicación van de una computadora a otra, y es necesario el conocimiento de su ubicación. Esto nos lleva al problema de los nombres en un sistema de comunicaciones. Existen tres conceptos básicos en esta área:
• El nombre de un objeto, por ejemplo un recurso o servidor; especifica lo que busca un proceso.
• Una dirección especifica dónde se encuentra el objeto.
• Una ruta especifica cómo llegar ahí.

UNIDAD II ALMACENAMIENTO DE DATOS




2.1 Nombres
2.2 Criptolgrafia
2.3 Proteccion
2.4 Seguridad
2.5 Archivos Distribuidos
2.6 Duplicidad de Datos
2.7 Fallos de Particion
2.8 Beneficios de Duplicidad