Introducción Sistemas Operativos Avanzados Utilizar una máquina al desnudo (sólo interactuando con el hardware) resulta engorroso e ineficiente debido a la gran cantidad de tareas que deben ser realizadas de manera manual, tales como: cargar programas y datos en memoria de manera apropiada; direccionar y activar de manera correcta los dispositivos de entrada salida, etc. Cuando una máquina es usada por muchos usuarios de forma simultanea, existen numerosas consideraciones que deben tomarse en cuenta como: la protección de los datos de usuario, la manera de compartir el tiempo y uso de los recursos compartidos, etc. Un sistema operativo libera al usuario de las tareas tediosas e incrementa la eficiencia encargándose del manejo de los recursos del sistema. Funciones de un Sistema Operativo Un sistema operativo es una capa de software sobre el hardware de la máquina que permite realizar dos funciones básicas: • Administración de Recursos. Un programa de usuario accede en numerosas ocasiones a recursos de hardware y software durante su ejecución. Ejemplos de dichos recursos son: CPU, memoria principal, dispositivos de entrada/salida, y diferentes tipos de software (compiladores, enlazador/cargador, archivos, etc.). Es el sistema operativo el encargado de manejar los recursos y asignarlos a los programas de usuario de forma eficiente y justa. Las labores de administración abarcan lo siguiente: ◦ Administración del tiempo (Planificación de CPU y Disco). ◦ Administración del espacio (Almacenamiento Principal y Secundario). ◦ Manejo de sincronización de procesos y abrazo mortal (Deadlock). ◦ Manejo de estadísticas y estado del sistema. • Interfaz amigable. Un sistema operativo esconde los detalles no placenteros de bajo nivel y la idiosincrasia de los componentes de hardware de la máquina con la finalidad de proveer una interfaz amigable hacia la máquina. Con dicha interfaz la carga, manipulación, impresión, y ejecución de programas se realiza mediante comandos de alto nivel sin la necesidad de preocuparse por los detalles de bajo nivel. La capa provista por el sistema operativo transforma el hardware crudo de la máquina, en una máquina virtual o abstracta con funcionalidades agregadas (como la administración de recursos de forma automática). Además, los usuarios de la máquina tienen la ilusión de que son los únicos usuarios en el sistema, aun cuando la máquina podría operar en un ambiente multiusuarios. La interfaz amigable toma en consideración los siguientes tareas: ◦ Ambiente de ejecución (Administración de procesos – creación, control y finalización, manipulación de archivos, manejo de interrupciones, soporte de entrada/salida, etc.) ◦ Detección y manejo de errores. ◦ Protección y seguridad. ◦ Tolerancia a fallas y recuperación de las mismas. Acercamiento al diseño de sistemas operativos Un sistema operativo puede ser diseñado de forma macro, como una gran colección de procesos sin ningún tipo de estructura. Cualquier proceso puede invocar a otro para solicitar un servicio de este; bajo este esquema la ejecución de una instrucción de usuario suele involucrar la activación de una serie de procesos y la comunicación entre ellos. Un enfoque macro y centralizado como el anterior puede considerarse aceptable para un sistema operativo pequeño, pero no para un sistema operativo relativamente grande y complejo. Esto se debe a que la falta de estructura complica fuertemente el código, las pruebas y la depuración de un sistema operativo enorme o de propósito general. El diseño de sistemas operativos de propósito general ha madurado durante las últimas dos décadas y media, dando como resultado sistemas operativos enormes y complejos. Generalmente los sistemas operativos que poseen soporte de una ambiente multiprogramado poseen decenas de megabytes de longitud; además de un diseño, implementación y etapa de prueba a cargo de un gran equipo de desarrollo de software. A continuación se discutirán algunas de las consideraciones que deben tomarse en cuenta para manejar la complejidad y tamaño de los sistemas operativos actuales, realizando especial énfasis en entender la diferencia entre que cosas debo hacer y como debo hacerlas, dentro del contexto de diseño de un sistema operativo. Separación de Políticas y Mecanismos La política se refiere a que debo hacer, mientras que el mecanismo se refiere a como lo voy a hacer. Por ejemplo, en planificación de CPU, el mecanismo provee los medios (maneras) de implementar varias disciplinas de planificación, mientras la política decide la política de planificación del CPU (FCFS, prioridad, etc.) a ser usada. Un sistema operativo bien diseñado debe separar las políticas de los mecanismos. El hecho de que las políticas utilice los mecanismos y la separación entre ellos contribuye a brindar flexibilidad, así las decisiones de que política aplicar pueden ser tomadas a alto nivel. Es evidente pensar que las políticas pueden cambiar con el tiempo, con las aplicaciones, o con los usuarios. Si los mecanismos son separados de las políticas, entonces un cambio en las políticas no requeriría cambios en los mecanismos y viceversa. De otra manera, un cambio en las políticas podría requerir un rediseño completo. Consideraciones de modelos basados en capas Dijkstra propuso un enfoque de diseño basado en capas con la finalidad de reducir la complejidad de diseño e implementación de un sistema operativo. El enfoque basado en capa consiste en dividir las funcionalidades del sistema operativo por capas. Las funciones del sistema operativo se dividen de forma equitativa en dichas capas, dando como resultado un sistema balanceado. Cada una de estas capas se encargara de definir funcionalidades específicas, así como también una interfaz de entrada/salida con las capas adyacentes. El diseño normal de una arquitectura en capa otorga a las capas inferiores la función de interactuar con el hardware de la máquina y servir de interfaz a las capas superiores, mientras que las capas superiores se encargan de la interfaz de usuario o interactúan con los mismos. La idea detrás de este enfoque es similar a la utilizada en el modelo de interconexión de sistemas abiertos (OSI – Open System Interconnection). Diseñar un sistema operativo basado en capas hace que el mismo sea modular (en un diseño modular, el sistema es dividido en varios módulos y dichos módulos se diseñan de manera independiente). Así, cada capa puede ser diseñada, codificada y probada de manera independiente. Como consecuencia de esto, un diseño orientado a capas ofrece simplicidad en su diseño, especificaciones e implementación. Sin embargo, existen inconvenientes en cuanto a un enfoque orientado a capas, uno de ellos es la ubicación de las funcionalidades por capa y la cantidad de funcionalidades en ellas. Si una capa posee muchas funcionalidades lo más probable es que su desempeño sea lento y costoso; por otro lado se debe considerar que en el modelo en capas, una capa sólo puede acceder a las funcionalidades de la capa superior por lo tanto la ubicación de estas es de suma importancia. Un ejemplo clásico de un sistema operativo diseñado por capas es THE el cual consiste en seis capas. La Figura 1 muestra las capas del sistema operativo y las funcionalidades asociadas. Figura 1. Estructura del Sistema Operativo THE. Otro ejemplo clásico de un enfoque en capas son los sistemas MULTICS, cuya arquitectura de diseño se basa en capas concéntricas (anillos). Esta estructura en anillos no sólo simplifica el diseño y verificación del sistema, sino que también sirve de ayuda en el diseño e implementación de protección. En MULTICS, los privilegiosdisminuyen de un anillo interno a uno externo, de esta manera la estructura en anillos define e implementa de forma sencilla la protección en el sistema. La Figura 2 muestra un sistema en anillos similar a MULTICS. Figura 2. Sistema en anillos similar a MULTICS. Un enfoque basándose en el núcleo (kernel) Otros enfoques de diseño han sido planteados como el basado en el núcleo, el cual propuso Brinch Hansen. El núcleo es una colección de primitivas que se utilizan para construir y ejecutar el sistema operativo. Así, el núcleo provee un ambiente para construir sistemas operativos donde el diseñador posee una gran flexibilidad ya que las políticas y consideraciones de optimización no se establecen a nivel del núcleo. Esto conlleva a establecer que el núcleo sólo soporta los mecanismos, y las decisiones de que políticas implementar deben ser llevadas a cabo en las capas exteriores. Un enfoque como el anterior produce un sistema creciente de software el cual crece sobre el núcleo, donde en cada nivel se toman decisiones con respecto a planificación de procesos, asignación de recursos, ambientes de ejecución, sistemas de archivos, protección de recursos, etc. De acuerdo con Brinch Hansen, el núcleo fundamentalmente establece las primitivas que permiten la creación y control de procesos, así como la comunicación entre ellos. Así, el núcleo sugerido por Hansen sólo posee la visión de procesos y no incluye el concepto de recursos. Sin embargo, para que un sistema operativo pueda madurar en funcionalidad y complejidad, se ha optado por incluir más funcionalidad al núcleo. Un núcleo sólo debe contener un conjunto de funcionalidades mínimo, con las cuales se pueda construir y ejecutar un sistema operativo con un grupo de objetivos específicos. Incluir muchas funcionalidades dentro del núcleo conlleva a poca flexibilidad a alto nivel, mientras que incluir pocas resulta en un bajo soporte para los niveles superiores. Un ejemplo de un sistema operativo diseño bajo este enfoque es HYDRA, es cual es un núcleo para C.mmp (sistema multiprocesador desarrollado en Carnegie- Mellon); este núcleo soporta noción de recursos y procesos, y provee mecanismos para la creación y representación de nuevos tipos de recursos y acceso protegido a los mismos. Acercamiento a las Máquinas Virtuales Una máquina virtual es una capa de software sobre el hardware crudo que provee la ilusión de que todos los dispositivos de la máquina (procesador, memoria principal, almacenamiento secundario, etc.) se encuentran disponibles en su totalidad para cada usuario. Un usuario puede ejecutar en conjunto completo de instrucciones, incluyendo las instrucciones privilegiadas. El software de la maquina virtual crea dicha ilusión multiplexando de forma adecuada los recursos del sistema entre todos los usuarios presentes en la máquina. Un usuario puede correr un sistema operativo mono-usuario sobre un sistema operativo basado en maquina virtual. El soporte para un sistema mono-usuario es muy sencillo y eficiente, ya que las consideraciones de multiprogramación y protección no se encuentran presentes. El concepto de máquinas virtuales ofrece alta flexibilidad, permitiendo que diferentes sistemas operativos puedan ejecutarse en diferentes máquinas virtuales. Además el concepto de máquina virtual provee una poderosa herramienta de prueba para nuevos sistemas operativos, sin interferir con el resto de los usuarios de la máquina. Una implementación eficiente de este enfoque es VM/370 de IBM, sin embargo, numerosos problemas en cuanto a dificultad y complejidad envuelven este sistema por su gran extensión. VM/370 provee una máquina virtual para cada usuario; cuando un usuario inicia en el sistema, se crea una copia exacta del hardware crudo (IBM 370), en donde se ejecuta por lo general un sistema operativo mono- usuario interactivo. ¿Por qué avanzan los Sistemas Operativos? En los años de 1960 y 1970, los esfuerzos en cuanto al diseño de los sistemas operativos se encontraban centralizados en los llamados sistemas operativos tradicionales, esto es un computador standalone con un solo procesador. Los numerosos avances en los circuitos integrados y en las tecnologías de comunicación entre computadores desde 1980 hasta la actualidad, ha permitido la proliferación de diversas arquitecturas, sistemas de memoria compartida, sistemas de memoria distribuida, etc. Estas arquitecturas y sistemas requieren un conjunto de características que los sistemas operativos convencionales no pueden proveer, por ello los sistemas operativos han evolucionado para poder satisfacer los nuevos requerimientos de las arquitecturas emergentes. Los sistemas multi-procesador y sistemas distribuidos tienen muchas características que no se encuentran presentes en los sistemas mono-procesador tradicionales. Estas características hacen que el diseño de los sistemas operativos emergentes sea extremadamente complicado, y requieren que asuntos no triviales de diseño sean tratados. Debido a su novedad relativa y enorme complejidad de diseño, los sistemas operativos para arquitecturas de cómputo múltiples son llamados sistemas operativos avanzados o modernos. Un sistema operativo avanzado no sólo aprovecha la potencia de una arquitectura múltiple cómputo, sino que también provee una vista coherente de alto nivel del sistema; un usuario ve a un sistema de las características mencionadas como una máquina monolítica muy poderosa. Tipos de Sistemas Operativos Avanzados La Figura 3 muestra una clasificación de los sistemas operativos avanzados. El ímpetu de los sistemas operativos avanzados ha tomado dos direcciones. La primera surge de los avances de la arquitectura. El diseño de hardware de estas arquitecturas ofrece un paralelismo de alta disponibilidad y sistemas distribuidos de alto cómputo; estas características introducen grandes cambios en las consideraciones de diseño de sistemas operativos. Básicamente los sistemas operativos diseñados para estas arquitecturas se conocen como sistemas operativos para multiprocesadores y sistemas operativos distribuidos. La segunda clase de sistemas operativos avanzados se orienta al manejo de aplicaciones. Algunas aplicaciones (Ejem: Base de Datos) requieren soporte especial del sistema operativo, como manejo intervalos de tiempo o manejo directo de estructuras de datos temporales. Los sistemas operativos convencionales o de propósito general ofrecen un desempeño pobre para los requerimientos ciertas aplicaciones, sobre todo se han centrado los estudios en los requerimientos de Base de Datos y Tiempo Real. Figura 3. Clasificación de los Sistemas Operativos Avanzados. Sistemas Operativos Distribuidos Un sistema operativo distribuido es un sistema operativo que controla un conjunto de máquina autónomas, conectadas entre si mediante una red de comunicaciones. Un sistema operativo distribuido controla la forma de manejar los recursos de hardware y software distribuidos en todo el sistema, de manera tal que el usuario final se sienta en un sistema centralizado, es decir, el usuario ve al sistema como un poderoso computador monolítico. Los asuntos básicos en el diseño de sistemas operativos distribuidos son esencialmente los mismos que en los sistemas operativos convencionales (sincronización de procesos, abrazo mortal, planificación, sistema de archivo, comunicación entre procesos, manejo de memoria y buffer, recuperación de fallas, etc.). Sin embargo, otras consideraciones deben considerarse: nombramiento, memoria compartida, manejo de reloj, retardo en las comunicaciones, etc. Sistemas Operativos Multiprocesador Un sistema multiprocesador típico consiste en un conjunto de procesadores los cuales comparten un bloque de memoria física y generalmente se encuentran comunicados con otros sistema vía red. La tarea del sistema operativo es hacer ver a todo el sistema como un sistema poderoso de un único procesador. Las consideraciones básicas de diseño son las mismas de los sistemas operativos tradicionales, teniendo especial énfasis en la sincronización de procesos, planificación de tareas, manejo de memoria, protección y seguridad. Sistemas Operativos de Base de Datos Los sistemas operativos de base de datos requieren manejar el concepto de transacciones, operaciones de almacenamiento, recuperación y manipulación de grandes volúmenes de datos de forma eficiente. Para el manejo temporal de datos es necesario el manejo de buffer, así como un esquema de acceso a estos. Sistemas Operativos de Tiempo Real Un sistema de tiempo real se caracteriza por poseer tiempo límites para las tareas que se deben ejecutar, en base a esto generalmente estos se clasifican en sistemas operativos de tiempo real suave y tiempo real duro. La consecuencia directa de estas características es realizar un diseño que permita cumplir con los tiempos de respuestas necesarios para las aplicaciones que se ejecutan sobre el sistema operativo de tiempo real. Universidad Central de Venezuela Facultad de Ciencias – Esc. Computación Prof. David A. Pérez A. [email protected]