Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Definiciones y características
Un sistema distribuido se caracteriza por ser un conjunto de procesadores (nodos), cada
uno de ellos con su propia memoria local, que no es compartida, y con su propio reloj. Sus
componentes se comunican entre sí y coordinan sus acciones a través de diversas redes,
como los buses de alta velocidad únicamente mediante el paso de mensajes, es decir, es
una colección de nodos débilmente acoplados e interconectados por una red de
comunicaciones. Desde el punto de vista de un nodo concreto de un sistema distribuido,
el resto de los nodos y sus respectivos recursos son remotos, mientras que sus propios
recursos son locales. Es casi seguro que todos hemos utilizado algún tipo de servicio
distribuido.
Los nodos de un sistema distribuido pueden variar en tamaño y función. Pueden incluir
pequeños microprocesadores, computadoras personales y grandes sistemas informáticos
de propósito general. Estos procesadores reciben varios nombres, como procesadores,
sitios, máquinas y hosts, dependiendo del contexto en el que se mencionen.
Principalmente utilizamos sitio para indicar la ubicación de una máquina y nodo para
referirnos a un sistema específico en un sitio. Los nodos pueden existir en una
configuración cliente-servidor, una configuración peer-to-peer, o un híbrido de éstas. En la
configuración común cliente-servidor, un nodo en un sitio, el servidor, tiene un recurso
que otro nodo, el cliente (o usuario), desea utilizar. En una configuración de igual a igual,
Cuando varios sitios están conectados entre sí por una red de comunicación, los usuarios
de los distintos sitios pueden intercambiar información. A bajo nivel, los mensajes se
transmiten entre sistemas, de la misma forma que los mensajes se transmiten entre
procesos en el sistema de mensajes de un solo computador. Dado el paso de mensajes,
toda la funcionalidad de nivel superior que se encuentra en los sistemas autónomos
puede ampliarse para abarcar el sistema distribuido. Estas funciones incluyen el
almacenamiento de archivos, la ejecución de aplicaciones y las llamadas a procedimientos
remotos (RPC). Hay cuatro razones principales para construir sistemas distribuidos:
compartir recursos, aumentar la velocidad de cálculo, la fiabilidad y la comunicación.
Compartición de recursos
Si varios sitios diferentes, con diferentes capacidades, están conectados entre sí, entonces
un usuario en un sitio puede ser capaz de utilizar los recursos disponibles en otro. Por
ejemplo, un usuario del sitio A puede consultar una base de datos ubicada en el sitio B.
Mientras tanto, un usuario del sitio B puede acceder a un archivo que reside en el sitio A.
En general, la compartición de recursos en un sistema distribuido proporciona
mecanismos para compartir archivos en sitios remotos, procesar información en una base
de datos distribuida, imprimir archivos en sitios remotos, utilizar dispositivos de hardware
especializados remotos, como un supercomputador o una unidad de procesamiento
gráfico (GPU), y realizar otras operaciones.
Si un cálculo concreto puede dividirse en una serie de cálculos de menor envergadura que
pueden ejecutarse simultáneamente, un sistema distribuido nos permite distribuir la serie
de cálculos entre los distintos sitios. Estos cálculos de menor envergadura pueden
ejecutarse simultáneamente y, por tanto, aumentar la velocidad de cálculo. Esto es
especialmente importante cuando se procesan grandes conjuntos de datos a gran escala
(como el análisis de grandes cantidades de datos de clientes en busca de tendencias).
Además, si un sitio concreto está sobrecargado de peticiones, algunas de ellas pueden
trasladarse o redirigirse a otros sitios menos cargados. Este movimiento de trabajos se
Fiabilidad
Si falla una instalación en un sistema distribuido, las restantes pueden seguir funcionando,
lo que confiere al sistema una mayor fiabilidad. Si el sistema está compuesto por múltiples
instalaciones autónomas de gran tamaño (es decir, computadoras de uso general), la falla
de una de ellas no debería afectar al resto. Si, por el contrario, el sistema está compuesto
por máquinas diversificadas, cada una de las cuales es responsable de alguna función
crucial del sistema (como el servidor web o el sistema de archivos), entonces un solo falla
puede detener el funcionamiento de todo el sistema. En general, con una redundancia
suficiente (tanto en hardware como en datos), el sistema puede seguir funcionando,
aunque fallen algunos de sus nodos.
La falla de un nodo o sitio debe ser detectado por el sistema, y puede ser necesaria una
acción apropiada para recuperarse de la falla. El sistema no debe seguir utilizando los
servicios de ese sitio. Además, si la función del sitio que ha fallado puede ser asumida por
otro sitio, el sistema debe garantizar que la transferencia de función se produce
correctamente. Por último, cuando el sitio averiado se recupere o se repare, deben existir
mecanismos para integrarlo de nuevo en el sistema sin problemas.
Comunicación
Cuando varios sitios están conectados a través de una red de comunicaciones, los usuarios
de distintos nodos pueden intercambiar información. A bajo nivel, los mensajes se pasan
entre sistemas de forma similar a como se pasan los mensajes entre procesos en los
sistemas de mensajería ya comentados. Con un mecanismo de paso de mensajes, toda la
funcionalidad de alto nivel que puede encontrarse en los sistemas autónomos puede
ampliarse para abarcar el sistema distribuido. Estas funciones incluyen la transferencia de
archivos, los inicios de sesión, el correo electrónico y las llamadas a procedimientos
remotos (RPC).
Las ventajas de los sistemas distribuidos han provocado una tendencia a la baja en todo el
sector. Muchas empresas llevan tiempo sustituyendo sus computadoras centrales por
redes de computadoras personales, obteniendo mejor funcionalidad por el mismo costo,
más flexibilidad a la hora de ubicar recursos y ampliar instalaciones, mejores interfaces de
usuario y un mantenimiento mucho más sencillo.
Ventajas
Economía
Velocidad
Distribución inherente
Ciertas aplicaciones son distribuidas en forma inherente, porque utilizan máquina que
están separadas a cierta distancia. Por ejemplo, una cadena de supermercados tiene su
stock, pero conviene que cada supermercado maneje el suyo, pero sin embargo en cierto
momento podría interesar a cierto sector conocer el stock total de todas las sucursales.
Confiabilidad
Desventajas
Seguridad
Redes
Concurrencia
Cada integrante de la red realiza trabajos independientes, pero también pueden compartir
recursos en modo concurrente. Se debe proteger al sistema de los probables conflictos de
concurrencia.
Cada máquina tiene su propio reloj y estos tienen límite de precisión, por lo tanto, a través
de ellos no se puede lograr una sincronización perfecta.
Fallas independientes
Cualquier componente de la red puede fallar sin que el resto de los componentes perciban
esta falla.
Internet
Es un sistema distribuido muy grande constituido por una colección de redes de diferentes
tipos interconectadas y permite que un programa que se está ejecutando en cualquier
parte dirija mensajes a otros programas en cualquier otra parte. Los programas se pueden
ejecutar en programas conectados a la red e interactúan mediante el pasaje de mensajes
empleando un medio de comunicación común.
Intranets
Es una porción de Internet, con las mismas características, pero tiene un límite de acción
que permite hacer cumplir con políticas de seguridad. Puede estar constituida por una o
Resulta conveniente definir en este momento ciertos términos altamente vinculados con
los sistemas operativos distribuidos:
Servicio
Servidor
Clientes
Una computadora con un flujo de instrucciones y uno de datos se llama SISD (Single
Instructionstream, Single Data Stream). Todas las computadoras tradicionales de un
procesador caen dentro de esta categoría desde las computadoras personales hasta los
grandes mainframes. Las computadoras SISD representan la mayoría de las máquinas
seriales. Tienen una UCP que ejecuta una
instrucción en un momento dado y busca o
guarda un dato en un momento dado. Este
es el concepto de arquitectura en serie de
von Neumann donde, en cualquier
momento, sólo se está ejecutando una
SISD
única instrucción. A menudo a los SISD se
les conoce como computadoras en serie escalares. Todas las máquinas SISD poseen un
registro simple que se llama contador de programa que asegura la ejecución en serie del
programa. Conforme se van leyendo las instrucciones de la memoria, el contador de
programa se actualiza para que apunte a la siguiente instrucción a procesar en serie.
Prácticamente ninguna computadora puramente SISD se fabrica hoy en día ya que la
mayoría de los procesadores modernos incorporan algún grado de paralelización como es
la segmentación de instrucciones o la posibilidad de lanzar dos instrucciones a un tiempo
(superescalares).
Tenemos dos formas de ver el flujo de datos de la figura. Una es considerar la clase de
máquinas que requerirían que unidades de procesamiento diferentes recibieran
instrucciones distintas operando sobre los mismos datos (FD2). Esta clase de arquitectura
ha sido clasificada por numerosos arquitectos de computadores como impracticable o
Por último, está el esquema MIMD (Multiple Instruction Stream, Multiple Data Stream),
que significa un grupo de CPU’s independientes, cada una con su propio contador de
programa y datos, que operan
como parte de un sistema más
grande. Todos los sistemas
distribuidos y la mayoría de los
procesadores en paralelo caen
dentro de esta categoría. Las
MIMD son las más complejas, pero
son también las que
potencialmente ofrecen una
mayor eficiencia en la ejecución
concurrente o paralela. Aquí la
concurrencia implica que no sólo
MIMD hay varios procesadores operando
simultáneamente, sino que además
Cabe acotar que, la taxonomía de Flynn ha demostrado funcionar bastante bien para la
tipificación de sistemas, y se ha venido usando desde hace varias décadas por la mayoría
de los arquitectos de computadoras. Sin embargo, los avances en tecnología y diferentes
topologías, han llevado a sistemas que no son tan fáciles de clasificar dentro de los 4 tipos
de Flynn. Por ejemplo, los procesadores vectoriales no encajan adecuadamente en esta
clasificación, ni tampoco las arquitecturas híbridas. Para solucionar esto se han propuesto
otras clasificaciones, donde los tipos SIMD y MIMD de Flynn se suelen conservar, pero que
sin duda no han tenido el éxito de la de Flynn. Además, podemos decir que, al existir una
división borrosa entre MIMD y SIMD, aparecieron las categorías FPMD y SPMD, ninguna
de ellas definida por Flynn, pero ambas muy usadas en la actualidad:
FPMD (Few Program Multiple Data), algo similar a SPMD, puesto que se copia un
número reducido de programas.
SPMD (Single Program Multiple Data), es aquella en la que un mismo programa es
copiado y ejecutado por todos los procesadores, operando sobre diferentes datos.
Puede ser considerada como un caso particular de MIMD.
Otro ejemplo para mencionar es el de las computadoras paralelas, que aparecen tanto
como configuraciones SISD, SIMD o MIMD. De estas tres, las SIMD parecen las más
apropiadas para aplicaciones específicas, mientras que, la tendencia arquitectural para las
futuras computadoras de propósito general apunta a las MIMD con memorias distribuidas
proveyendo un espacio de direccionamiento globalmente compartido.
De estos tres, en esta sección, describiremos las dos primeras categorías: los sistemas
operativos de red y los sistemas operativos distribuidos. Los sistemas operativos de red
En un sistema operativo distribuido, los usuarios acceden a los recursos remotos del
mismo modo que acceden a los recursos locales. La migración de datos y procesos de un
sitio a otro está bajo el control del sistema operativo distribuido. Dependiendo de los
objetivos del sistema, éste puede implementar la migración de datos, la migración de
cálculos, la migración de procesos o cualquier combinación de éstas.
Migración de datos
Supongamos que un usuario del sitio A desea acceder a datos (como un archivo) que
residen en el sitio B. El sistema puede transferir los datos mediante uno de dos métodos
básicos. Un método de migración de datos consiste en transferir todo el archivo al sitio A.
A partir de ese momento, todo acceso al archivo es local. Cuando el usuario ya no necesita
El otro enfoque consiste en transferir al sitio A sólo las partes del archivo necesarias para
la tarea inmediata. Si más adelante se necesita otra porción, se realizará otra
transferencia. Cuando el usuario ya no quiera acceder al archivo, cualquier parte de este
que haya sido modificada deberá enviarse de nuevo al sitio B. Obsérvese la similitud con la
paginación bajo demanda. La mayoría de los sistemas distribuidos modernos utilizan este
enfoque.
Sea cual sea el método utilizado, la migración de datos incluye algo más que la mera
transferencia de datos de un sitio a otro. El sistema también debe realizar varias
traducciones de datos si los dos sitios implicados no son directamente compatibles, por
ejemplo, si utilizan diferentes representaciones de códigos de caracteres o representan
números enteros con un número u orden de bits diferente.
Migración de cálculos
Cualquiera de los dos métodos podría utilizarse para acceder a varios archivos (o trozos de
archivos) que residen en varios sitios. Una RPC podría resultar en la invocación de otra
RPC o incluso en la transferencia de mensajes a otro sitio. Del mismo modo, el proceso Q
podría, durante su ejecución, enviar un mensaje a otro sitio, que a su vez crearía otro
proceso. Este proceso podría enviar un mensaje de vuelta a Q o repetir el ciclo.
Migración de procesos
Equilibrado de carga
Los procesos, o subprocesos, pueden distribuirse entre los sitios para igualar la carga de
trabajo.
Preferencias hardware
El proceso puede tener características que lo hagan más adecuado para su ejecución en
algún procesador especializado, como la inversión de matrices en una GPU, que en un
microprocesador.
Preferencias software
El proceso puede requerir un software que sólo está disponible en un sitio concreto y, o
bien el software no puede trasladarse, o bien es menos costoso trasladar el proceso.
Acceso a datos
Al igual que en la migración de cálculos, si los datos que se utilizan en el cálculo son
numerosos, puede ser más eficiente hacer que un proceso se ejecute a distancia, por
Utilizamos dos técnicas complementarias para trasladar procesos en una red informática.
En la primera, el sistema puede intentar ocultar al cliente que el proceso ha migrado. Así,
el cliente no necesita codificar explícitamente su programa para realizar la migración. Este
método suele emplearse para lograr el equilibrio de la carga y el aumento de la velocidad
de cálculo entre sistemas homogéneos, ya que no necesitan que el usuario les ayude a
ejecutar programas a distancia. El otro enfoque consiste en permitirle, o exigirle, al
usuario que especifique explícitamente cómo debe migrar el proceso. Este método suele
emplearse cuando el proceso debe trasladarse para satisfacer una preferencia de
hardware o software.
Por desgracia, la tolerancia a fallas puede ser difícil y costosa de implantar. En la capa de
red, se necesitan múltiples rutas de comunicación redundantes y dispositivos de red como
conmutadores y enrutadores para evitar una falla de comunicación. Una falla en el
almacenamiento puede causar la pérdida del sistema operativo, las aplicaciones o los
datos. Las unidades de almacenamiento pueden incluir componentes de hardware
redundantes que se sustituyen automáticamente entre sí en caso de falla. Además, los
sistemas RAID pueden garantizar el acceso continuo a los datos incluso en caso de falla de
uno o varios dispositivos de almacenamiento.
Detección de fallas
El sitio A puede intentar diferenciar entre una falla de enlace y una falla de sitio enviando
un mensaje ¿Estás funcionando? a B por otra ruta, si existe. Cuando B recibe este
mensaje, responde inmediatamente de forma positiva. Esta respuesta positiva le dice a A
que B está conectado y que la falla está en el enlace directo entre ellos. Como no sabemos
de antemano cuánto tardará el mensaje en viajar de A a B y viceversa, debemos utilizar un
esquema de tiempo de espera. En el momento en que A envía el mensaje ¿Estás
funcionando?, especifica un intervalo de tiempo durante el cual está dispuesto a esperar
la respuesta de B. Si A recibe el mensaje de respuesta dentro de ese intervalo de tiempo,
entonces puede concluir con seguridad que B está funcionando. Sin embargo, si no es así,
es decir, si se vence ese intervalo de tiempo, entonces A sólo puede concluir que se ha
producido una o más de las siguientes situaciones:
Reconfiguración
Recuperación de fallas
Cuando se repara un enlace o sitio que ha fallado, debe integrarse en el sistema con
elegancia y sin problemas.
Transparencia
Escalabilidad
1
La deduplicación de datos es un proceso que elimina las copias excesivas de los datos y reduce
significativamente los requisitos de capacidad de almacenamiento.
Problemas internos
Amenazas externas
Modelo cliente-servidor
Además de los clientes y los servidores, el tercer ingrediente esencial del entorno
cliente/servidor es la red. La computación cliente/servidor es típicamente una
computación distribuida. Los usuarios, las aplicaciones y los recursos se distribuyen en
respuesta a las necesidades de la empresa y están conectados por una única LAN o WAN o
Internet.
¿Qué requisitos de diseño deberían presentar las arquitecturas distribuidas? ¿En qué se
diferencia la configuración cliente/servidor de otras soluciones de procesamiento
distribuido? Existen una serie de características que, juntas, diferencian a la filosofía
cliente/servidor de otros tipos de procesamiento distribuido:
Es imperativo que los usuarios tengan aplicaciones de fácil manejo en sus sistemas.
Esto da al usuario un gran control sobre el tiempo y el estilo de uso del
computador y da a los gestores del departamento la capacidad de responder a sus
necesidades locales.
Aunque las aplicaciones están dispersas, se hace hincapié en la centralización de
las bases de datos corporativas y de muchas funciones de gestión y utilidad de la
red. Esto permite a la dirección de la empresa mantener el control general de la
inversión total en sistemas de computación e información y proporcionar
interoperabilidad para que los sistemas estén vinculados entre sí. Al mismo
Toda la lógica de aplicación, es decir el software para el análisis de datos, está en la parte
del cliente, mientras que el servidor sólo se preocupa de la gestión de la base de datos.
Que esta configuración sea la apropiada, depende del estilo y del propósito de la
aplicación. Por ejemplo, supongamos que el propósito general es proporcionar acceso on-
line para la búsqueda de registros. Supongamos que el servidor está manteniendo una
base de datos con 1 millón de registros, y el cliente quiere realizar una búsqueda que
devolverá cero, uno, o como mucho unos pocos registros. El usuario podría buscar estos
registros utilizando una serie de criterios de búsqueda, por ejemplo, registros anteriores a
2019; registros de individuos de Córdoba; registros de un determinado evento o
característica, etc. Una consulta inicial del cliente puede llevar asociada la respuesta de
que hay 100.000 registros que satisfacen estos criterios. El usuario añade información
adicional y vuelve a realizar la consulta. Esta vez, la respuesta indica que hay 1000 posibles
registros. Finalmente, el cliente manda una tercera consulta con más información. El
resultado de la búsqueda lleva a un solo registro, que se le devuelve al cliente.
Claramente, este último escenario no es admisible. Una solución a este problema, que
mantendría la arquitectura cliente/servidor con todos sus beneficios, es trasladar parte de
la lógica de aplicación al servidor. Es decir, se puede equipar al servidor con lógica de
aplicación que realice análisis de datos además de recepción y búsqueda de datos.
Dentro del marco general cliente/servidor, hay una serie de implementaciones que
dividen el trabajo entre el cliente y el servidor de diferente manera. Aunque son posibles
otras divisiones y, para otra clase de aplicaciones, se podrían realizar caracterizaciones
diferentes, podemos definir las cuatro clases siguientes:
Procesamiento cooperativo
Las configuraciones en que gran parte de la carga está en la parte cliente, es decir los
casos de procesamiento basado en el cliente y procesamiento cooperativo, modelo
denominado cliente pesado (fat client) se ha popularizado gracias a herramientas de
desarrollo de aplicaciones como PowerBuilder de Sybase Inc. o SQL Windows de Gupta
Corp. Las aplicaciones desarrolladas con estas herramientas suelen ser departamentales y
soportan entre 25 y 150 usuarios. La principal ventaja de este modelo es que se beneficia
de la potencia de los computadores personales, descargando a los servidores y
haciéndolos más eficientes y menos propensos a ser el cuello de botella.
Existen, sin embargo, varias desventajas en la estrategia de los clientes pesados. Añadir
nuevas funcionalidades suele sobrecargar la capacidad de los computadores personales,
forzando a las compañías a actualizarse. Si el modelo sale del departamento y se
incorporan muchos usuarios, la compañía debe instalar redes locales (LAN) de alta
capacidad para dar soporte al gran número de transmisiones entre los servidores ligeros y
los clientes pesados. Por último, es difícil mantener, actualizar o reemplazar aplicaciones
distribuidas entre decenas o centenas de computadores. Otro enfoque es el denominado
enfoque de cliente ligero. Este enfoque imita al enfoque tradicional centralizado del host y
es, a menudo, la ruta de migración para pasar las aplicaciones corporativas de los
mainframes a un entorno distribuido.
Cuando la caché contiene siempre copias exactas de los datos remotos, decimos que las
cachés son consistentes. Es posible que las cachés se vuelvan inconsistentes cuando se
cambian los datos remotos y no se descartan las correspondientes copias locales en la
caché. Esto puede suceder si un cliente modifica un archivo que también está en la caché
de otro cliente. El problema es doble. Si el cliente adopta la política de escribir
inmediatamente en el servidor los cambios de un archivo, cualquier otro cliente que tenga
Middleware
Para lograr los verdaderos beneficios del mecanismo cliente/servidor, los desarrolladores
deben tener un conjunto de herramientas que proporcionen una manera y estilo de
acceso uniforme a los recursos del sistema a través de todas las plataformas. Esto
permitirá a los programadores construir aplicaciones que no sólo parezcan iguales en
todos los computadores personales y estaciones de trabajo, sino que utilicen el mismo
método para acceder a los datos, independientemente de la localización de estos. La
forma más común de cumplir estos requisitos es a través del uso de interfaces de
programación y protocolos estándares entre la aplicación y el software de comunicaciones
y el sistema operativo. Estas interfaces de programación y protocolos se denominan
middleware.
Hay diversos paquetes de middleware, que varían desde los muy sencillos a los muy
complejos. Lo que tienen todos en común es la capacidad de esconder la complejidad y
disparidad de los diferentes protocolos de red y sistemas operativos. De esta forma un
usuario puede fijar una estrategia middleware particular y montar equipos de varios
proveedores que soporten esa estrategia. El papel exacto del middleware dependerá del
estilo de computación cliente/servidor utilizado.
Como ejemplo, consideremos un sistema distribuido utilizado para dar soporte, entre
otras cosas, al departamento de personal. Los datos básicos del empleado, tales como su
nombre y dirección, pueden estar almacenados en una base de datos Gupta, mientras que
la información de su salario puede estar en una base de datos Oracle. Cuando un usuario
en el departamento de personal quiere acceder a un registro en particular, no se quiere
preocupar de qué tipo de base de datos contiene los registros.
El middleware proporciona una capa de software que permite un acceso uniforme a estos
sistemas diferentes. Esta capa de software tiene como objetivo enmascarar la
heterogeneidad de las plataformas y proporcionar un modelo de programación
conveniente para los programadores de aplicaciones. Proporciona bloques para construir
componentes de software que puedan trabajar con otros sistemas distribuidos. Entre
otras cosas mejora la comunicación entre programas de aplicación soportando:
Respecto de las limitaciones del middleware se puede decir que, aunque ha conseguido
mucho en la simplificación de la programación en los sistemas distribuidos, todavía
algunos aspectos de confiabilidad necesitan soporte del nivel de aplicación. Los programas
distribuidos requieren comprobaciones, mecanismos de corrección de errores y medidas
de seguridad, donde algunas de las cuales necesitan datos de direcciones de la capa de
aplicación y no les basta con la de middleware.
Servidores
Clientes e iguales
Los modelos arquitectónicos que se detallarán pueden proporcionar sólo una versión
simplificada de los patrones de distribución más importantes. Seguidamente se presentan
los principales modelos arquitectónicos sobre los que se basa la división de
responsabilidades de los componentes del sistema (aplicaciones, servidores y otros
procesos).
Tiempo de ejecución de cada etapa definido por su límite inferior y superior que
debe ser suficientemente conocido.
Cada mensaje transmitido debe tener un tiempo límite conocido.
Velocidad de procesamiento.
Retardo de transmisión de mensajes.
Tasas de error o derivas de relojes.
Para explicar la estructura de un DFS, necesitamos definir los términos servicio, servidor y
cliente en el contexto DFS. Un servicio es una entidad de software que se ejecuta en una o
más máquinas y proporciona un tipo particular de función a los clientes. Un servidor es el
software de servicio que se ejecuta en una única máquina. Un cliente es un proceso que
puede invocar un servicio utilizando un conjunto de operaciones que forman su interfaz
de cliente. A veces se define una interfaz de nivel inferior para la interacción real entre
máquinas; es la interfaz entre máquinas.
La arquitectura básica de un DFS depende de sus objetivos finales. Los dos modelos
arquitectónicos más utilizados son el modelo cliente-servidor y el modelo basado en
clúster. El objetivo principal de una arquitectura cliente-servidor es permitir el
intercambio transparente de archivos entre uno o más clientes como si los archivos
estuvieran almacenados localmente en los equipos cliente individuales. Los sistemas de
archivos distribuidos NFS y Open AFS son ejemplos de ello. NFS es el DFS más común
En un modelo DFS cliente-servidor simple, el servidor almacena tanto los archivos como
los metadatos en un almacenamiento adjunto. En algunos sistemas, se puede utilizar más
de un servidor para almacenar distintos archivos. Los clientes se conectan al servidor a
través de una red y pueden solicitar acceso a los archivos del DFS poniéndose en contacto
con el servidor a través de un protocolo bien conocido como NFS Versión 3. El servidor se
encarga de realizar la autenticación, comprobar los permisos del archivo solicitado y, si
está justificado, entregar el archivo al cliente solicitante. Cuando un cliente realiza
cambios en el archivo, debe enviarlos al servidor, que posee la copia maestra del archivo.
Las versiones del archivo del cliente y del servidor deben mantenerse coherentes de
forma que se minimice el tráfico de red y la carga de trabajo del servidor en la medida de
lo posible.
El protocolo del sistema de archivos en red (NFS) fue desarrollado originalmente por Sun
Microsystems como un protocolo abierto, lo que favoreció su adopción temprana en
diferentes arquitecturas y sistemas. Desde el principio, el objetivo de NFS fue la
recuperación rápida y sencilla ante una falla del servidor. Para alcanzar este objetivo, el
servidor NFS se diseñó como un servidor sin estado; no realiza un seguimiento de qué
cliente está accediendo a qué archivo o de cosas como descriptores de archivo abiertos y
punteros de archivo. Esto significa que, cada vez que un cliente emite una operación de
archivo, por ejemplo, para leer un archivo, esa operación debe ser idempotente frente a
caídas del servidor. Idempotente describe una operación que puede realizarse más de una
vez y devolver el mismo resultado. En el caso de una operación de lectura, el cliente
mantiene un registro del estado, como el puntero del archivo, y puede simplemente
volver a emitir la operación si el servidor se ha caído y vuelve a estar en línea.
El sistema de archivos Andrew (AFS) fue creado en la Universidad Carnegie Mellon con un
enfoque en la escalabilidad. En concreto, los investigadores querían diseñar un protocolo
Tanto Open AFS como NFS están pensados para ser utilizados como complemento de los
sistemas de archivo locales. En otras palabras, usted no formatearía una partición de disco
duro con el sistema de archivos NFS. En su lugar, en el servidor, formatearía la partición
con un sistema de archivos local de su elección, como ext4, y exportaría los directorios
compartidos a través del DFS. En el cliente, basta con adjuntar los directorios exportados
al árbol del sistema de archivos. De este modo, el DFS puede desentenderse de la
responsabilidad del sistema de archivos local y concentrarse en las tareas distribuidas.
El modelo cliente-servidor DFS, por diseño, puede sufrir de un único punto de falla si el
servidor falla. La agrupación de computadores puede ayudar a resolver este problema
mediante el uso de componentes redundantes y métodos de agrupación tales que los
fallas se detectan y la conmutación por error a los componentes que funcionan continúa
las operaciones del servidor. Además, el servidor presenta un cuello de botella para todas
las peticiones tanto de datos como de metadatos, lo que provoca problemas de
escalabilidad y ancho de banda.
GFS se lanzó en 2003 para dar soporte a grandes aplicaciones distribuidas de uso intensivo
de datos. En el diseño de GFS influyeron cuatro observaciones principales:
1. Las fallas de los componentes de hardware son la norma más que la excepción y
deben esperarse rutinariamente.
2. Los archivos almacenados en un sistema de este tipo son muy grandes.
En consonancia con la cuarta observación, GFS exporta su propia API y exige que las
aplicaciones se programen con ella.
Poco después de desarrollar GFS, Google desarrolló una capa de software modularizada
llamada MapReduce para que se asentara sobre GFS. MapReduce permite a los
desarrolladores realizar cálculos paralelos a gran escala con mayor facilidad y aprovecha
las ventajas del sistema de archivos de la capa inferior. Más tarde, HDFS y el marco
Hadoop, que incluye módulos apilables como MapReduce sobre HDFS, se crearon a partir
del trabajo de Google. Al igual que GFS y MapReduce, Hadoop permite procesar grandes
conjuntos de datos en entornos informáticos distribuidos. Como se ha sugerido antes, el
impulso para crear un marco de este tipo se produjo porque los sistemas tradicionales no
podían escalar a la capacidad y el rendimiento que necesitaban los proyectos de big data,
al menos no a precios razonables. Algunos ejemplos de proyectos de big data son el
rastreo y análisis de redes sociales, datos de clientes y grandes cantidades de datos
científicos para detectar tendencias.
El nombrado es una correspondencia entre objetos lógicos y físicos. Por ejemplo, los
usuarios tratan con objetos de datos lógicos representados por nombres de archivos,
mientras que el sistema manipula bloques físicos de datos almacenados en pistas de
disco. Normalmente, un usuario se refiere a un archivo mediante un nombre de texto.
Este último se asigna a un identificador numérico de nivel inferior que, a su vez, se asigna
a bloques de disco. Esta asignación multinivel proporciona a los usuarios una abstracción
de un archivo que oculta los detalles de cómo y dónde se almacena el archivo en el disco.
Estructuras de nombrado
Una vez completada la separación entre nombre y ubicación, los clientes pueden acceder
a los archivos que residen en sistemas de servidores remotos. De hecho, estos clientes
pueden no tener disco y depender de los servidores para proporcionar todos los archivos,
incluido el núcleo del sistema operativo. Sin embargo, se necesitan protocolos especiales
para la secuencia de arranque. Consideremos el problema de hacer llegar el kernel a una
estación de trabajo sin disco. La estación de trabajo sin disco no tiene kernel, por lo que
no puede utilizar el código DFS para recuperar el kernel. En su lugar, se invoca un
protocolo de arranque especial, almacenado en memoria de sólo lectura (ROM) en el
cliente. Habilita la conexión en red y recupera sólo un archivo especial, el kernel o código
de arranque, desde una ubicación fija. Una vez que el kernel se copia a través de la red y
Esquemas de nombrado
El segundo enfoque fue popularizado por NFS. NFS proporciona un medio para adjuntar
directorios remotos a directorios locales, dando así la apariencia de un árbol de
directorios coherente. Las primeras versiones de NFS sólo permitían acceder de forma
transparente a los directorios remotos previamente montados. La aparición de la función
de montaje automático, o automontaje, permitió realizar montajes a petición basándose
en una tabla de puntos de montaje y nombres de estructuras de archivos. Los
componentes están integrados para soportar la compartición transparente, pero esta
integración es limitada y no es uniforme, porque cada máquina puede adjuntar diferentes
directorios remotos a su árbol. La estructura resultante es versátil.
Técnicas de implementación
La granularidad de los datos almacenados en caché en un DFS puede variar desde bloques
de un archivo hasta un archivo completo. Normalmente, se almacenan en caché más
datos de los necesarios para satisfacer un único acceso, de modo que los datos
almacenados en caché puedan servir para muchos accesos. Este procedimiento es muy
parecido a la lectura anticipada en disco. Open AFS almacena archivos en grandes
fragmentos (64 KB). Los otros sistemas aquí analizados admiten el almacenamiento en
caché de bloques individuales en función de la demanda del cliente. Aumentar la unidad
de caché incrementa la tasa de aciertos, pero también aumenta la penalización por falla,
porque cada falla requiere que se transfieran más datos. También aumenta la posibilidad
de problemas de coherencia. La selección de la unidad de almacenamiento en caché
implica tener en cuenta parámetros como la unidad de transferencia de red y la unidad de
servicio del protocolo RPC si se utiliza un protocolo RPC. La unidad de transferencia de
red, para Ethernet, un paquete, es de aproximadamente 1,5 KB, por lo que las unidades
más grandes de datos en caché necesitan ser desmontadas para su entrega y
reensambladas en la recepción.
Ubicación de la caché
¿Dónde deben almacenarse los datos en caché, en disco o en memoria principal? Las
cachés de disco tienen una clara ventaja sobre las de memoria principal: son fiables. Las
modificaciones de los datos almacenados en caché se pierden en caso de falla si la caché
se guarda en memoria volátil. Además, si los datos almacenados en caché se guardan en
disco, siguen ahí durante la recuperación y no es necesario recuperarlos de nuevo. Sin
embargo, las cachés de memoria principal tienen sus propias ventajas:
Las cachés de memoria principal permiten que las estaciones de trabajo no tengan
disco.
Se puede acceder a los datos más rápidamente desde una caché en memoria
principal que desde una caché en disco.
La tecnología avanza hacia memorias más grandes y menos costosas. Se prevé que
el aumento de rendimiento resultante supere las ventajas de las cachés de disco.
Las cachés de servidor, utilizadas para acelerar la E/S de disco, estarán en la
memoria principal independientemente de dónde se encuentren las cachés de
usuario; si utilizamos cachés de memoria principal también en la máquina de
usuario, podemos construir un único mecanismo de caché para uso tanto de
servidores como de usuarios.
Una alternativa es la política de escritura diferida, también conocida como política write-
back, en la que retrasamos las actualizaciones de la copia maestra. Las modificaciones se
escriben en la caché y luego se escriben en el servidor. Esta política tiene dos ventajas
sobre la write-through. En primer lugar, como las escrituras se realizan en la caché, los
accesos de escritura se completan mucho más rápidamente. En segundo lugar, los datos
pueden sobrescribirse antes de volver a escribirse, en cuyo caso sólo es necesario escribir
la última actualización. Desafortunadamente, los esquemas write-back introducen
problemas de fiabilidad, ya que los datos no escritos se pierden cada vez que una máquina
de usuario se bloquea. Las variaciones de la política write-back difieren en el momento en
que los bloques de datos modificados se envían al servidor. Una alternativa es vaciar un
bloque cuando está a punto de ser expulsado de la caché del cliente. Esta opción puede
dar como resultado un buen rendimiento, pero algunos bloques pueden permanecer en la
caché del cliente durante mucho tiempo antes de ser escritos de nuevo en el servidor. Un
compromiso entre esta alternativa y la política write-through es escanear la caché a
intervalos regulares y vaciar los bloques que han sido modificados desde el escaneo más
reciente, igual que UNIX escanea su caché local. NFS utiliza esta política para los datos de
archivos, pero una vez que se emite una escritura al servidor durante un vaciado de caché,
la escritura debe llegar al disco del servidor antes de que se considere completa. NFS trata
los metadatos (datos de directorio y datos de atributos de archivo) de forma diferente.
Cualquier cambio en los metadatos se envía de forma sincrónica al servidor. De este
modo, se evita la pérdida de la estructura de archivos y la corrupción de la estructura de
directorios cuando un cliente o el servidor se bloquean.
Otra variación de la política write-back consiste en escribir los datos en el servidor cuando
se cierra el archivo. Recibe el nombre de política de escritura durante el cierre y es
Coherencia
Una máquina cliente se enfrenta a veces al problema de decidir si una copia de datos
almacenada localmente en caché es coherente con la copia maestra, y, por tanto, puede
utilizarse. Si la máquina cliente determina que sus datos almacenados en caché están
obsoletos, debe almacenar en caché una copia actualizada de los datos antes de permitir
nuevos accesos. Existen dos enfoques para verificar la validez de los datos almacenados
en caché:
El cliente inicia una comprobación de validez en la que se pone en contacto con el servidor
y comprueba si los datos locales son coherentes con la copia maestra. La frecuencia de la
comprobación de validez es el quid de este enfoque y determina la semántica de
coherencia resultante. Puede variar desde una comprobación antes de cada acceso hasta
una comprobación sólo en el primer acceso a un archivo, al abrir el archivo, básicamente.
Cada acceso asociado a una comprobación de validez se retrasa, en comparación con un
acceso servido inmediatamente por la caché. Alternativamente, las comprobaciones
pueden iniciarse a intervalos de tiempo fijos. Dependiendo de su frecuencia, la
comprobación de validez puede cargar tanto la red como el servidor.
El servidor registra, para cada cliente, los archivos, o partes de archivos, que almacena en
caché. Cuando el servidor detecta una posible incoherencia, debe reaccionar. Una
incoherencia potencial se produce cuando dos clientes diferentes en modos conflictivos
almacenan en caché un archivo. Si se implementa la semántica UNIX, podemos resolver la
incoherencia potencial haciendo que el servidor desempeñe un papel activo. El servidor
debe ser notificado cada vez que se abra un archivo, y el modo previsto, lectura o
escritura, debe indicarse para cada apertura. El servidor puede actuar cuando detecta que
Tipo de
Modo de comunicación
Hardware
Fuertemente
Al tener memoria común se comunican a través de un buffer común.
acoplado
Al no tener memoria compartida la comunicación se debe realizar a
través de RPC (Remote Procedure Control – Llamadas a procedimientos
remotos)
Débilmente
Cuando un proceso A quiere comunicarse con otro B, primero A debe
acoplado
construir el mensaje en su propio espacio de direcciones de memoria,
luego ejecuta una llamada al sistema para que el sistema operativo
busque el mensaje y lo envía a través de la red hacia B.
Para poder realizar esa comunicación mediante mensajes se necesita acordar una serie de
aspectos que ocupan una amplia gama de niveles (desde el más bajo de transmisión de los
bits hasta los de más alto nivel) donde se explicita cómo debe expresarse la información,
por ejemplo:
Qué tensión hay que utilizar para enviar un bit 0 y cuál para enviar un bit 1.
Cómo sabe el receptor cuál es el último bit del mensaje.
Cómo detectar si un mensaje ha sido perdido o dañado.
Cuál es la longitud de la cadena de datos y cómo se representan.
La estructura de las primitivas variará según cuál sea el software de paso de mensajes
utilizado. Esta estructura puede implementarse como una llamada a un procedimiento o
como un mensaje propiamente dicho a un proceso que sea parte del sistema operativo.
Habitualmente la primitiva Send se utiliza cuando un proceso quiere enviar un mensaje,
siendo sus parámetros el identificador del proceso receptor y el contenido del mensaje, y
es el módulo de paso de mensajes el encargado de construir la unidad de datos que
incluirá a estos elementos y que será enviada a la computadora que aloja al proceso
receptor del mensaje utilizando algún tipo de servicios de comunicación, como el TCP/IP.
Al recibir el equipo receptor la unidad de datos, el servicio de comunicación pasa esta al
módulo de paso de mensajes que examinará el campo identificación de proceso y
almacenará al mensaje en el búfer de proceso receptor. Ante esta situación, el proceso
receptor debe explicitar su deseo de recibir un mensaje. Esto lo hace determinando un
área de buffer e informando al módulo de paso de mensajes mediante la primitiva
Receive. Otra opción sería que, al momento de recibir un mensaje el módulo de paso de
mensajes identifique cuál es el proceso destinatario mediante una señal Receive para
luego dejar disponible el mensaje recibido en un buffer compartido.
En este esquema, lo que se quiere hacer es que una llamada a un procedimiento remoto
sea lo más parecida posible a una llamada local. Luego, para llamar a un procedimiento
remoto, el cliente debe enlazarse con una rutina de biblioteca conocida como resguardo
del cliente, la cual representará al servidor en el espacio de direcciones del cliente.
Asimismo, el servidor se enlazará con un procedimiento conocido como resguardo del
servidor. Ambos procedimientos ocultarán el hecho de que la llamada al procedimiento
desde el cliente al servidor no es local.
Los pasos para llevar a cabo una RPC son los siguientes:
Lo importante en este desarrollo es que el procedimiento cliente sólo hace una llamada a
procedimiento local al resguardo del cliente, el cual tiene el mismo nombre que el
procedimiento del servidor. Puesto que el procedimiento del cliente y el resguardo del
cliente pertenecen al mismo espacio de direcciones, los parámetros se pasan por valor o
por referencia. Asimismo, un procedimiento llama al procedimiento del servidor en su
espacio de direcciones, con los parámetros que espera. Así se lleva a cabo la comunicación
remota al simular una llamada a un procedimiento local.
GRIDS (Mallas)
Un GRID es un conjunto inmenso de computadoras con las siguientes características:
Paso 1
Toda computadora integrante del GRID ejecuta un grupo de programas que gestionan la
computadora y la integran al GRID. Habitualmente este software se encarga de la
autenticación y el inicio de sesión de los usuarios remotos, de anunciar y descubrir
recursos, programar y ubicar trabajos, etcétera.
Paso 2
Siempre que un usuario realiza un trabajo, el software del GRID primero determina en
dónde se tienen recursos de hardware, software y de datos libres para la ejecución del
trabajo, luego envía el trabajo a ese lugar, prepara su ejecución y más tarde devuelve los
resultados obtenidos al usuario.
Como ejemplo de middleware para un GRID se tiene a Globus Toolkit utilizable en varias
plataformas y que puede soportar varios esquemas de GRID. Globus suministra un
entorno de trabajo que les permite a los usuarios compartir computadoras, archivos y
muchos otros recursos de forma flexible y con mucha seguridad sin tener que sacrificar la
autonomía local. Debido a estas cualidades es que se lo usa como plataforma en la
construcción de una gran cantidad aplicaciones distribuidas.
AMOEBA
El objetivo principal del proyecto AMOEBA era construir un sistema operativo distribuido y
transparente. Un usuario común podría no percibir la diferencia entre AMOEBA y un
sistema tradicional de tiempo compartido como UNIX, pero la diferencia real es que el que
trabaja en AMOEBA entra, edita, mueve programas y archivos entre varias máquinas
dispersas en la red y entre estas máquinas están los servidores de procesos, de archivos,
de directorios, de cómputos, pero el usuario no es consciente de ello; porque todo parece
como un sistema ordinario de tiempo compartido.
Una característica de AMOEBA es que cuando el usuario entra al sistema lo hace como un
todo y no como una máquina específica, es decir que todos los recursos pertenecen al
sistema como un todo y son controlados por él.
MACH
Mach nace de un sistema anterior llamado RIG (Rochester Intelligent Gateway) que se
inició en la Universidad de Rochester en 1975. Fue escrito para una minicomputadora de
16 bits de Data General.
En 1986 después de varias evoluciones de RIG con un nuevo proyecto aparece MACH en
su primera versión, para implementarlo en una VAX 11/784 que era un multiprocesador
de 4 CPU, posteriormente se realizaron versiones para IBM PC/RT y para SUN 3. A pesar
de tener posibilidad de su uso en redes, en esa época se concebía más como un sistema
para un multiprocesador que para una red.
CHORUS
Para que esta versión pudiera ser una versión comercial se debió aumentar la capacidad
de emulación de UNIX y se agregó la compatibilidad binaria con el mismo, de manera tal
que se pudiesen correr programas en UNIX sin necesidad de recompilarlos.
Carretero Pérez, J.; De Miguel Anasagasti, P.; García Carballeira, F.; Pérez Costoya,
F. (2007). Sistemas Operativos: Una visión aplicada (2a ed.). Buenos Aires: Mc.
Graw Hill.
Carretero Pérez, J., García Carballeira, F., & Pérez Costoya, F. (2021). Sistemas
Operativos: Una Visión Aplicada, Tercera Edición, Volumen I. Independently
Published.
Carretero Pérez, J., García Carballeira, F., & Pérez Costoya, F. (2021). Sistemas
Operativos: Una Visión Aplicada, Tercera Edición, Volumen II. Independently
Published.
Silberschatz, A.; Galvin, P. B.; Gagne, G. (2018). Operating System Concepts, Tenth
Edition. Hoboken, New Jersey: John Wiley & Sons, Inc.
Silva, M. (2015). Sistemas Operativos. Ciudad Autónoma de Buenos Aires:
Alfaomega Grupo Editor.
Stallings, W. (2018). Operating Systems: Internals and Design Principles, 9th
Edition; Editorial: Pearson.
Stallings, W. (2012). Operating Systems, Internals and Design Principles, Seventh
Edition. Upper Saddle River; New Jersey: Pearson Education, Inc.
Tanenbaum, A. S.; Bos, H. (2015). Modern Operating Systems, Fourth Edition.
Tanenbaum, A. S.; Maarten Van Steen. (2009). Sistemas operativos modernos (3ª
ed.). México: Pearson/Prentice Hall.
Wolf, Gunnar. (2015). Fundamentos de sistemas operativos. México. Instituto de
Investigaciones Económicas UNAM.