Sistemas Operativos Distribuidos MC Hilda Castillo Zacatelco BUAP Sistemas Operativos Distribuidos 1. Introducción De 1945 a 1985, las computadoras eran grandes y caras. Sin embargo a mitad de la década de los 80’s, dos avances tecnológicos comenzaron a cambiar esta situación: 1. Desarrollo de poderosos microprocesadores. 2. Invención de redes de área local de alta velocidad (LAN) y redes WAN. Un sistema distribuido consiste de una colección de computadoras autónomas conectadas mediante una red y equipadas con software de sistemas distribuidos. El software de un sistema distribuido habilita a las computadoras para coordinar sus actividades y compartir los recursos del sistema. Los usuarios de un sistema distribuido bien diseñado deben percibir una sola computadora y no un sistema implementado por muchas computadoras en diferentes lugares. Definición. Un sistema distribuido es una colección de computadoras independientes que aparecen ante los usuarios del sistema como una única computadora. Esta definición tiene dos aspectos: 1. El hardware: las máquinas son autónomas. 2. El software: los usuarios piensan que el sistema es como una única computadora. Aplicaciones: - Una red de computadoras con una pila de procesadores - Una aerolínea - Fábrica de robots - Un banco con sucursales - Internet - Multimedia y conferencias Sistema operativos distribuidos - Amoeba - Mach - Chorus - Clouds - Plan9 - Mosix - OpenMosix Ventajas de los sistemas distribuidos con respecto de los centralizados Economía. Los microprocesadores ofrecen mejor proporción precio/rendimiento que los mainframes, pues se pueden reunir un gran número de CPU’s baratos en un mismo sistema y dado el avance tecnológico de estos, se puede dar un mejor rendimiento que un solo mainframe. Velocidad. Un sistema distribuido puede tener mayor poder de cómputo que un mainframe. Distribución inherente. Algunas aplicaciones utilizan máquinas que están separadas a cierta distancia. Por ejemplo, trabajo cooperativo apoyado por computadora, juegos cooperativos apoyados por computadora. Confiabilidad. Si una máquina se descompone, el sistema puede sobrevivir como un todo. Crecimiento por incrementos. Se puede añadir poder de cómputo en pequeños incrementos. Ventajas de los sistemas distribuidos con respecto a las computadoras personales aisladas. Datos compartidos. Permiten que varios usuarios tengan acceso a una base de datos común. Dispositivos compartidos. Permiten que varios usuarios compartan periféricos caros como scanners o impresoras a color. Comunicación. Facilita la comunicación de persona a persona; por ejemplo, mediante correo electrónico, FAX, chats, foros, etc. Flexibilidad. Difunde la carga de trabajo entre las máquinas disponibles en la forma más eficaz en cuanto a costos. Además de las ventajas anteriores, podemos sumar dos más en forma general: 1 Sistemas Operativos Distribuidos MC Hilda Castillo Zacatelco BUAP Sistema de ficheros con raíz única. Este sistema de ficheros hace que la administración sea más sencilla (no hay que administrar varios discos independientemente) y deja a cargo del sistema varias de las tareas. Capacidad de comunicación de procesos y de intercambio de datos universal. Permite enviar señales a cualquier proceso del conjunto de computadoras, asimismo permite trabajar conjuntamente con cualquier proceso e intercambiar datos. Por lo tanto será posible tener todos los procesos trabajando en un mismo trabajo. Desventajas de los Sistemas Distribuidos La principal desventaja de estos sistemas es la complejidad que implica su creación. La Economía, la Velocidad y la Distribución de máquinas no tienen problemas de implantación porque son inherentes a los sistemas distribuidos. Confiabilidad (alta disponibilidad). Se puede conseguir alta disponibilidad pues al tener varios nodos independientes, hay menos posibilidades de que caigan todos a la vez. Para esto hay que implantar los mecanismos necesarios para que cuando una máquina caiga, se sigan dando todos los servicios. Esto nos lleva a la necesidad de actualizar todas las réplicas de un servicio. También se tiene que disponer de los mecanismos adecuados para que el nodo que ve el fallo del servidor busque los servidores alternativos en busca de la información que necesita. Además también se debe disponer de los mecanismos necesarios para que los nodos que han caido, cuando vuelvan a conectarse puedan continuar con su trabajo normalmente. Escalabilidad. Al incrementarse el número de nodos aumentan las comunicaciones, por lo tanto se debe diseñar un sistema lo más escalable posible. Por ejemplo elegir una comunicación todos contra todos no es una solución escalable. Comunicación. Estos sistemas tienen más necesidad de comunicación que los sistemas normales, por lo tanto tenemos que crear nuevos métodos de comunicación lo más eficientes posibles. Sistemas de ficheros con raíz única. Tenemos que independizar los sistemas de ficheros distintos de cada uno de los nodos para crear un sistema de ficheros general. Un problema que nos encontramos en sistemas tipo UNIX es por ejemplo cómo manejar los directorios /proa y /dev; los PID’s deberían ser independientes para cada nodo, pero además se incluye información como /proa/cpuinfo, /proa/meminfo, etc. Entonces debería crearse un directorio para cada nodo para evitar problemas de compatibilidad. En el caso de /dev, no hay problema si todos los dispositivos son distintos, en caso contrario se debe diseñar un nuevo esquema para nombrar los dispositivos. Capacidad de comunicación de procesos y de intercambio de datos universal. Para conseguir este objetivo necesitamos una forma de distinguir unívocamente cada proceso del conjunto de computadoras. Redes. La red se puede saturar o causar otro problemas. Seguridad. Como los datos son fáciles de compartir entonces también se puede tener acceso a datos con los que no se tiene nada que ver. 1.1 Conceptos de Hardware Sistemas fuertemente acopladas. El retraso que se experimenta el enviar un mensaje de una computadora a otra es corto y la tasa de transmisión de los datos (número de bits por segundo que se pueden transferir) es alta. Sistema débilmente acoplado. El retraso es grande y la tasa de transmisión es baja. Los sistemas fuertemente acoplados tienden a utilizarse más como sistemas paralelos. Los sistemas débilmente acoplados tienden a utilizarse como sistemas distribuidos. Clasificación de Flynn (1972). 2 Sistemas Operativos Distribuidos MC Hilda Castillo Zacatelco BUAP Considera dos características el número de flujos de instrucciones y el número de flujos de datos. SISD (single instruction, single data) Computadoras personales. SIMD (single instruction, multiple data) MISD (multiple instruction, single data) MIMD (multiple instruction, multiple data) Todos los sistemas distribuidos son MIMD. Las computadoras MIMD se divide en Multprocesadores y Multicomputadoras. Multiprocesadores. Existen dos categorías de computadoras paralelas. Estos modelos físicos se diferencian en el hecho de tener memoria compartida o distribuida. Multiprocesadores de memoria compartida. Existen tres modelos que se diferencian en como la memoria y los periféricos se comparten o distribuyen. - UMA (uniform memory access) - NUMA (no uniform memory access) - COMA (cache-only memory access) El modelo UMA La memoria se comparte uniformemente entre los procesadores. Todos tienen igual tiempo de acceso a todas las palabras de memoria. Cada memoria puede tener una caché privada. Los periféricos también se comparten en la misma forma. Se les denomina sistemas fuertemente acoplados. Para coordinar los eventos paralelos, la sincronización e intercomunicación entre procesos se utilizan variables en la memoria común. Cuando todos los procesadores tienen igual acceso a todos los periféricos el sistema se denomina simétrico (MP). En un multiprocesador asimétrico solo uno o un subconjunto de los procesadores tienen la capacidad ejecutiva. El procesador ejecutivo o maestro ejecuta el sistema operativo y maneja la E/S. Los otros procesadores no pueden manejar las E/S y se los llama attached processors (APs). Los procesadores attached ejecutan código bajo la supervisión del procesador maestro. (Ejemplo Sequent S-81) El modelo NUMA La memoria está fisicamente distribuida entre todos los procesadores, se llaman memorias locales. Es más rápido acceder un dato en la memoria local, para acceder información en una memoria remota existe una demora debida a la red de interconexión(BBN TC-2000 Butterfly). Además de estas memorias distribuidas se puede agregar memoria globalmente accesible por todos los procesadores. En este caso existen tres patrones de acceso a memoria: - el más rápido es acceder a memoria local - un poco más lento es acceder la memoria global - y por último el más lento de todos es acceder la memoria remota de otro procesador (ejemplo Cedar de la universidad de Illinois) El modelo COMA El modelo COMA utiliza solo memoria de tipo caché (ej. KSR-1 de Kendall Square Research). Son un caso particular de la NUMA en el cual la memoria distribuida se convierte en memorias caché. No existen jerarquías de memoria en cada nodo procesador. Todas las caches forman un espacio de direccionamiento global. El acceso a una cache remota se facilita a través de los directorios distribuidos de cache los cuales en ciertas arquitecturas pueden estructurarse en forma jerárquica. Una de las mayores desventajas que poseen estos multiprocesadores es la falta de escalabilidad debido a la centralización de la memoria compartida. 3 Sistemas Operativos Distribuidos MC Hilda Castillo Zacatelco BUAP Multicomputadoras Consisten de múltiples computadoras llamadas a menudo nodos interconectados por una red de paso de mensajes. Cada nodo es un sistema autónomo con su procesador, su memoria y a veces periféricos de E/S. La red de paso de mensajes provee un mecanismo de comunicación punto a punto. Todas las memorias locales con privadas y son solo accesibles por el conjunto de procesadores locales del nodo, por esta razón se las denomina máquinas NORMA (no remote memory access). El rango de transferencia de datos es similar a B-ISDN , utiizan ATM como técnica de switcheo Con B-ISDN y ATM, se pueden trabajar sistemas distribuidos en redes WAN. Protocolo Conjunto de reglas y formatos usados para la comunicación entre procesos para desempeñar una tarea. Un protocolo tiene dos partes importantes: 1. Una especificación de la secuencia de mensajes que debe ser intercambiado 2. Una especificación del formato de datos de los mensajes Tipos de red 1.2 Conceptos de Software Las redes de computadoras pueden ser divididas en dos clases: En un sistema distribuido el software es más importantes que el hardware, pues la imagen y la forma d pensar de los usuarios la determina el software del sistema operativo. Es posible distinguir dos tipos de sistemas operativos para multiprocesadores o multicomputadoras: Software débilmente acoplado. Permite que las máquinas y los usuarios en un sistema distribuido sean independientes entre sí en lo fundamental, pero que interactúen cuando sea necesario. Software fuertemente acoplado. Las máquinas interactúan entre sí (y los usuarios) para llevar a cabo las tareas en forma conjunta. Redes de área local (LAN) Mensajes de alta velocidad Los nodos se encuentran repartidos en un solo edificio o campus. Son apropiadas para sistemas distribuidos aunque algunas aplicaciones multimedia necesitan un mayor ancho de banda Redes de área amplia (WAN) Mensajes a baja velocidad Las computadoras se encuentran separadas a grandes distancias Las computadoras que con interconectadas por una WAN son llamadas computadoras host, estas pueden estar ubicadas en diferentes ciudades, países o continentes Es necesario el ruteo de paquetes El tiempo de transmisión depende de la ruta Una tercera clase son las redes de área metropolitana (MAN) Utilizan cable de fibra óptica Los nodos se encuentran ubicados en una misma ciudad, y se transmite video, voz y otros datos a una distancia de alrededor de 50km Sistemas operativos de redes Software débilmente acoplado en hardware débilmente acoplado. Por ejemplo una red de estaciones de trabajo conectadas mediante una LAN. Cada usuario tiene una estación de trabajo para uso exclusivo y los comandos se ejecutan normalmente de manera local. Aunque existen comandos que permiten que un usuario se conecte de forma remota a otra estación de trabajo, entonces su máquina se convierte en terminal de otra máquina. Esto no es muy conveniente. 4 Sistemas Operativos Distribuidos MC Hilda Castillo Zacatelco BUAP Una mejora es tener un sistema de archivos global accesible desde todas las estaciones de trabajo (compartido), utilizando los llamados servidores de archivos. Estos utilizan un sistema jerárquico de archivos (directorio raíz, subdirectorio y archivos). Las estaciones de trabajo pueden importar o montar estos sistemas de archivos. Por lo tanto cada cliente tiene un punto de vista distinto del sistema de archivos. El sistema en el que cada máquina tiene un alto grado de autonomía y existen pocos requisitos a lo largo de todo el sistema, se llama sistema operativo de red. Sistemas realmente destribuidos Software fuertemente acoplado en débilmente acoplado (multicomputadoras). hardware Objetivos: Hacer creer a los usuarios que toda la red de computadoras es un sistema de tiempo compartido, a esta propiedad algunos autores le llaman la imagen de único sistema Algunos otros autores dicen que un sistema distribuido es aquel que se ejecuta en un conjunto de máquinas enlazadas mediante una red pero que actúan como un uniprocesador virtual. Conclusión. Los usuarios no deben darse cuenta de la existencia de varios CPU en el sistema. Características de los sistemas distribuidos Algunas de las características de los Sistemas Distribuidos son: Recursos compartidos. Discos, impresoras, archivos, bases de datos y otros objetos. Manejador de recursos. Denota un módulo de software que maneja un conjunto de recursos de un tipo particular. Incluye provisión de nombres, maneja direcciones y coordina los accesos concurrentes. Los usuarios de recursos se comunican con el manejador de recursos para accesar los recursos compartidos del sistema. Para realizar la comunicación se puede emplear alguno de los siguientes modelos. Modelo cliente-servidor. El más comunmente usado. Los servidores actúan como manejadores de recursos. Modelo basado en objetos. Cada recurso compartido es un objeto, los cuales pueden ser movidos de cualquier lugar en la red sin cambiar sus identidades. Mecanismo de comunicación global entre procesos “Openness”(Abierto). En un sistema distribuido el “openness” es determinado por el grado en el cual nuevos servicios de recursos pueden ser añadidos sin interrumpir o duplicar los servicios existentes. La publicación de documentos acerca del sistema es la clave de esta característica. Los sistemas que son diseñados para soportar recursos compartidos que pueden ser expansibles en hardware y software son llamados sistemas distribuidos abiertos. Características de los sistemas distribuidos abiertos. - Sus interfaces son publicadas - Están provistos de un mecanismo de comunicación entre procesos uniforme e interfaces públicas para acceso a recursos compartidos. - Puede ser construido con hardware y software heterogéneo. Esquema global de protección Concurrencia. Ejecución de varios procesos al mismo tiempo. Escalabilidad. Un sistema distribuido debe operar efectiva y eficientemente a diferentes escalas. El sistema y las aplicaciones del software no deben cambiar cuando la escala del sistema se incrementa (memoria, procesadores, canales de E/S) Misma administración de procesos La misma apariencia del sistema de archivos en todas partes Sistema de archivos global Cada núcleo debe controlar sus propios recursos locales. 5 Sistemas Operativos Distribuidos MC Hilda Castillo Zacatelco BUAP Sistemas de Multiprocesador con tiempo compartido Es software y hardware fuertemente acoplado. Por ejemplo los multiprocesadores que operan como un sistema de tiempo compartido, estos utilizan una cola de ejecución. El despachador utiliza exclusión mutua mediante semáforos, monitores, etc., para evitar que dos CPU elijan el mismo proceso para su ejecución. Transparencia de paralelismo. Las actividades pueden ocurrir en paralelo sin el conocimiento de los usuarios. Transparencia en fallas. Si falla un nodo, el usuario no debe darse cuenta y el sistema debe seguir trabajando. Transparencia de escalamiento. Se pueden agregar nodos o software y el sistema debe permanecer activo. Transparencia de acceso. El acceso a los recursos debe realizarse de la misma forma en cualquier lugar. 1.3 Aspectos del diseño Flexibilidad Transparencia. Existen dos tipos de estructuras de los sistemas distribuidos. - Los que utilizan núcleo monolítico en cada máquina, es decir, cada máquina debe ejecutar un núcleo tradicional que proporcione la mayoría de los servicios. - Los que utilizan un micronúcleo, es decir, el núcleo proporciona lo menos posible y el grueso de los servicios del sistema operativo se obtienen a partir de servidores a nivel de usuario. La transparencia es uno de los aspectos de diseño más importantes dentro de los sistemas distribuidos, pero también uno de los más complejos. La transparencia puede darse en dos niveles: Hacia los usuarios Hacia los programas Es más fácil lograr la transparencia dirigida a los usuarios mediante una interfaz con comandos que aunque se ejecuten en otra máquina o hagan uso de varias máquinas, los usuarios no se dan cuenta; que lograr la transparencia para los programas, pues para accesar a archivos remotos por ejemplo deben establecer una conexión, y esto ya no es transparente. Existen distintos tipos de transparencia en un sistema distribuido. Transparencia de localización. Los usuarios no pueden indicar la localización de los recursos. Transparencia de migración.Los recursos se pueden mover a voluntad sin cambiar sus nombres. Transparencia de réplica. Los usuarios no pueden indicar el número de copias existentes. Transparencia de concurrencia. Varios usuarios pueden compartir recursos de manera automática. La mayoría de los sistemas distribuidos diseñados a partir de cero utilizan micronúcleo y servidores. El micronúcleo proporciona cuatro servicios mínimos. 1. Un mecanismo de comunicación entre procesos 2. Cierta administración de la memoria 3. Una cantidad limitada de planificación y administración de procesos de bajo nivel 4. Entrada/Salida de bajo nivel Todos los demás servicios se implantan a manera de servidores a nivel de usuario. Debido a esto es fácil implantar, depurar, e instalar o modificar cierto servicios; esto no puede hacerse en un núcleo monolítico. Esto es lo que da flexibilidad al micronúcleo. Ventaja del núcleo monolítico. Rendimiento (es más rápido), aunque en la práctica esta ventaja ya no existe. (Sprite- núcleo monolítico, Amoeba-micronúcleo) 6 Sistemas Operativos Distribuidos MC Hilda Castillo Zacatelco BUAP Confiabilidad Este aspecto fue uno de los objetivos originales en la construcción de sistemas distribuidos, la idea es que si alguna máquina falla, alguna otra máquina se encargue del trabajo. Pero llevar a cabo esto en la práctica es muy difícil. Existen varios aspectos dentro de la confiabilidad. La disponibilidad, se refiere a la fracción de tiempo en que se puede usar el sistema. Esta se mejora si en el diseño no se exige el funcionamiento simultáneo de un número sustancia de componentes críticos o mediante la redundancia en el software y en el hardware. Seguridad. Los archivos y otros recursos deben ser protegidos contra el uso no autorizado. Tolerancia a fallas. Que el sistema pueda recuperarse de las fallas sin que el usuario se de cuenta. El objetivo es que los métodos actuales puedan escalarse hacia grandes sistemas. El principal problema son los cuellos de botella. Por lo tanto hay que evitar componentes centralizados, tablas centralizadas y algoritmos centralizados. Se deben utilizar algoritmos descentralizados, los cuales tienen las siguientes características, que los distingue de los algoritmos centralizados: - Ninguna máquina tiene la información completa acerca del estado del sistema - Las máquinas toman decisiones solo con base en la información local. - La falla de una máquina no arruina el algoritmo - No existe una hipótesis implícita de la existencia de una regla global. Otros temas básicos de diseño son: Nombres. Los procesos deben saber los nombres de los recursos El mayor problema del desempeño en un sistema distribuido se da en las comunicaciones, ya que estas son lentas, la lentitud se da más en el manejo de protocolo que en la transmisión física real. Una posible solución es verificar el tamaño de grano. Si un trabajo implica gran número de pequeños cálculos que interactúa mucho, se dice que el trabajo exhibe un paralelismo de grano fino; si el trabajo implica grandes cálculos y la interacción es poca, se dice que exhibe un paralelismo de grano grueso. También es importante verificar si habrá ganancia en la ejecución de un trabajo de forma remota, ya que habrá trabajos pequeños que no deben ser ejecutados remotamente, sino de manera local. También entra en juego la tolerancia a fallas, pues si un nodo falla y estaba ejecutando un trabajo, otro nodo debe continuar con la ejecución del trabajo. para accesarlos. Un nombre es resuelto cuando es trasladado a una forma tal que puede ser usado para invocar una acción sobre el recurso. En un sistema distribuido un nombre resuelto es generalmente un identificador de comunicación. Nombre. Nombres que pueden ser interpretados por usuarios y por programas Identificador. Nombre que puede ser interpretado solo por programas. Se deben seleccionar nombres apropiados a cada tipo de recurso. Todos los objetos son nombrados de manera uniforme y ocupan un solo espacio de nombres. Los nombres de los recursos deben poder ser resueltos. El esquema de nombramiento puede ser diseñado para proteger los recursos que ellos identifican de accesos no autorizados. Todos los recursos manejados por un tipo de manejador de recursos dado, deben tener nombre diferentes. Escalabilidad Comunicación Desempeño 7 Sistemas Operativos Distribuidos MC Hilda Castillo Zacatelco BUAP Los componentes de un sistema distribuido están separados lógica y físicamente, así que deben comunicarse para interactuar. La comunicación entre un par de procesos involucra: - Transferencia de datos - Sincronización en la recepción y transmisión. La programación básica utiliza primitivas de programación que desempeñan acciones de paso de mensajes. El mecanismo de paso de mensajes puede ser: Síncrono o con bloqueo. El transmisor espera después de transmitir un mensaje hasta que el receptor ha desempeñado una operación de recepción. Asincrono o sin bloqueo. El proceso receptor se bloquea cuando ningún mensaje esta actualmente disponible. El proceso transmisor se bloquea si no existe mensaje a transmitir. Mecanismos de comunicación que utilizan paso de mensajes: canales, sockets y puertos. Modelos de comunicación más usados en sistemas distribuidos: cliente-servidor, comunicación en grupo para grupos de procesos cooperativos. Asignación de la carga de trabajo En un sistema distribuido existe un modelo básico llamado “workstation-server”, pero no optimiza el uso de procesamiento y memoria. Dos modificaciones se han desarrollado: a) Modelo de pila de procesadores. Los procesadores pueden ser asignados dinámicamente a las tareas de usuarios. b) Uso de estaciones de trabajo vacías. Las tareas son asignadas a estaciones de trabajo vacías o bajoutilizadas. En sistemas distribuidos es común que los servidores sean computadoras multiprocesadores con memoria compartida. Los problemas de consistencia surgen de la separación de recursos de procesamiento y concurrencia en sistemas distribuidos. - Consistencia en la actualización - Consistencia en la replicación - Consistencia en el caché - Consistencia en las fallas - Consistencia en el reloj - Consistencia en la interfaz de usuario Requerimientos de usuario Los diseñadores de sistemas deben considerar las necesidades de sus usuarios potenciales Funcionalidad Lo que el sistema debe hacer para los usuarios Un distribuido debe mejorar los servicios proporcionados por una computadora aunado a uno o dos de los siguientes: - El compartir recursos de red lleva al acceso de una variedad de recursos - Se pueden utilizar las ventajas de la distribución en la programación de aplicaciones paralelas, interfaces de programación. Al migrar de un ambiente centralizado multiusuario o monousuario a un distribuido se tienen tres opciones: - Adaptarse a los sistemas operativos existentes - Moverse totalmente a un nuevo SO diseñado específicamente para sistemas distribuidos - Emular un ambiente distribuido Reconfigurabilidad - Mantenimiento de la consistencia - El diseño de la escalabilidad de un sistema distribuido es importante Cambios a corto plazo en condiciones de tiempo de ejecución Evolución a mediano y a corto plazo en tiempo de ejecución 8 Sistemas Operativos Distribuidos MC Hilda Castillo Zacatelco BUAP Calidad de servicio - Desempeño Confiabilidad y disponibilidad Seguridad soporta sistemas heterogéneos; por ejemplo, clientes de MS-DOS que utilizan servidores UNIX. Ni siquiera es necesario que todas las máquinas utilicen el mismo hardware. Tres aspectos de NFS son de interés: la arquitectura, el protocolo y la implantación. Arquitectura de NFS. 2. El sistema de archivos de red (NFS) de Sun. Network File System, es como su nombre lo indica un sistema de archivos distribuido a lo largo de una red de máquinas, con el objetivo de tener un número arbitrario de usuarios compartiendo un sistema de archivos común, sin restricciones de sistemas operativos y hardware utilizado. NFS permite, tanto a usuarios como a programas, acceder a archivos remotos ubicados en maquinas remotas como si fueran locales. NFS que fue diseñado e implantado por Sun en un principio para su uso en las estaciones de trabajo UNIX. Ahora, otros fabricantes lo soportan, tanto para UNIX como para otros sistemas operativos (incluido MS-DOS). NFS NFS posee dos tipos distintos de máquinas, las que operan como NFS Cliente y las que operan como NFS Servidor. Las NFS Cliente utiliza los directorios remotos como si fueran parte de su sistema de archivo local. Por su parte las máquinas que operan como NFS Servidor, se encargan de publicar sus directorios y responder a las peticiones de los NFS Cliente. En la mayoría de los casos, todos los clientes y servidores están en la misma LAN, pero esto no es necesario. Es posible ejecutar NFS en una red de área amplia. Se hablará de los clientes y servidores como si estuvieran en máquinas diferentes, sin embargo, NFS permite que cada máquina sea cliente y servidor al mismo tiempo. Cada servidor NFS exporta uno o más de sus directorios para su acceso por parte de los clientes remotos. Cuando se dispone de un directorio, también de todos sus subdirectorios. La lista de directorios que puede exportar un servidor se conserva en el archivo /etc/exports, de modo que estos directorios se pueden exportar de manera automática al arrancar el servidor. Los clientes tienen acceso a los directorios exportados al montarlos. Cuando un cliente monta un directorio (remoto), éste se vuelve parte de su jerarquía de directorios. Si así lo desea, un cliente sin disco puede montar un sistema de archivos remoto en su directorio raíz, lo que produce un sistema de archivos por completo soportado en un servidor remoto. Las estaciones de trabajo que sí tienen discos locales pueden montar directorios remotos en el sitio que deseen de su jerarquía local de directorios, lo que produce un sistema de archivos parcialmente local y parcialmente remoto. Así, la característica básica de la arquitectura de NFS es que los servidores exportan directorios y los clientes los montan de manera remota. Si dos o más clientes montan el mismo directorio al mismo tiempo, se pueden comunicar compartiendo archivos en sus directorios 9 Sistemas Operativos Distribuidos MC Hilda Castillo Zacatelco BUAP comunes. Un programa en un cliente puede crear un archivo, y un programa en otro cliente puede leer el archivo. Una vez realizados los montajes, no hay que hacer nada especial para lograr compartir los archivos. Los archivos compartidos sólo están ahí, en la jerarquía de directorios de varias máquinas y pueden leerse y escribir en ellos de la manera usual. Esta sencillez es uno de los puntos fuertes de NFS. NFS utiliza llamadas a procedimientos remotos o RPC (Remote Procedure Calls), para la comunicacion entre los clientes y el servidor. RPC permite que los clientes hagan llamadas de procedimientos a procesos que aparentemente son locales, pero que en realidad estan corriendo en una máquina remota. En el caso de NFS, el servidor que recibe la llamada contiene recursos (especificamente archivos), necesitados por los clientes que lo invocan. Para asegurar la integridad del intercambio de datos entre el servidor y los clientes, NFS emplea el mecanismo XDR (eXternal Data Representation). Este mecanismo define un formato independiente de la plataforma para realizar el intercambio de datos binarios. Protocolos de NFS. Puesto que uno de los objetivos de NFS es soportar un sistema heterogéneo, con clientes y servidores que tal vez ejecuten diferentes sistemas operativos con un hardware distinto, es esencial que la interfaz entre los clientes y los servidores esté bien definida. NFS logra este objetivo al definir dos protocolos cliente-servidor. Un protocolo es un conjunto de solicitudes enviadas por los clientes a los servidores, junto con las respuestas enviadas de regreso de los servidores a los clientes. De manera análoga, los clientes pueden tratar a los servidores como "cajas negras" que aceptan y procesan un conjunto especifico de solicitudes. La forma en que lo hacen es asunto de ellos. El primer protocolo NFS controla el anclaje. Un cliente puede enviar un nombre de ruta de acceso a un servidor y solicitar que monte ese directorio en alguna parte de su jerarquía de directorios. El lugar donde se montará no está contenido en el mensaje, ya que el servidor no se preocupa por dicho lugar. Si la ruta es válida y el directorio especificado ha sido exportado, el servidor regresa un identificador de archivo al cliente. El asa de archivo contiene campos que identifican de manera única al tipo de sistema de archivo, el disco, el número de inodo del directorio, e información de seguridad. Las llamadas posteriores para la lectura y escritura de archivos en el directorio montado utilizan el identificador del archivo. Otra alternativa a la versión de UNIX de Sun soporta también el automontaje. Esta característica permite asociar un conjunto de directorios con un directorio local. Ninguno de los directorios remotos se monta (ni se realiza el contacto con sus servidores) cuando arranca el cliente. En vez de esto, la primera vez que se abre un archivo remoto, el sistema operativo envía un mensaje a cada uno de los servidores. El primero en responder gana, y se monta su directorio. El automontaje tiene dos ventajas principales sobre el montaje estático por medio del archivo /etc/rc. La primera es que si uno de los servidores NFS llamados en /etc/rc no está sirviendo peticiones, es imposible despertar al cliente, al menos no sin cierta dificultad, retraso y unos cuantos mensajes de error. Si el usuario ni siquiera necesita ese servidor por el momento, todo ese trabajo se desperdicia. En segundo lugar, al permitir que el cliente intente comunicarse con un conjunto de servidores en paralelo, se puede lograr cierto grado de tolerancia a fallos (puesto que sólo se necesita que uno de ellos esté activo) y se puede mejorar el desempeño (al elegir el primero que responda, que supuestamente tiene la menor carga). NFS no da soporte para la réplica de archivos o directorios, el usuario debe lograr que todos los sistemas de archivos sean iguales. En consecuencia, el automontaje se utiliza con más frecuencia para los sistemas de archivos exclusivos para lectura que contienen binarios del sistema y para otros archivos que rara vez cambian. El segundo protocolo NFS es para el acceso a directorios y archivos. Los clientes pueden enviar mensajes a los servidores para que manejen los directorios y lean o escriban en archivos. Además, también pueden tener acceso a los atributos de un archivo, como el modo, tamaño y tiempo de su última modificación. NFS omite las llamadas OPEN y CLOSE. No es necesario abrir un archivo antes de leerlo, o cerrarlo al terminar. En vez de esto, para leer un archivo, un cliente envía al servidor un mensaje con el nombre del archivo, una solicitud para buscarlo y regresar un identificador de archivo, que es una estructura de identificación del archivo. La llamada READ contiene al 10 Sistemas Operativos Distribuidos MC Hilda Castillo Zacatelco BUAP identificador de archivo que se desea leer, el ajuste para determinar el punto de inicio de la lectura y el número de bytes deseados. El servidor no tiene que recordar lo relativo a las conexiones abiertas entre las llamadas a él. Así, si un servidor falla y después se recupera, no se pierde información acerca de los archivos abiertos, puesto que no hay ninguno. Un servidor como éste, que no conserva información del estado de los archivos abiertos se denomina sin estado. Por el contrario, en el sistema V de UNIX, el sistema de archivos remotos (RFS) requiere abrir un archivo antes de leerlo o escribir en él. El servidor crea entonces una entrada de tabla con un registro del hecho de que el archivo está abierto y la posición actual del lector, de modo que cada solicitud no necesita un ajuste. La desventaja de este esquema es que si un servidor falla y vuelve a arrancar rápidamente, se pierden todas las conexiones abiertas, y fallan los programas cliente. NFS no tiene esta característica. El método NFS dificulta el hecho de lograr la semántica de archivo propia de UNIX. Por ejemplo, en UNIX un archivo se puede abrir y bloquear para que otros procesos no tengan acceso a él. Al cerrar el archivo, se liberan los bloqueos. En un servidor sin estado como NFS, las cerraduras no se pueden asociar con los archivos abiertos, puesto que el servidor no sabe cuáles son los archivos están abiertos. Por lo tanto, NFS necesita un mecanismo independiente adicional para controlar los bloqueos. NFS utiliza el mecanismo de protección de UNIX, con los bits rwx para el propietario, grupo y demás personas. En un principio, cada mensaje de solicitud sólo contenía los identificadores del usuario y del grupo de quien realizó la llamada, lo que utilizaba el servidor NFS para validar el acceso. De hecho, confiaba en que los clientes no mintieran. Varios años de experiencia han demostrado que tal hipótesis era un tanto ingenua. Actualmente, se puede utilizar la criptografía de claves públicas para establecer una clave segura y validar al cliente y al servidor en cada solicitud y respuesta. Los datos nunca se encriptan. Todas las claves utilizadas para la autenticación, así como la demás información, son mantenidas por el NIS (servicio de información de la red). NIS se conocía antes como el directorio de páginas amarillas (yellow pages). Su función es la de guardar parejas (clave, valor). Cuando se proporciona una clave, regresa el valor correspondiente. No sólo controla las claves de cifrado, sino también la asociación de los nombres de usuario con las contraseñas (cifradas), así como la asociación de los nombres de las máquinas con las direcciones de la red, y otros elementos. Los servidores de información de la red se duplican mediante un orden maestro/esclavo. Para leer sus datos, un proceso puede utilizar al maestro o cualquiera de sus copias (esclavos). Sin embargo, todas las modificaciones deben ser realizadas únicamente en el maestro, que entonces las propaga a los esclavos. Existe un breve intervalo después de una actualización en el que la base de datos es inconsistente. Implantación de NFS La capa superior es la capa de llamadas al sistema, la cual controla las llamadas como OPEN, READ y CLOSE. Después de analizar la llamada y verificar sus parámetros, llama a la segunda capa, la capa del sistema virtual de archivos (VFS). La tarea de la capa VFS es mantener una tabla con una entrada por cada archivo abierto, análoga a la tabla de inodos para los archivos abiertos en UNIX. En el UNIX ordinario, un inodo queda indicado de manera única mediante una pareja (dispositivo, inodo). En vez de esto, la capa VFS tiene una entrada, llamada vnodo (inodo virtual), para cada archivo abierto. Los vnodos se utilizan para indicar si un archivo es local o remoto. Para los archivos remotos, se dispone de suficiente información para tener acceso a ellos. Para ver la forma de utilizar los vnodos, sigamos una secuencia de llamadas al sistema MOUNT, OPEN y READ. Para montar un sistema remoto de archivos, el administrador del sistema llama al programa mount con la información del directorio remoto, el directorio local donde será montado y algunos otros datos adicionales. El programa mount analiza el nombre del directorio remoto por montar y descubre el nombre de la máquina donde se localiza dicho directorio. Entonces, entra en contacto con la máquina en la que se localiza el directorio remoto. Si el directorio existe y está disponible para su montaje remoto, el servidor regresa entonces un identificador de archivo para el directorio. Por último, llama a MOUNT para transferir el identificador del archivo al núcleo. El núcleo construye entonces un vnodo para el directorio remoto y pide el código del cliente NFS para crear un rnodo (inodo remoto) en sus tablas internas, con el fin de mantener el identificador del archivo. El 11 Sistemas Operativos Distribuidos MC Hilda Castillo Zacatelco BUAP vnodo apunta al rnodo. Así, cada vnodo de la capa VFS contendrá en última instancia una referencia a un rnodo en el código del cliente NFS o una referencia a un inodo en el sistema operativo local. Así, es posible ver desde el vnodo si un archivo o directorio es local o remoto y, si es remoto, encontrar su identificador de archivo. Al abrir un archivo remoto, en cierto momento durante el análisis del nombre de la ruta de acceso, el núcleo alcanza el directorio donde se desea montar el sistema de archivos remoto. Ve que este directorio es remoto y en el vnodo del directorio encuentra la referencia al rnodo. Le pide entonces al código del cliente NFS que abra el archivo. El código del cliente NFS busca en la parte restante del nombre de la ruta de acceso en el servidor remoto asociado con el directorio montado y regresa un identificador de archivo para él. Crea en sus tablas un rnodo para el archivo remoto y regresa a la capa VFS, la cual coloca en sus tablas un vnodo para el archivo que apunta al rnodo. De nuevo, vemos aquí que todo archivo o directorio abierto tiene un vnodo que apunta a un rnodo o a un inodo. Quien hizo la llamada recibe un descriptor de archivo para el archivo remoto. Este descriptor de archivo se asocia con el vnodo mediante las tablas en la capa VFS. Observe que no se crean entradas en las tablas del lado del servidor. Aunque el servidor está listo para proporcionar los identificadores de archivo que le soliciten, no mantiene un registro de los archivos que tienen identificadores activos y los que no. Cuando se le envía un asa de archivo para el acceso a un archivo, verifica el identificador y, si éste es válida, sa utiliza. El proceso de validación puede incluir una clave de autenticación contenida en los encabezados RPC, si la seguridad está activada. Cuando el descriptor de archivo se utiliza en una llamada posterior al sistema, por ejemplo, READ, la capa VFS localiza el vnodo correspondiente y por medio de él determina si es local o remoto y el inodo o rnodo que lo describe. Por razones de eficiencia, las transferencias entre el cliente y el servidor se realizan en bloques grandes, por lo general de 8192 bytes, aunque se soliciten menos. Después de que la capa VFS del cliente ha obtenido el bloque de 8K que necesitaba, emite en forma automática una solicitud del siguiente bloque, por lo que lo recibirá rápidamente. Esta característica se conoce como lectura adelantada y mejora en forma considerable el rendimiento. Se sigue una política análoga para la escritura. Sin embargo, al cerrar un archivo, todos sus datos se envían al servidor de manera inmediata. Otra de las técnicas que se utilizan para mejorar el rendimiento es el ocultamiento, como en el UNIX ordinario. Los servidores ocultan los datos para evitar el acceso al disco, pero esto es invisible para los clientes. Los clientes mantienen dos caches, uno para los atributos de archivo (inodos) y otro para los datos del archivo. Cuando se necesita un inodo o un bloque del archivo, primero hay que verificar si esta solicitud se puede satisfacer mediante el caché del cliente. En este caso, se evita el tráfico en la red. Pero puede suceder que el caché no sea coherente. Debido a la severidad potencial de este problema, la implantación de NFS hace varias cosas para mitigarlo. Una de ellas es que a cada bloque caché se le asocia un cronómetro. Cuando éste expira, la entrada se descarta. Por lo general, el tiempo es de 3 segundos para los bloques de datos y de 30 segundos para los bloques de directorio. Esto reduce un poco el riesgo. Además, al abrir un archivo con caché, se envía un mensaje al servidor para revisar la hora de la última modificación. Si la última modificación ocurrió antes de capturar en el caché la copia local, se descarta la copia del caché y se utiliza la nueva copia del servidor. Por último, el cronómetro del caché expira cada 30 segundos y todos los bloques sucios (es decir, modificados) en el caché se envían al servidor. Aún así, NFS ha recibido amplias críticas por no implantar de manera adecuada la semántica apropiada de UNIX. Una escritura a un archivo de un cliente podría o no ser vista cuando otro cliente lea el archivo, según la sincronización. Además, al crear un archivo, esta acción podría no ser visible para el mundo exterior durante un periodo de 30 segundos. Existen otros problemas similares. Por medio de este ejemplo, vemos que aunque NFS tiene un sistema compartido de archivos, como el sistema resultante es una especie de UNIX parchado, la semántica del acceso a los archivos no está por completo bien definida y la ejecución de un conjunto de programas que cooperen entre sí podría producir diversos resultados, según la sincronización. Además, lo único con lo que trata NFS es con el sistema de archivos. No hace referencia a otros aspectos, como la ejecución de un proceso. A pesar de todo, NFS es popular y tiene un uso muy extendido. Ventajas de NFS 12 Sistemas Operativos Distribuidos MC Hilda Castillo Zacatelco BUAP Reducción de requerimento de espacio de Almacenamiento en disco en las Estaciones de Trabajo. Incluso proveer espacio en disco a estaciones que no posean uno propio. Reducción de Tareas de Administración, debida a centralización de archivos tanto comunes como no comunes. Puede ser utilizado como complemento a NIS. Facilita el trabajo con archivo remotos ya que no es necesarios conocer los comandos remotos (ftp, rlogin, rsh, etc). Ayuda a mantener la consistencia de los archivos entre las diferentes estaciones de trabajo. Puede utilizarse para la Comunicación entre Usuarios y/o Programas. Con el uso de NFS se pueden configurar los home directories de los usuarios con lo que, una vez exportados en la red, cada usuario puede utilizar su mismo “home directory” independientemente de la máquina de la red que este utlizando. NFS realiza sus comunicaciones a través del Protocolo UDP. Para solventar las deficiencias inherentes de confiabilidad de UDP, NFS implementa en sus servidores un mecanismo de reconocimiento (acuse de recibo) a cada petición ejecutada por los clientes, de tal manera le asegura a los clientes que su petición fue atendida, de no recibir ningun “ack”, los clientes reenvian su petición. La mayoria de las peticiones son idempotentes, para lidiar con las pocas peticiones no idempotentes y las posibles retransmitidas de las mismas, los servidores mantienen en una memoria caché las últimas peticiones no-idempotentes realizadas, con el objetivo de eliminar la posible doble-ejecución de las mismas. NFS esta contruido sobre RPC (Remote Procedure Call). NFS utiliza la permisología de UNIX (ACL), por lo que para cada peticion de un cliente NFS , el servidor NFS recibe el UID y el GID del usuario. Para evitar problemas de seguridad, NFS le da el UID de usuario a cada usuario root de las máquinas cliente. Existen dos tipos de Montaje de un direcitorio por parte de un cliente, Hard y Soft, Con el primero de ellos el cliente va a intentar montar el directorio cuantas veces sea necesario hasta lograrlo, mientras que del modo Soft, lo intentara hasta que suceda un timeuot establecido. NFS es independiente de la plataforma de hardware y software sobre la cual opera. Esto permite que sea portable a múltiples Sistemas Operativos y plataformas de hardware, que van desde computadores hasta mainframes. NFS es flexible en cuanto a los protocolos de transporte, es decir, que puede correr en multiples protocolos de transporte, en vez de estar restringido a uno en especifico. la Usuarios y aplicaciones pueden acceder a archivos remotos como si estos fuesen locales; por el hecho de utilizar RPC, los tiempos de respuesta son tan rápidos, como si los archivos estuviesen almacenados en discos locales. NFS utiliza RPC sobre el protocolo XDR (eXternal Data Representation), el cual asegura inviolabilidad en los datos transportados. Ademas, RPC utiliza intercambio de parámetros de autenticación, para dar dar seguridad a la informacion transportada en la red. Características Básicas de NFS Los servidores NFS no mantienen el estado de ninguno de sus clientes, esto impulsa dos cualidades para NFS como lo son la disminución del tiempo de reestablecimiento de los servidores al momento de fallar. Asi como también impulsa a una gran escalabilidad en el número de clientes a los cuales puede servir. Demonios involucrados en NFS. 13 Sistemas Operativos Distribuidos MC Hilda Castillo Zacatelco BUAP Nombre mountd nfsd Lockd Descripicion Es un servidor de RPC que responde a las peticiones de montaje de sistemas de archivos y a peticiones de informacion de acceso. Lee el archivo /etc/dfs/sharetab para determinar que sistemas de archivos están exportados y quienes tienen acceso a ellos. Es el demonio central del NFS, es quien se encarga de atender las peticiones efectuadas por los clientes Se encarga del bloqueo de archivos para asegurar así la consistencia de los mismos al ser accesados concurrentemente. Corre tanto en el servidor como en el cliente. Opciones -v Modo detallado. -r rechaza las peticiones de nuevos clientes. -a levanta el demonio con capacidad de trabajar tanto con TCP como UDP. -c fija el # maximo de conexiones TCP. -l # maximo de entradas para la cola de conexiones TCP. -p protocolo sobre el cual se levantará el demonio. -t levanta el demonio sobre el transporte especificado. nservers # de hilos para atender peticiones concurrentemente. -g especifíca el tiempo que tienen los clientes para reclamar el Statd Funciona en cooperación con lockd para recuperar el estado de los archivos bloqueados cuando el servidor se cae. Luego de levantarse de nuevo, informa a los clientes que se reestableció el servicio basándose en la información del lockd. Tambien se encarga de avisar a los servidores en caso que ocurra una caída de un cliente que posea un archivo bloqueado. portmap Es el demonio que permite a los clientes NFS, descubrir cual puerto esta siendo usado por el servidor NFS para prestar el servicio. bloqueo de los archivos después que el servido arranca. -t fija el número de segundo a esperar antes de retransmitir una petición de bloqueo a otro servidor remoto. nthreads # de hilos a levantar para atender las peticiones concurrentes. 14 Sistemas Operativos Distribuidos MC Hilda Castillo Zacatelco BUAP Recomendaciones de Seguridad. Protocolo Debería estar configurado para dar acceso solo a ciertos clientes, por lo que se debería configurar para utilizar autentificación de usuarios. De ser posible deberían solo exportarse sistemas de archivos de solo lectura. Limitar el número de sistemas de archivos que cada cliente monta, mientras menos mejor. Evitar exportar los ejecutables. Evitar exportar directorios home. No exportar directorios que tienen permiso de escritura para todo el mundo (ACL). Evitar que una máquina sea tanto servidor como cliente NFS. No permitir login a usuarios desde otras maquinas Servidores NFS. Es "hablado" por el montd, se utiliza para la negociación iniciada entre el cliente y el servidor NFS. MOUNT Comandos Con este protocolo en cliente puede conocer que directorios estan exportados, así como obtener el manejador de archivos del sistema de archivos que esta montando. mount Este comando permite a un cliente a montar un directorio remoto dentro de la estructura jerárquica de su sistema de archivos. La estructura general del Comando es: mount host_name:remote_dir local_dir. unmount Este Comando permite a un usuario cliente desmontar un directorios que no esten en uso, para ello es necesario especificar donde esta montado el sistema de archivos. La estructura gerenal del Comando es: unmount host_name:remote_dir. Descripción Este es el protocolo que actúa después que la fase de montaje ha concluido. CREATE: Crea o Trunca un archivo dentro de un directorio. Permite manipular el sistema de archivos montado. LINK: Crea un enlace. NFS Protocolos Involucrados en el NFS Nombre del NULL: no hace nada. MNT: Retorna un asa de archivo de la raíz del directorio exportado, también avisa al mountd que un cliente ha montado un sistema de archivos. DUMP: Retorna una lista de sistemas de archivos montados. UMNT: Retira la entrada de montaje de un cliente para cierto directorio de archivos exportado. UMNTALL: Retira todas las entradas de montaje para ese cliente. EXPORT: Retorna la lista de todos los sistemas de archivos exportados para ese cliente. Peticiones Comprendidas LOOKUP: Busca un 15 Sistemas Operativos Distribuidos MC Hilda Castillo Zacatelco BUAP archivo en un directorio. MKDIR: Crea un directorio. READDIR: Lee el contenido de un directorio. REMOVE: Borra un archivo de un directorio. RENAME: Renombra un archivo de un directorio. RMDIR: Elimina un directorio. SYMLINK: Crea un enlace simbolico. GETATTR: Retorna los atributos de un archivo. SETATTR: Establece los atributos de un archivo. READ: Lee un archivo. WRITE: Escribe en un archivo 3. Núcleo El Kernel consiste en la parte principal del código del sistema operativo, el cual se encargan de controlar y administrar los servicios y peticiones de recursos y de hardware con respecto a uno o varios procesos, este se divide en 5 capas: Nivel 1. Gestión de Memoria: que proporciona las facilidades de bajo nivel para la gestión de memoria secundaria necesaria para la ejecución de procesos. Nivel 2. Procesador: Se encarga de activar los cuantums de tiempo para cada uno de los procesos, creando interrupciones de hardware cuando no son respetadas. Nivel 3. Entrada/Salida: Proporciona las facilidades para poder utilizar los dispositivos de E/S requeridos por procesos. Nivel 4. Información o Aplicación o Intérprete de Lenguajes: Facilita la comunicación con los lenguajes y el sistema operativo para aceptar las órdenes en cada una de las aplicaciones. Cuando se solicitan ejecutando un programa el software de este nivel crea el ambiente de trabajo e invoca a los procesos correspondientes. Nivel 5. Control deArchivos: Proporciona la facilidad para el almacenamiento a largo plazo y manipulación de archivos con nombre, va asignando espacio y acceso de datos en memoria. El núcleo y los procesos Todas las operaciones en las que participan procesos son controladas por la parte del sistema operativo denominada núcleo (nucleus, core o kernel, en inglés). El núcleo normalmente representa sólo una pequeña parte de lo que por lo general se piensa que es todo el sistema operativo, pero es tal vez el código que más se utiliza. Por esta razón, el núcleo reside por lo regular en la memoria principal, mientras que otras 16 Sistemas Operativos Distribuidos MC Hilda Castillo Zacatelco BUAP partes del sistema operativo son cargadas en la memoria principal sólo cuando se necesitan. Los núcleos se diseñan para realizar “el mínimo” posible de procesamiento en cada interrupción y dejar que el resto lo realice el proceso apropiado del sistema, que puede operar mientras el núcleo se habilita para atender otras interrupciones. Resumen de las Funciones del Núcleo El núcleo de un sistema operativo normalmente contiene el código necesario para realizar las siguientes funciones: Manejo de interrupciones. Creación y destrucción de procesos. Cambio de estado de los procesos. Despacho. Suspensión y reanudación de procesos. Sincronización de procesos. Comunicación entre procesos. Manipulación de los bloques de control de procesos. Apoyo para las actividades de entrada/salida. Apoyo para asignación y liberación de memoria. Apoyo para el sistema de archivos. Apoyo para el mecanismo de llamada y retorno de un procedimiento. Apoyo para ciertas funciones de contabilidad del sistema. Tipos de kernel En función del tamaño y de las funcionalidades que posea el kernel podemos clasificarlo. Realmente, y pese a seguidores incondicionales en un modelo u otro, existe una tendencia básica a reducir el tamaño del núcleo proporcionando menos funcionalidades, que son desplazadas a módulos que se cargan en tiempo de ejecución. En función a esta idea tenemos tres tipos fundamentales de kernel: Kernel monolítico Todas las funcionalidades posibles están integradas en el sistema. Se trata de un programa de tamaño considerable que deberemos recompilar al completo cada vez que queramos añadir una nueva posibilidad. Esta es la estructura original de Linux. Por tratarse de una técnica clásica y desfasada el creador de Linux fue muy criticado. Kernel modular (Núcleo Colectivo): En esta estructura se tiene una colección de procesos que son ampliamente independientes unos de otros. Los servicios del Sistema Operativo ( Administración de memoria distribuida, sistemas de archivos distribuidos, sincronización distribuida, procesos RPC, administración de tiempos, etc.) son implementados como procesos independientes. El núcleo del Sistema Operativo ( Comúnmente llamado Microkernel ) soporta la interacción entre los procesos que proveen los servicios al Sistema Operativo, también provee los servicios típicamente esenciales para cada computadora tal como la administración de tareas. El microkernel se ejecuta en todas las computadoras del sistema, mientras que los otros procesos pueden o no correr según se requiera. Se trata de la tendencia actual de desarrollo. Sin embargo no tiene sentido que el núcleo de un sistema operativo englobe toda la parafernalia para comunicarse con todas las posibles de tarjetas de vídeo o de sonido. En otros sistemas operativos esto se soluciona con unos ficheros proporcionados por el fabricante llamados drivers. En Linux se creó un 17 Sistemas Operativos Distribuidos MC Hilda Castillo Zacatelco BUAP interfaz adecuado para posibilitar el desarrollo de módulos que cumplieran esas funcionalidades. Esos módulos pueden ser compilados por separado y añadidos al kernel en tiempo de ejecución. 3.Procesos y procesadores en sistemas distribuidos Los procesos no comparten el mismo espacio de direcciones y no tienen nada que ver uno con otro. Para comunicarse utilizan primitivas de comunicación como memoria compartida, tuberías y paso de mensajes. En muchos sentidos los hilos son como miniprocesos. Cada hilo tiene su contador del programa, su pila para llevar el registro de su posición y se ejecutan en forma estrictamente secuencial. Los hilos comparten el mismo CPU (a menos que haya varios CPU, en ese caso se ejecutan en paralelo). Los hilos pueden crear hilos hijo y se pueden bloquear. A diferencia de un proceso, un Hilo (proceso ligero) comparte el espacio de direcciones con otros hilos por lo tanto comparten variables globales. Los hilos se inventaron para permitir la combinación del paralelismo con la ejecución secuencial y el bloqueo de las llamadas al sistema. Aspectos del diseño de paquetes de hilos Paquete de hilos. Un conjunto de primitivas relacionadas con los hilos. Manejo de hilos Se tienen dos alternativas: - Hilos estáticos. Se elige el número de hilos al escribir el programa o durante su compilación. Cada uno de ellos tiene asociada una pila fija. - Hilos dinámicos. Se permite la creación y destrucción de los hilos durante la ejecución. Los hilos pueden concluir de dos maneras: - Pueder terminar por sí mismos al finalizar su trabajo. - Pueden ser eliminados desde el exterior. Una técnica dentro de los paquetes de hilos para el manejo de exclusión mutua es el mútex, que es cierto tipo de semáforo binario. Un mútex solo tiene dos estados: cerrado, mediante la operación LOCK (si un hilo intenta cerrar un mútex ya cerrado, se bloquea); y no cerrado, para liberar un mútex se utiliza la operación UNLOCK (cuando UNLOCK elimina la cerradura de un mútex y uno o más hilos esperan ese mútex, se libera solo uno de ellos. El resto continua en espera. Otra operación que se tiene en ciertos casos es TRYLOCK, que intenta cerrar un mútex. Si el mútex no esta cerrado, TRYLOCK regresa un código de estado que indica el éxito. En caso contrario, TRYLOCK no bloquea el hilo, sino que regresa un código de error. Otra característica de sincronización a veces disponible en los paquetes de hilos es la variable de condición. Por lo general se asocia una variable de condición a un mútex cuando éste se crea. La diferencia entre un mútex y una variable de condición, es que el primero se utiliza para una cerradura a corto plazo, principalmente para proteger la entrada a regiones críticas. Las variables de condición se utilizan para una espera a largo plazo hasta que un recurso esté disponible. Un problema que presentan los hilos es el manejo de variables globales que no son globales en todo el programa, por ejemplo la variable errno. Si un hilo hizo una llamada al sistema y dejó en errno un valor importante, puede ser que el despachador interrumpa a ese hilo antes de llevar a cabo la operación correspondiente al valor de errno, suponga que el siguiente hilo en despacharse también hace una llamada al sistema, la cual modifica errno; por lo tanto, el primer hilo habrá perdido el valor que obtuvo en errno, ya que ésta ha sido sobreescrita por otro hilo. Las posibles soluciones a este problema son las siguientes: Prohibir las variables globales Asignar a cada hilo sus propias variables globales particulares. Cada hilo tiene copia de la variable global. Una mejora a esto es asignar un bloque de memoria a las variables globales y transferirlo a cada procedimiento del hilo como un parámetro adicional. 3. Introducir nuevos procedimientos de biblioteca para crear, dar valores y leer estas variables globales a lo largo de todo un hilo. 1. 2. Planificación Se pueden utilizar los algoritmos de prioridad, roun robin, lotería, etc. 18 Sistemas Operativos Distribuidos MC Hilda Castillo Zacatelco BUAP A menudo los paquetes de hilos proporcionan ciertas llamadas para que el usuario pueda especificar el algoritmo de despacho y establecer las prioridades (si es el caso). Implantación de un paquete de hilos Existen dos métodos: En el espacio de usuario En el espacio de núcleo Implantación de los hilos en el espacio de usuario El núcleo no sabe de la existencia de los hilos. Ventajas 1. El sistema operativo no debe soportar hilos. Por ejemplo UNIX 2. La planificación y cambio de estado la realiza un Sistema de Tiempo de Ejecución a nivel de usuario. 3. Se permite que cada proceso tenga su algoritmo de planificación adaptado. 4. Los hilos en este espacio tienen mejor escalabilidad, puesto que los hilos del núcleo requieren algún espacio para sus tablas y su pila en el núcleo, lo cual puede ser un problema si existe un número muy grande de hilos. Desventajas 1. La implantación de las llamadas al sistema con bloqueo. Por ejemplo la lectura a un pipe vacío. Se puede permitir el bloqueo a un hilo pero que no afecte a los demás. Con las llamadas al sistema con bloqueo esto no se puede lograr. Una posible solución sería modificar tales llamadas al sistema, pero cambiar el sistema operativo no es atractivo. Además uno de los objetivos de tener un paquete de hilos a nivel de usuario es poder ejecutar los sistemas operativos existentes. Un cambio de una llamada al sistema requeriría muchos cambios a muchos programas de usuario. Otra alternativa es, revisar primero si una llamada al sistema se bloqueará utilizando la llamada SELECT. Entonces la llamada al 2. 3. 4. 5. sistema bloqueante es reemplazada por SELECT y luego la llamada al sistema. SELECT verifica si la llamada es segura (no se va a bloquear), si es así se lleva a cabo, sino no se ejecuta. El código que se coloca junto a la llamada al sistema para hacer la verificación recibe el nombre de jacket. Este método requiere escribir parte de la biblioteca de llamadas. Bloqueo de las llamadas al sistema en el fallo de páginas. Si un hilo causa un fallo de páginas, el núcleo que desconoce la existencia de los hilos, bloqueará todo el proceso hasta que la página necesaria sea incluida aunque se puedan correr otros hilos. Si un hilo comienza su ejecución, ningún otro hilo de ese proceso puede ejecutarse, a menos que el primer hilo entregue en forma voluntaria el CPU. Dentro de un proceso, no existen interrupciones de reloj, lo que imposibilita la planificación round robin. Sincronización. Cuando un hilo realiza espera ocupada esperando la respuesta de un hilo, necesita interrupciones de reloj. La espera ocupada es atractiva cuando se espera una respuesta rápida y el costo del semáforo es alto, pero se pueden dar bloqueos. Los programadores desean los hilos en aplicaciones donde esto se bloqueen a menudo, por ejemplo en un servidor de archivos. Implantación de hilos en el núcleo El núcleo sabe de los hilos y como manejarlos. Este contiene una tabla con una entrada por cada hilo, con los registros, estado, prioridades y demás información relativa al hilo. Las llamadas que pueden bloquear un hilo se implantan como llamadas al sistema, con un costo considerable. Cuando un hilo se bloquea el núcleo ejecuta otro hilo del mismo proceso o de otro proceso. Pero el programador esperaría que se ejecutara un hilo del mismo proceso. Algunos sistemas reciclan sus hilos, cuando un hilo termina y se destruye, se marca como no ejecutable, pero sus estructuras de datos en el núcleo no se afectan sino que se ocupan cuando se crea otro hilo. Esto implica un ahorro. Los hilos del núcleo no requieren nuevas llamadas al sistema sin bloqueo, no conducen a bloqueos cuando se utiliza la espera ocupada. 19 Sistemas Operativos Distribuidos MC Hilda Castillo Zacatelco BUAP Si un hilo de un proceso provoca un fallo de página, el núcleo puede ejecutar otro hilo mientras que espera que la página requerida sea traida del disco. Los hilos en el espacio del usuario o del núcleo tienen asociados otros problemas. Muchos procedimientos no son reentrantes, por ejemplo cuando ambos hilos utilizan la variable errno o algún bufer estático. Esto sucede porque estos procedimientos no fueron escritos para hilos sino para un solo proceso. Una solución sería escribir toda la biblioteca. Otra solución consiste en proporcionar a cada quien su jacket que cierre un semáforo mutex global al iniciar el procedimiento. De hecho la biblioteca se convierte en un enorme monitor. Las señales también presentan dificultades. Modelos de Sistemas El modelo de estación de trabajo Este modelo consiste de estaciones de trabajo (WS) dispersas en un edificio o campus y conectadas entre sí por medio de una LAN. Las WS de trabajo pueden tener discos locales o no. Estaciones de trabajo sin disco Si las WS sw trabajo carecen de disco, el sistema de archivos debe ser implantado en uno o varios servidores de archivos de red. Ventajas Precio más bajo Fácil mantenimiento y respaldo. Al cambiar de versión de software o instalar uno nuevo, solo se tiene que instalar en pocos servidores. Son silenciosas (no tienen ventiladores ) Proporcionan simetría y flexibilidad. Un usuario puede entrar a cualquier estación de trabajo y entrar al sistema. Desventajas Se debe contar con uno o más servidores de archivos equipados con discos enormes y rápidos a los cuales se tiene acceso mediante una LAN. Gra uso de la red que puede llevar a cuellos de botella. Estaciones de trabajo con disco Formas en las que se puede utilizar el disco: 1. Para paginación y archivos temporales, los cuales se eliminan al finalizar la sesión. Su ventaja es reducir la carga de la red comparado con el caso sin disco, y su desventaja es el alto costo debido al gran número de discos duros. 2. Para paginación, archivos temporales y binarios del sistema, tales como compiladores, editores de texto, controladores de correo electrónico, etc. Este esquema reduce aún más la carga sobre la red. Su desventaja es el alto costo y la complejidad adicional para actualizar los binarios. 3. Para paginación, archivos temporales, binarios del sistema y sistema de ocultamiento de archivos. Los usuarios pueden cargar archivos desde los servidores de archivos hasta sus propios discos, leerlos y escribir en ellos en forma local, y después regresar los archivos modificados al final de la sesión. El objetivo es mantener centralizado el almacenamiento a largo plazo, pero reducir la carga en la red. Su principal desventaja es que puede tener problemas de consistencia del caché. 4. Un sistema local de archivos completo. Su ventaja es la escasa carga en la red y que elimina la necesidad de los servidores de archivos. Pero hay pérdida de transparencia y es más parecido a un sistema operativo de red Otros problemas relacionados con este modelo son los siguientes: Si los circuitos siguen abaratándose pronto será posible proporcionar a cada usuario varios CPU, pero serían demasiados en un solo lugar; además surgiría otro problema, la asignación de recursos sería ineficiente ya que algunos usuarios recibirían recursos que no necesitan mientras que otros usuarios si los necesitan. Uso de estaciones de trabajo inactivas 20 Sistemas Operativos Distribuidos MC Hilda Castillo Zacatelco BUAP El problema en el modelo de estaciones de trabajo es que existen WS inactivas o subutilizadas. La primera solución a este problema fue proporcionar el comando rsh (UNIX Berkeley), con este comando se puede ejecutar en una máquina remota un comando. Para llevar a cabo la ejecución remota de un comando en una máquina inactiva mediante rsh se debe tener un registro acerca de cuál WS esta inactiva. Además el proceso que se ejecuta en una máquina remota seguirá ejecutándose aunque llegue un usuario, quien debe aceptar el desempeño menor de su sistema o buscar otra máquina. Problemas clave a solucionar con respecto al tema de las estaciones de trabajo inactivas 1. ¿Cómo encontrar una estación de trabajo inactiva? 2. ¿Cómo lograr que un proceso remoto se ejecute en forma transparente? 3. ¿Qué ocurre si regresa el poseedor de la máquina? 1. La estación de trabajo esta inactiva cuando nadie toca el ratón o el teclado durante varios minutos y no se ejecuta algún proceso iniciado por el usuario. Los algoritmos para localizar una WS inactiva se pueden dividir en dos categorías: a) Controlados por el servidor b) Controlador por el cliente En el primer caso cuando una WS esta inactiva anuncia su disponibilidad registrándose en un archivo o base de datos, da su nombre, dirección de red y propiedades. Cuando el usuario desea ejecutar un comando en una WS inactiva, mediante un comando busca en el registro la WS adecuada (el registro de WS inactivas esta centralizado con algunas copias). Otra alternativa es que la WS inactiva envíe un mensaje en toda la red. Las demás WS registran el mensaje en su propio registro. Así la búsqueda tiene menor costo y mayor redundancia. La desventaja es pedir a todas las máquinas que se encarguen de mantener el registro. Puede haber condiciones de competencia si dos usuarios descubren una misma máquina como inactiva. Para solucionar este problema, se envía un mensaje a la máquina inactiva para detectar su estado, si aún esta libre, la máquina inactiva se elimina del registro. Entonces quien hizo la llamada puede enviar su ambiente e iniciar el proceso remoto. En el segundo método, controlado por el cliente. La máquina que busca una WS(ws) inactiva transmite una solicitud donde indica el programa que desea ejecutar, y los requerimientos de memoria, procesador, etc. Al regresar la respuesta se elige a una ws inactiva. Las ws inactivas retrasan sus respuestas, con un retraso proporcional a la carga actual. Así, la respuesta de la máquina con la menor carga llega primero y se selecciona. 2.Ahora hay que ejecutar el programa. El desplazamiento de código es fácil. Se debe configurar el proceso remoto de modo que vea el mismo ambiente que tendría en el caso local y llevar a cabo el cómputo de la misma forma que en el caso local. Necesita la misma visión del sistema de archivos, el mismo directorio de trabajo, mismas variables de ambiente. Problemas al ejecutar un proceso en otra máquina. Las llamadas al sistema ¿dónde dirigirlas? ¿a la máquina origen o a la máquina remota? Por ejemplo, la lectura de teclado y escritura a pantalla son funciones que deben dirigir la solicitud a la máquina origen; pero las llamadas que tienen que ver con prioridades o tamaño de memoria deben dirigir su solicitud a la máquina remota. Llamadas al sistema relacionadas con el tiempo Seguimiento del ratón Escritura en dispositivos de hardware 3.Si el poseedor de la máquina regresa no hacer nada, fácil pero destruye la idea de ws personales. Otra posibilidad es eliminar el proceso intruso, advirtiéndole primero para que tenga tiempo de cerrar archivos, escribir los búferes editados en un disco, etc. Sino sale después de unos segundos el proceso es terminado. Otro método es hacer que el proceso emigre a otra máquina, ya sea a la máquina origen o a alguna otra estación de trabajo inactiva. Esto es un proceso complejo. 21 Sistemas Operativos Distribuidos MC Hilda Castillo Zacatelco BUAP El proceso debe dejar la máquina en el mismo estado exactamente como la encontró. El modelo de pila de procesadores Se construye una pila de procesadores, repleta de CPU, en un cuarto de máquinas, los cuales se pueden ejecutar de forma dinámica a los usuarios según la demanda. A cada usuario se le da una terminal gráfica de alta rendimiento, como las terminales X, incluso se pueden utilizar terminales ascii. Ventajas Precio Elimina la asociación entre el número de usuarios y el de ws Facilita el crecimiento por incrementos De hecho se convierte el poder de cómputo en ws inactivas, a las que se puede tener acceso de manera dinámica. Aquí no existe el concepto de propiedad. El principal argumento para la centralización del poder de cómputo como pila de procesadores proviene de la teoría de colas. Los sistemas de colas son útiles, puesto que es posible modelarlos de forma analítica. Sea la tasa de entradas totales de solicitudes por segundo de todos los usuarios combinados. Sea la tasa de procesamiento de solicitudes por parte del servidor. Para una operación estable debemos tener > . Si el servidor procesa menos solicitudes que las que los usuarios generan, la cola crecerá sin límite. El promedio de tiempo entre la emisión de una solicitud y la obtención de una respuesta completa está relacionado con y mediante la fórmula T=1/( - ) 1) Si tenemos n computadoras, T estará dado en cada computadora como en 1). Ahora si reemplazamos estos n pequeños recursos por uno grande que sea n veces más poderoso, entonces tenemos, T=1/(n - n) = T/n Se reduce el tiempo promedio de respuesta n veces. Por esto una pila de procesadores tiene un mejor desempeño, aunque este en contra de los propios sistemas distribuidos. Sin embargo el tiempo promedio de respuesta no lo es todo. También esta el costo, la confiabilidad y la tolerancia a fallas. Una variación en el tiempo de respuesta también puede influir. Además en muchos trabajos la pila no es n veces mejor, pues no todos los trabajos se pueden ejecutar en paralelo. Aún así, el modelo de pila de procesadores es una forma más limpia de obtener poder de cómputo adicional que la búsqueda de estaciones inactivas. Ningún procesador pertenece a alguien, no hay máquina origen, no hay peligro de que el poseedor regrese. Seleccionar pila de procesadores o estaciones de trabajo inactivas va a depender del trabajo que se desarrolle. Modelo híbrido Se puede establecer una mediación al proporcionar a cada usuario una ws personal y además tener una pila de procesadores. Esto es más caro. Para procesos interactivos sería mejor utilizar ws. Para procesos que requieren un gran poder de procesamiento y no son interactivos es más adecuado una pila de procesadores. Asignación de procesadores Las estrategias de asignación de procesadores se pueden dividir en dos categorías amplias: -No migratorios. Cuando un proceso es creado, se decide donde colocarlo. Una vez colocado en una máquina, el proceso permanecerá ahí hasta que termine su ejecución. -Migratorios. Un proceso se puede trasladar aunque haya iniciado su ejecución. Este tipo de categorías permiten un mejor balance de carga. Un algoritmo que asigne procesos a procesadores, tiene como meta optimizar algún aspecto, por ejemplo los siguientes: -Maximizar el uso de CPU -Minimizar el tiempo de respuesta 22 Sistemas Operativos Distribuidos MC Hilda Castillo Zacatelco BUAP Aspectos del diseño de algoritmos de asignación de procesadores Las principales decisiones que deben tomar los diseñadores se pueden resumir en cinco aspectos: 1. Algoritmos deterministas vs. Heurísticos 2. Algoritmos centralizados vs. Distribuidos 3. Algoritmos óptimos vs. Subóptimos 4. Algoritmos locales vs. Globales 5. Algoritmos iniciados por el emisor vs. Iniciados por el receptor Los algoritmos deterministas son adecuados cuando se sabe de antemano todo acerca del comportamiento de los procesos o por lo menos una aproximación razonable. Cuando la carga del sistema es completamente impredecible se utilizan técnicas heurísticas. Tener toda la información en un solo lugar permite tomar una mejor decisión, pero es menos robusta y coloca una carga pesada en la máquina central. Son preferibles los descentralizados, pero carecen de alternaticas adecuadas. Encontrar la mejor asignación, la mas óptima es más caro, pues hay que recolectar más información y procesarla más. En la práctica se buscan soluciones subóptimas, heuríticas y distribuidas. Otro aspecto llamado política de transferencia, también es importante, tiene que ver con ejecutar un proceso en la máquina local o transferirlo, esta decisión depende de la carga de la máquina. Una escuela dice que la decisión se debe tomar con respecto a la información de la máquina local, si esta sobrecargada (esta por sobre una marca) entonces hay que migrar el proceso, sino el proceso se debe ejecutar en la máquina local. Otra escuela dice que es mejor recolectar toda la información del sistema para decidir donde ejecutar el proceso. El último aspecto tiene que ver con lo que se llama política de localización, decidir dónde enviarlo una vez que se ha decidido migrar el proceso. En el caso de los algoritmos iniciados por el emisor, es el emisor (la máquina local que necesita colocar su proceso en otra máquina) quien envia solicitudes a las demás máquinas en busca de ayuda y de un lugar apropiado para su proceso. En el caso de los algoritmos iniciados por el receptor, es el receptor quien decide que esta subcargada y que necesita trabajo, así que enviar mensajes a las demás máquinas a ver quien necesita ayuda. Aspectos de la implantación de algoritmos de asignación de procesadores Medición de la carga - Los algoritmos suponen que cada máquina conoce su carga. - Algunos algoritmos cuentan el número de procesos para determinar su carga. - Una mejora al criterio anterior es contar solo los procesos en ejecución o listos. - Otra forma de medir la carga es determinar la fracción de tiempo que el CPU esta ocupado. Costo excesivo - Muchos algoritmos teóricos ignoran el costo de recolectar medidas y desplazar los procesos de aquí para allá. - Al desplazar un proceso se debe verificar si hay ganancia en hacerlo. Para esto hay que tomar en cuenta el uso de memoria, tiempo de CPU y ancho de banda de la red. Complejidad - Existen algortimos que tienen un desempeño un poco mejor que otros, pero son más complejos. - Eager realizó un estudio a este respecto, y para ello trabajó con tres algoritmos. Se supone que al crear un nuevo proceso en una máquina, ésta se sobrecargará, por lo tanto hay que desplazar el proceso a otro lugar. 1. Se elige una máquina al azar y se envía el proceso, si la máquina esta subcargada entonces aceptará el proceso, en caso contrario se repite la operación hasta que alguien acepte el proceso o se exceda un contador de tiempo. 2. Se elige una máquina al azar y se le pregunta si esta subcargada, si su respuesta es afirmativa entonces la máquina origen le envía el proceso, sino se repite la operación con otra máquina elegida al azar y así hasta 23 Sistemas Operativos Distribuidos MC Hilda Castillo Zacatelco BUAP encontrar una máquina adecuada o se exceda el número de pruebas, en cuyo caso permanecerá en el sitio de su creación. 3. Se analizan k máquinas para determinar sus cargas exactas. El proceso se envía a la máquina con la carga más pequeña. El mejor algoritmos es el 3, sin embargo el algoritmo 2 tiene un desempeño casi igual al 3, pero es más sencillo. La conclusión a la que llegó Eager fue: “Si el uso de un algoritmo sencillo proporciona casi la misma ganancia que uno más caro y más complejo, es mejor utilizar el más sencillo”. Estabilidad - El sistema nunca esta en equilibrio por la actualización constante de las tablas de las máquinas, así una máquina podría pensar que otra esta actualizada sin que sea así. Ejemplo de algoritmos de asignación de procesadores Un algoritmo determinista según la teoría de gráficas Para sistemas que constan de procesos con requerimientos conocidos de CPU y memoria, además de una matriz conocida con el tráico promedio entre cada pareja de procesos. Si el número de CPU es menor que el número de procesos, habrá que asignar varios procesos al mismo CPU. La idea es llevar a cabo esta asignación de forma que se minimice el tráfico en la red. Sea la la siguiente gráfica de procesos, los arcos indican el nivel de comunicación entre los procesos. Una posible asignación es la siguiente: CPU1 CPU2 CPU3 3 B 2 C 3 1 F 2 E 8 5 4 6 3 1 5 4 G 4 H 2 3 B 2 C 3 CPU3 D A 1 F 2 2 E 8 5 4 6 3 1 28 unidades 5 4 G 4 H 2 I Podemos observar que la segunda asignación es la mejor. Un algoritmo centralizado Arriba-abajo (Mutka y Livny, 1987) es centralizado. Usa una tabla de uso, con una entrada por cada estación de trabajo personal. Si un proceso se ejecuta en otra máquina, la máquina origen acumula puntos de penalización cada segundo. Si tiene solicitudes pendientes no satisfechas, los puntos de penalización se restan de su entrada en la tabla de usos. Si no existen solicitudes pendientes y ningún procesador esta en uso, la entrada de la tabla de usos se desplaza un cierto número de puntos hacia el cero. Si la puntuación asociada a una estación de trabajo en la tabla de usos es positiva, indica que la estación de trabajo es un usuario de los recursos del sistema. Si tiene una puntuación negativa indica que necesita recursos, si es cero es neutra. El objetivo de este algoritmo es asignar la capacidad de manera justa. Su desventaja es que en sistemas grandes con muchos nodos crea cuellos de botella. Un algoritmo jeráquico D A 2 Otra posible asignación es: CPU1 CPU2 30 unidades Para este tipo de algoritmo es necesario una gran cantidad de procesadores, los cuales se agrupan por jerarquías, en un primer nivel (el nivel más alto) un grupo de procesadores forman el comité de coordinadores, en el siguiente nivel están los jefes de departamento. Los niveles pueden ser n, I 24 Sistemas Operativos Distribuidos MC Hilda Castillo Zacatelco BUAP todo dependerá del número de procesadores. En el último nivel están los trabajadores. Este algoritmo es utilizado en el sistema MICROS. Cuando una tarea requiere de varios procesadores, entonces la solicitud se hace a los jefes de departamento (o el nivel anterior al de los trabajadores), si estos no la pueden resolver la envían a su jefe inmediato, hasta alcanzar un nivel en donde se pueda resolver el problema. El administrador divide la solicitud en partes y los esparce entre los administradores por debajo de él, quienes repiten la operación hasta llegar a los trabajadores. Se señalan a los procesadores elegidos para realizar la tarea como ocupados y se informa de regreso en el árbol. Este algoritmo crea tráfico en la red cuando las ws están subcargadas (desempleadas), pero es mejor en este momento y crear tráfico cuando el sistema esta sobrecargado. Una posible modificación a este algoritmo es combinar el algoritmo anterior y este. Si una ws esta sobrecargada deberá intentar deshacerse de trabajo, y cuando este subcargada debe tratar de conseguir trabajo. Se puede manejar un historial de máquinas que estén crónicamente subcargadas o sobrecargadas. Un algoritmo de remates Comité de Coordinadores coordinadores Jefes de departamento Trabajadores Este algoritmo fue creado por Ferguson En este caso se crea una comunidad económica en donde los procesos compran tiempo de CPU para terminar su trabajo. Los procesadores venden sus ciclos al mejor postor. El precio de un procesador va de acuerdo a su velocidad, tamaño de memoria, hardware y a lo que pagó el último cliente, incluso el tiempo de respuesta. Cuando se desea iniciar un proceso hijo, verifica si alguien ofrece el servicio que necesita y elije el mejor. Genera una oferta. Los procesadores reúnen todas las ofertas y eligen una. Se informa a los ganadores y perdedores. Un algoritmo heurístico distribuido iniciado por el emisor Planificación en Sistemas Distribuidos Este algoritmo es el segundo algoritmo de Eager mencionado en páginas anteriores. La desventaja de este algoritmo es que si casi todas las ws están sobrecargadas entonces se enviarán pruebas de forma constante en vano. La red se sobrecargará cuando más trabajo existe. Cada máquina se puede planificar de forma independiente, pero si existen procesos que interactúan entre sí y que se ejecutan en diferentes procesadores habrá problemas. Por ejemplo, supongamos que A y B son procesos que van a comunicarse, lo mismo ocurre con C y D; supongamos que A y C se ejecutarán en el procesador 1, y B y D en el procesador 2, cuando A es despachado en el procesador 1 , D es despachado en el procesador 2, como A neesita comunicarse con B entonces se interrumpe su ejecución y lo mismo sucede con D en el procesador 2, en el procesador 1 se despacha ahora C y en el procesador 2 B; esto significa que la comunicación no se esta llevando a cabo de forma eficiente, y se pierde tiempo de cómputo. Un algoritmo heurístico distribuido iniciado por el receptor Este algoritmo es complementario al anterior. Cuando un proceso termina, el sistema verifica si la ws donde terminó el proceso tiene suficiente trabajo. En caso contrario, elige alguna máquina al azar y le solicita trabajo. Si no encuentra trabajo en N pruebas, el receptor deja de preguntar por cierto tiempo, e intenta de nuevo. 25 Sistemas Operativos Distribuidos MC Hilda Castillo Zacatelco BUAP Ousterhout (1982) propuso algoritmos basados en un concepto llamado coplanificación, el cual toma en cuenta los patrones de comunicación entre los procesos durante la planificación para garantizar que todos los miembros de un grupo se ejecuten al mismo tiempo. de un límite finito conocido, es síncrono. Un sistema que no tiene esta propiedad es asíncrono. Tolerancia de fallas El objetivo del diseño y construcción de sistemas tolerantes a fallas consisten en garantizar que el sistema continúe funcionando de manera correcta como un todo, incluso en la presencia de fallas. El método general para la tolerancia de fallas consisten en el uso de redundancia. Existen tres tipos posibles: Redundacia de la información. Se agregan bits para poder recuperar los bits revueltos. Redundacia del tiempo. Se realiza una acción y en caso necesario se vuelve a realizar. Este tipo de redundacia es de utilidad cuando las fallas son transitorias o intermitentes. Redundancia física. Se trata de agregar equipo adicional. Formas de organizar procesadores 1. Réplica activa 2. Respaldo primario Tolerancia de fallas mediante réplica activa (método de la máquina de estados) Las solicitudes deben ser recibidas y procesados en el mismo orden. Un sistema es tolerante de ka fallas si puede sobrevivir a fallas de k componentes, entonces son necesarios k+1 componentes. Fallas del sistema Tolerancia de fallas mediante respaldo primario Fallas de componentes Una falla es un desperfecto, causado por un error de diseño, de fabricación, de programación, físico, tiempo, condiciones ambientales, etc. Las fallas se clasifican en: -Transitorias. Ocurren una vez y después desaparecen. -Intermitente. Desaparece y reaparece. -Permanente. Continua existiendo hasta reparar el componente con el desperfecto. Se pueden distinguir dos tipos de fallas del procesador: 1. Fallas silentes. Un procesador que fallas solo se detiene y no responde a las entradas subsecuentes ni produce más entradas (también se llaman fallas de detención). 2. Fallas bizantinas. Un procesador que falla continúa su ejecución, proporcionando respuestas incorrectas a las preguntas, y posiblemente trabajando de manera maliciosa junto con otros procesadores que han fallado, para dar la impresión de que todos funcionan de manera correcta aunque no sea así. Sistemas síncronos vs. Asíncronos En el contexto de la investigación relativa a la tolerancia a fallas, un sistema que tiene la propiedad de responder siempre a un mensaje dentro Uso de redundancia 2.Realiza el trabajo 1.Solicitud Cliente 3.Actualiza Primario 6.Respuesta Respaldo 4.Realiza el trabajo 5.Reconocimiento Acuerdos en sistemas defectuosos -El problema de los dos ejércitos -El problema de los generales bizantinos 26 Sistemas Operativos Distribuidos MC Hilda Castillo Zacatelco BUAP 4. Comunicación en los sistemas distribuidos La diferencia más importante entre un sistema distribuido y un sistema con un procesador es la comunicación entre procesos. En un sistema con un procesador se supone la existencia de una memoria compartida, lo cual no existe en un sistema distribuido. La comunicación entre procesos debe respetar reglas llamadas protocolos. Protocolos con capas Para que dos procesos logren la comunicación se deben poner de acuerdo en varios aspectos como, cuántos voltios hay que utilizar para señalar un bit 0 y un bit 1; cómo detectar el fin de un mensaje, etc. Para facilitar este trabajo la organización internacional de estándares (internacional standards organization- ISO) ha desarrollado un modelo de referencia llamado el modelo de referencia para interconexión de sistemas abiertos, lo cual se abrevia como ISO OSI o el modelo OSI. El modelo OSI está diseñado para permitir la comunicación de los sistemas abiertos. Un sistema abierto es aquel preparado para comunicarse con cualquier otro sistema abierto mediante estándares que gobiernan el formato, contenido y significado de los mensaje enviados y recibidos. Un protocolo es un acuerdo entre las partes acerca de cómo debe desarrollarse la comunicación. El modelo OSI maneja dos tipos generales de protocolos (conexiones). 1. Protocolos orientados a la conexión. Antes de intercambiar datos, el emisor y el receptor deben establecer en forma explícita una conexión y tal vez el protocolo. 2. Protocolos son conexión. No es necesaria una negociación previa. En el modelo OSI, la comunicación se divide en 7 niveles o capas. Cada capa se maneja de forma independiente y se encarga de un aspecto específico. Cada capa proporciona una interfaz con la capa por encima de ella. La interfaz es un conjunto de operaciones que juntas definen el servicio que la capa está preparada para ofrecer a sus usuarios. La ventaja de un protocolo por capaz es su independencia, ya que una capa puede modificarse o mejorarse sin afectar a las demás. En el modelo OSI cuando se va a enviar un mensaje, este pasa por todas las capas comenzando en la de Aplicación. Cada capa le coloca un encabezado al frente o al final, al llegar el mensaje al otro lado, cada capa lo va desmenuzando, quitándole el encabezado que le corresponde; la capa que recibe el mensaje es la capa física. Capas Fisica, Enlace de Datos, Red, Transporte, Sesión, Presentación, Aplicación La colección de protocolos utilizados en un sistema particular se llama una serie de protocolos o pila de protocolos. Capa física Su propósito es transportar el flujo de bits de una máquina a otra. El protocolo de la capa física se encarga de la estandarización de las interfaces eléctricas, mecánicas y de señalización. Maneja elementos como la intensidad de la señal de red, cables, enchufes, voltajes, distancias entre cables. Capa de enlace de datos La tarea principal de esta capa es agrupar a los bits en unidades llamadas marcos o tramas, y detectar y corregir errores. Uno de los mecanismos en la detección de errores es asignar números secuenciales a las tramas y a cada trama colocarle una suma de verificación, sino esta correcta la suma de verificación a la hora de recibir el marco, entonces el receptor le pide al transmisor que vuelva a transmitir el marco x. Capa de red La tarea principal de la capa de red es elegir la mejor ruta (a esta actividad se le llama ruteo), la ruta más corta no siempre es la mejor, lo importante es la cantidad de retraso, y esto complica los algoritmos de ruteo. 27 Sistemas Operativos Distribuidos MC Hilda Castillo Zacatelco BUAP La capa de red maneja dos protocolos: X.25 (orientado a la conexión) y el IP (sin conexión). Capa de transporte La tarea de la capa de transporte es proporcionar conexiones confiables y económicas. Las conexiones confiables (orientadas a la conexión) se pueden construir por arriba de X.25 o IP. En X.25 los paquetes llegan en orden, en IP no, entonces la capa de transporte es la encargada de ponerlos en orden. El protocolo de transporte oficial ISO tiene cinco variantes, TP0, TP1, … , TP4. Los protocolos más utilizados en esta capa son: TCP (transmisión control protocol- protocolo para el control de transmisiones), orientado a la conexión y UDP (universal datagrama protocol- protocolo datagrama universal) que es un protocolo sin conexión. Capa de sesión Esta es en esencia una versión mejorada de la capa de transporte. Proporciona el control del diálogo, facilidades en la sincronización, la posibilidad de establecer conexiones llamadas sesiones y la posibilidad de transferir datos sobre las sesiones en forma ordenada. En la práctica rara vez las aplicaciones soportan esta capa. Capa de presentación Esta capa trata los problemas relacionados con la representación y el significado de los datos. Capa de aplicación Es una colección de varios protocolos para actividades comunes, como el correo electrónico, la transferencia de archivos y la conexión entre terminales remotas a las computadoras en una red. Esta capa contiene los programas de usuario. Protocolos utilizados: X.400 para correo electrónico, X.500 para el servidor de directorios. ATM Redes con modo de transferencia asíncrona Nació a finales de los 80’s debido a la necesidad de enviar además de datos a través de la red, también enviar voz. Para esto se eligió una forma híbrida con bloques de tamaño fijo sobre circuitos virtuales, para ambos tipos de tráfico. Este esquema es llamado modo de transferencia asíncrona (ATM- Asynchronous Transfer Mode), el cual se ha convertido en un estándar internacional. El modelo ATM consiste en que un emisor establece primero una conexión con él o los receptores. En el establecimiento de la conexión, se determina una ruta desde el origen hasta el destino y se guarda la información del ruteo en los conmutadores a lo largo del camino. Con esta conexión se pueden enviar paquetes, pero el hardware los separa en pequeñas unidades de tamaño fijo llamadas celdas, las cuales siguen todas la misma ruta. Cuando ya no se necesita la conexión, ésta se libera y se purga la información de ruteo de los conmutadores. Ventajas Se pueden enviar datos, voz, televisión, video, radio, etc. Se puede dar el servicio de videoconferencias. La red solo ve celdas sin saber lo que contienen, esto representa un ahorro, pues se puede enviar lo que sea por un solo cable. Una celda puede ir a varios destinos (multitransmisión) La multitransmisión se puede controlar de manera eficaz. Celdas de tamaño fijo y no de tamaño variable como los actuales ATM tiene su propio protocolo de jerarquías. Algunas de las implicaciones de ATM en sistemas distribuidos son: Velocidad a 155Mb/seg, a 622 Mb/seg y potencialmente a 25Gb/seg Tiene mayor ancho de banda Los problemas son que este tipo de redes es más caro, y al utilizarlas implicaría crear nuevos protocolos y arquitecturas de sistemas. El modelo cliente servidor Un sistema distribuido basado en LAN no utiliza de modo alguno los protocolos con capas; y si lo hacen, solo utilizan un subconjunto de toda una pila de protocolos. El modelo cliente-servidor se presenta con la idea de estructurar el sistema operativo como un grupo de procesos en cooperación, llamados servidores, que ofrezcan servicios a los usuarios, llamados clientes. Las 28 Sistemas Operativos Distribuidos MC Hilda Castillo Zacatelco BUAP máquinas de los clientes y servidores ejecutan el mismo micronúcleo (generalmente) y ambos se ejecutan como procesos de usuario. Este modelo se basa usualmente en un protocolo solicitud/respuesta sencillo y sin conexión. El cliente es quien solicita al servidor algún servicio, y el servidor es quien atiende la solicitud y regresa los datos solicitados o un código de error si algo falló. Ventajas Sencillez. El cliente envía un mensaje y obtiene respuesta. Eficiencia. La pila del protocolo es más corta y por tanto más eficiente. No es necesario implantar capas como la de sesión o red y transporte, ya que este trabajo lo hace el hardware. Se reducen los servicios de comunicación. Solo necesitamos las llamadas send (enviar) y receive (recibir). Direccionamiento Para que un proceso envíe un mensaje a otro proceso que esta en otra máquina, es necesario que el primer proceso sepa donde esta el otro proceso (su dirección). El primer acercamiento para resolver el problema de cómo identificar un proceso, es asociarle a cada máquina una dirección, aunque esto implicaría que cada máquina solo puede ejecutar un proceso. Para resolver esta limitante, entonces se podrían dar identificadores a los procesos y no a las máquinas, pero ahora surge el problema de cómo identificar dos procesos. Un esquema común consiste en utilizar nombre con dos partes, una para especificar la máquina y la otra para especificar el proceso. Sin embargo este tipo de direccionamiento no es bueno, ya que cada usuario debe conocer la dirección del servidor y esto ya no es transparente. Si el servidor falla y su dirección cambia, entonces se deben recompilar los programas que utilicen ese servidor. Una alternativa es que cada proceso elija su identificador de un gran espacio de direcciones dispersas, como el espacio de enteros de 64 bits. La posibilidad de que dos procesos elijan el mismo número es muy pequeña y el método puede utilizarse en sistemas extensos. ¿Cómo sabe el núcleo emisor a qué máquina enviar el mensaje? En una LAN que soporte transmisiones, el emisor puede transmitir un paquete especial de localización con la dirección del proceso destino. Todas las máquinas de la red lo recibiran y los núcleos verificarán si la dirección es la suya, en este caso, regresa un mensaje “aquí estoy” con su dirección en la red. El núcleo emisor utiliza entonces esa dirección y la captura, para evitar el envío de otra transmisión la próxima vez que necesite al servidor. Este último esquema tiene un problema: la carga adicional en el sistema. Esto se evita utilizando una máquina adicional para la asociación a alto nivel de los nombres de los servicios con las direcciones de las máquinas. Así se utilizan nombres de procesos y no números. Cada vez que se ejecute un cliente, primero va al servidor de nombres, y pide el número de la máquina donde se localiza algún servidor. Así las direcciones se ocultan. Este método tiene la desventaja de utilizar un componente centralizado. Primitivas con bloqueo vs. Sin bloqueo La forma de comunicación entre los procesos es el intercambio de mensajes, para lo cual son necesarias ciertas primitivas como send para enviar y receive para recibir. Existen dos tipos de primitivas: con bloqueo o sin bloqueo. Primitivas con bloqueo (síncronas). Al invocarse un send o un receive, el control del proceso no regresas hasta que se haya enviado el mensaje o hasta que se haya recibido un mensaje en el caso de receive, mientras tanto el proceso queda bloqueado. En este caso la desventaja esta en que el CPU esta inactivo durante la transmisión de los mensajes. Primitivas sin bloqueo (asíncronas). Tanto send como receive no tiene bloqueo. En el caso de send, esta primitiva coloca el mensaje en el buffer de mensaje y regresa el control inmediatamente sin que el mensaje haya sido enviado. El problema esta en saber cuando se puede volver a utilizar el buffer de mensajes. Existen dos soluciones a este problema. La primera es que el núcleo copie el mensaje a un buffer interno del núcleo y luego permita el proceso continuar. Así el proceso permanecerá bloqueado mientras se lleva a cabo la copia. La desventaja es que cada mensaje debe ser copiado del espacio del usuario al espacio del núcleo. Esto puede reducir el desempeño del sistema. 29 Sistemas Operativos Distribuidos MC Hilda Castillo Zacatelco BUAP La segunda solución es interrumpir al emisor cuando el mensaje ha sido enviado y hacerle saber que ya puede usar nuevamente el buffer de mensajes. Este método es eficiente, pero es muy difícil escribir los programas en forma correcta y es casi imposible depurarlos cuando están incorrectos. En el caso de un receive sin bloqueo, éste solo avisa al núcleo de la localización del buffer y regresa el control inmediatamente. Para hacer que éste espere se utilizaría un wait. En las primitivas síncronas puede suceder que un send o receive se queden esperando por siempre, así que para evitarlo se utilizan los llamados tiempos de espera, si en este tiempo nada llega, la llamada send termina con un estado de error. Primitivas almacenadas en buffer vs. No almacenadas Las primitivas anteriores son primitivas no almacenadas, esto es, los mensajes son enviados a una dirección específica. El proceso receptor se bloquea mientras copia el mensaje a un buffer. Esto funciona bien mientras el receptor este siempre listo para escuchar un mensaje. Pero cuando primero se ejecuta send y luego receive hay problemas, puesto que la llamada a receive es el mecanismo que indica al núcleo del servidor la dirección que utiliza el servidor y la posición donde colocar el mensaje que está por llegar; entonces si primero llega un mensaje, el servidor no sabrá de quién es y dónde ponerlo. Soluciones: 1. Confiar que se va a ejecutar siempre un receive antes de un send. Mala idea. 2. Hacer que el transmisor realice varios intentos para enviar su mensaje, pero si el servidor esta muy ocupado, otros esperarán un tiempo y luego se rendirán. 3. Que el núcleo receptor mantenga pendientes los mensajes. Si no ocurre un receive en un determinado tiempo, el mensaje es descartado. 4. Utilizar un buzón donde almacenar los mensajes. Un proceso que va a recibir mensajes pide al núcleo que le sea creado un buzón, en donde le depositarán los mensajes y él los irá leyendo. A esta técnica se le conoce como primitiva con almacenamiento en buffers. El problema con los buzones es que son finitos y se pueden llenar. Soluciones: 1. Mantener pendientes los mensajes 2. Descartarlos 3. El cliente debe verificar primero si hay espacio, si existe entonces enviar mensaje sino bloquearse. Primitivas confiables vs. No confiables Cuando el cliente envía un mensaje, a pesar de utilizar primitivas con bloqueo, no existe garantía de que el mensaje haya sido entregado. El mensaje pudo haberse perdido. Existen tres enfoques de este problema: 1. Volver a definir la semántica de send para hacerla no confiable, es decir, la primitiva no se encarga de verificar que su mensaje haya sido entregado y toda la responsabilidad de comunicación confiable se deja en manos del usuario. 2. El núcleo de la máquina receptora envía un reconocimiento al núcleo de la máquina emisora. El reconocimiento va de núcleo a núcleo, así ni el cliente ni el servidor se dan cuenta de esto. El núcleo entonces liberará al proceso cuando reciba el reconocimiento. 3. Aprovechar el hecho de que en la comunicación cliente-servidor se realiza de la siguiente manera: el cliente le envía un mensaje de solicitud al servidor y el servidor le da una respuesta al cliente. Entonces no hay mensaje de reconocimiento por parte del núcleo del servidor, sino que la respuesta del servidor funciona como reconocimiento. Así, el emisor (cliente) permanece bloqueado hasta que regresa la respuesta. Si se tarda demasiado, el núcleo emisor puede enviar la solicitud nuevamente. En este método no existe reconocimiento para la respuesta, esta omisión puede ocasionar problemas si el servicio solicitado por el cliente requiere cómputo extenso, porque el servidor no se enteraría si el cliente recibió o no la respuesta. 30 Sistemas Operativos Distribuidos MC Hilda Castillo Zacatelco BUAP Para solucionar esto se envía reconocimiento de la respuesta en base a un cronómetro, si la respuesta llegó rápido, no hay reconocimiento, si tardó demasiado si hay reconocimiento. Llamada a un procedimiento remoto (RPC- Remote Procedure Call) Birrel y Nelson abordaron este tema en 1984. En este esquema el programador no se preocupa por la transferencia de mensajes. Mediante RPC se puede invocar la ejecución de un procedimiento en la máquina A que no está en A, sino en B. Operación básica de RPC. De manera convencional, cuando un procedimiento es invocado, la dirección que tiene el registro apuntador a la próxima instrucción (IP) es almacenada en la pila, y el registro apuntador será cargado con la dirección del procedimiento invocado, cuando el procedimiento invocado termina, entonces el registro IP es cargado con la dirección que esta en el tope de la pila y sigue la ejecución del programa. En la mayoría de los casos es necesario enviar parámetros de entrada y obtener parámetro de salida. Los lenguajes de programación como C, utilizan dos tipos de paso de parámetros: por valor o por referencia. En un paso de parámetros por valor se pasa el valor de la variable y no hay problema, puesto que no se modifica la variable. En el caso del paso de parámetro por referencia, lo que se pasa es la dirección, y es posible realizar modificaciones sobre esta variable. Existe otra forma de pasar parámetros que no maneja el lenguaje C, este mecanismo se llama copia/restauración. Quien recibe la llamada copia la variable en la pila, como en la llamada por valor, y entonces copia de regreso la variable después de la llamada, escribiendo sobre el valor original. El objetivo de un RPC es que se parezca lo más posible a una llamada local (transparencia). Cuando un servidor se ejecuta por primera vez, lo primero que hace es exportar su interfaz, esto es, el nombre de los servicios y sus parámetros, especificando si son parámetros de entrada o de salida, su versión, su identificador único y su asa. Un proceso llamado conector es quien recibe la interfaz y realiza el registro. El conector además de realizar el registro de un servidor, puede darlo de baja y buscar algún servidor. La versión de un servicio es importante, pues indica si un servidor ha sido actualizado o no. Así el conector contendrá las últimas versiones de los servidores. Este método de exportación e importación es altamente flexible. Por ejemplo, puede manejar varios servidores que manejen la misma interfaz. Pero tiene sus desventajas. El conector se puede convertir en un cuello de botella, además un proceso puede tener un tiempo de vida corto y el tiempo entre importar y exportar interfaces puede ser significativo. Semántica de RPC en presencia de fallas El objetivo es ocultar la comunicación, al hacer que las llamadas a los procedimientos remotos se parezcan a los locales. Sin embargo, esto no es tan sencillo. Existen cinco clases distintas de fallas que pueden ocurrir en los RPC’s. 1. El cliente no puede localizar al servidor 2. Se pierde el mensaje de solicitud del cliente al servidor 3. Se pierde el mensaje de respuesta del servidor al cliente 4. El servidor falla antes de recibir una solicitud 5. El cliente falla después de enviar la solicitud El cliente no puede localizar al servidor Debido a que el servidor cambió de dirección y el cliente no se actualizó (tal vez preguntó antes de que se actualizara). En UNIX se retorna -1 y una variable global errno, pero si -1 es un valor válido, habrá confusión acerca de si fue error o el resultado de alguna operación. Otro mecanismo que no tiene la desventaja anterior es que el error provoque una excepción. Por ejemplo se podrían utilizar señales. Pero no todos los lenguajes tienen excepciones y/o señales. Además el uso de estos mecanismos, destruyen la transparencia. 31 Sistemas Operativos Distribuidos MC Hilda Castillo Zacatelco BUAP Pérdida de mensajes de respuesta Se puede utilizar un cronómetro, si no llega respuesta en un periodo razonable, se envía la solicitud nuevamente. Pero qué se perdió, la solicitud, la respuesta o el servidor es lento? Si es la respuesta la que se perdió, entonces esto es más difícitl de enfrentar. Algunas operaciones se pueden repetir muchas veces sin efectos colaterales y sin causar daños. A esta propiedad se le llama idempotencia. Pero existen operaciones que no son idempotentes, por ejemplo retirar dinero de un cajero automático. Una posible solución es asociar un número secuencial a cada solicitud. Entonces el núcleo del servidor debe mantener un registro del número secuencial más reciente, así podrá notar la diferencia entre una solicitud original y las retransmisiones. Como protección adicional se podría colocar un bit en el encabezado del mensaje para distinguir las solicitudes originales de las retransmisiones. Fallas del servidor Puede suceder que: -El servidor falla después de responder -El servidor falla antes de responder Existen tres escuelas en torno a lo que se debe hacer en este caso: 1. Semántica al menos una vez. Seguir intentando hasta conseguir una respuesta (el servidor puede volver a arrancar o se reconecta un nuevo servidor). Garantiza que la RPC se realiza al menos una vez o más veces. 2. Semántica a lo más una vez. Se da por vencido inmediatamente e informa de la falla. La RPC se realiza a lo más una vez o ni una sola vez. 3. No garantiza nada. Fallas del cliente Cuando un cliente falla después de enviar una solicitud sin que haya recibido respuesta, existirá una labor de cómputo de la cual nadie espera respuesta. A esta labor de cómputo no deseada se le llama huérfano. Problemas que puede provocar un huérfano. - desperdiciar ciclos de cpu - bloquear archivos o capturar recursos valiosos - crear confusión (si el cliente vuelve a arrancar y realiza de nuevo la RPC, la respuesta puede ser inmediata y entonces no sabrá lo que paso) ¿Qué hacer con los huérfanos? Nelson (1981) hizo un estudio acerca de este problema y propuso lo siguiente: 1. Exterminación. Antes de enviar la solicitud, el resguardo del cliente crea un registro de lo que se va a hacer y lo almacena en dusci. Al vo9lver a arrancar (el cliente) se verifica el contenido del registro y se elimina al huérfano. Desventaja. Gasto en la escritura y disco. Si hay más huérfanos es muy probable que no se puedan localizar No es un buen método. 2. Reencarnación. Se divide el tiempo en épocas. Cuando el cliente arranca de nuevo envía un mensaje a todas las máquinas que declaran el inicio de una época. Se eliminan los cómputos remotos que estén fuera de época. 3. Reencarnación sutil. Utiliza también épocas, pero el que está ejecutando el RPC verifica si existe el dueño de la RPC cuando le llega un mensaje de cierta época, si no existe elimina la operación. 4. Expiración. Se asigna a cada RPC una cantidad de tiempo, si no puede terminar en ese tiempo pide otro quantum, sino entonces se elimina el proceso. En la práctica ninguno es recomendable. La eliminación de un huérfano puede traer consecuencias imprescindibles. Protocolos RPC Orientado a la conexión Ventaja. Comunicación fácil Desventaja: Pérdida de desempeño 32 Sistemas Operativos Distribuidos MC Hilda Castillo Zacatelco BUAP Sin conexión En este caso se debe adaptar el protocolo para garantizar seguridad. Algunos sistemas utilizan UDP o UDP integrado a IP. Ventajas -El protocolo ya ha sido diseñado -Estos protocolos son utilizados en casi todos los sistemas UNIX. UDP e IP son soportados por muchas redes existentes. Desventajas -Cada protocolo forma un paquete con varios campos y además ambos realizan una suma de verificación. -Lo anterior hace que se pierda el desempeño. Alternativa -Utilizar un protocolo especializado para RPC, el cual debe ser diseñado e implantado por el programador. Con respecto a la longitud del paquete y el mensaje, sale más caro hacer 64 RPC de 1k que 1 RPC de 64k. Por lo tanto el protocolo debe permitir las transmisiones largas (Sun Microsystems 8k, el límite de Ethernet es de 1536 bytes) Reconocimientos 1) Protocolo detenerse y esperar. Envía un paquete y espera reconocimiento. Los paquetes son enviados uno a uno. 2) Protocolo de chorro. El cliente envía todos los paquetes tan pronto como pueda. Así el servidor reconoce todo el mensaje al recibir todo el paquete, y no uno por uno. Propiedades del protocolo detenerse y esperar Si se daña o pierde un paquete, el cliente no puede recibir a tiempo un reconocimiento, por lo que vuelve a transmitir el paquete defectuoso. En el protocolo de chorro, si se pierde el paquete 1, pero el llega de manera correcta, puede abandonar todo y esperar a que el cliente vuelva a transmitir todo el mensaje o esperar con la esperanza de que 3 llegue bien y luego pedirle al cliente que envíe el paquete 1. A esto se le llama repetición selectiva. Comunicación en grupo Para RPC la comunicación solo es entre dos partes, el cliente y el servidor. A veces existen casos donde es necesario que varios procesos se comuniquen (por ejemplo, enviar un mensaje a todos los usuarios avisando que el sistema será dado de baja temporalmente para darle mantenimiento). Un grupo es una colección de procesos que actúan juntos en cierto sistema o alguna forma determinada por el usuario. La propiedad fundamental de un grupo es que cuando se envía un mensaje al propio grupo, todos los miembros de este lo reciben. A este tipo de comunicación se le llama uno-muchos (la de cliente-servidor es una comunicación puntual). Los grupos son dinámicos, se pueden crear nuevos grupos y destruir grupos anteriores. Un proceso puede unirse a un grupo o dejarlo. Un proceso puede ser miembro de varios grupos a la vez. La implantación de comunicación en grupo depende del hardware en gran medida. - Multitrasmisión. Cuando se envía un mensaje a un grupo, éste se recibe automáticamente en todas las máquinas que escuchan esa dirección. Cada grupo escucha una dirección de multitransmisión. - Transmisión simple. Los procesos deben ser concientes acerca de a cuál grupo pertenecen, porque el mensaje lo verifican todos y solo los miembros del grupo al cual va dirigido el mensaje lo toman. La desventaja es que si un proceso no pertenece al grupo entonces descarta el mensaje, pero esto implica desperdicio de tiempo. - Unitransmisión. El mensaje es enviado a cada proceso uno a uno, es decir, si el grupo tiene n miembros, se envían n paquetes. Grupos cerrados vs. Grupos abiertos Los procesos pueden clasificarse en grupos cerrados y grupos abiertos. En un grupo cerrado, solo los miembros del grupo pueden enviar mensajes al grupo. En un grupo abierto, cualquiera puede enviar mensajes al grupo. Grupos de compañeros vs. Grupos jerárquicos Otra forma de clasificar a los grupos es en grupos de compañeros y grupos jerárquicos. En un grupo de compañeros todos los procesos son iguales, la ventaja es que si uno falla los demás pueden seguir trabajando. La desventaja es que al tomar una decisión se debe votar, esto implica mayor retraso y costo. 33 Sistemas Operativos Distribuidos MC Hilda Castillo Zacatelco BUAP En el caso de un grupo jerárquico existe un jefe o coordinador, la ventaja es que hay menos retraso y costo, la desventaja es que si falla el jefe, el grupo hace un alto. Membresía del grupo Para manejar la creación y eliminación de grupos, así como permitir a los procesos que se unan o dejen grupos se puede utilizar un servidor de grupos. Este servidor debe mantener una base de datos acerca de qué grupos existen y quiénes lo forman. La desventaja es que si el servidor falla, se pierde información acerca de grupos y tal vez deban ser reconstruidos los grupos totalmente. Otro método es manejar la membresía de grupo en forma distribuida. En un grupo abierto un extraño puede enviar un mensaje a todos los miembros del grupo para anunciar su presencia. En un grupo cerrado es necesario algo similar. Para salir del grupo se debe enviar mensaje de despedida a todos. Si un miembro falla, al no haber mensaje de despedida, los otros miembros se darán cuenta al tratar de comunicarse con él, entonces sino responde, lo eliminan de su grupo. 34