Resumen Sistemas Operativos Silberchatz Capítulo 1: Un sistema operativo es un programa que administra, controla y coordina el uso del hardware (recursos) entre los diversos programas de aplicación (ej: editor de texto, navegador web), también actúa como intermediario entre el hardware y el usuario. Desde el punto de vista de un usuario, un sistema operativo puede enfocarse en: Dejar que el usuario monopolice los recursos (sistema monousuario), para maximizar el trabajo, prestando poca atención al rendimiento y ninguna a la utilización de recursos compartidos entre software y hardware. Para sistemas multiusuario, el sistema operativo se enfoca en la utilización compartida de recursos entre las distintas terminales. Para sistemas del tipo cliente-servidor, el SO se enfoca en optimizar tanto la usabilidad individual (para el cliente), como la asignación de recursos para cada uno. Desde el punto de vista del sistema: Se lo puede relacionar íntimamente como un asignador y controlador de recursos. También gestiona el orden de ejecución de los programas de usuario para un correcto funcionamiento. Funcionamiento de un sistema: Una computadora consta de una o más CPU y una serie de controladores de dispositivo. La CPU y los distintos controladores se conectan en un bus común en donde tienen acceso a la memoria compartida. Ambos pueden ejecutarse concurrentemente, por lo que para asegurar el uso eficiente de memoria, se asigna un controlador de memoria para sincronizar el acceso a esta. Interrupción: Señal que avisa la ocurrencia de un suceso, estos puede ser mediante: Hardware: puede activarse en cualquier momento mediante una señal a la CPU, a través del bus del sistema(teclado,reloj,dma,...). Software: puede activarse ejecutando una operación especial denominada llamada al sistema. Una interrupción generada por software por un error (div x 0 o acceso a memoria no valido) se llama excepción. Una interrupción por software, es un mecanismo de comunicación entre un proceso (que se ejecuta en modo usuario) y el sistema operativo (que se ejecuta en modo supervisor). El proceso emplea las interrupciones por software para notificar al sistema operativo que requiere de su intervención. Primero, consideremos las interrupciones del sistema. Realmente, podemos distinguir, como hacen muchos sistemas, dos tipos diferentes de interrupciones de sistema, unas simplemente denominadas interrupciones, y las otras denominadas traps. Las primeras se producen por causa de algún tipo de evento que es externo e independiente al proceso actualmente en ejecución, por ejemplo la finalización de la operación de E/S. Las otras están asociadas a una condición de error o excepción generada dentro del proceso que está ejecutando, como un intento de acceso no permitido a un fichero. Cuando la CPU recibe la interrupción, deja lo que está haciendo e inmediatamente transfiere la ejecución a una posición fijada en donde se contiene la dirección de inicio a la rutina de servicio de la interrupción correspondiente. Una vez que termina con la rutina de servicio, vuelve a ejecutar lo que estaba haciendo antes. Hay dos formas para encontrar la rutina de servicio indicada: Se utiliza una rutina genérica para que examine la información de la interrupción y así, poder llamar a la rutina correspondiente. Este método es algo lento porque se tiene que “ejecutar” dos rutinas. Se dispone de una tabla de punteros a las rutinas de interrupción, en donde cada lugar le corresponde un número unívoco para cada dispositivo y de esta manera se puede ejecutar la rutina correspondiente. Por ejemplo: para el lugar i= 1, se encontrarán la rutina para el tratamiento del teclado. El código de kernel (solo en modo privilegiado,bit de modo en 0, se ejecutan instrucciones privilegiadas)se ejecuta: Cuando una aplicación ejecuta una llamada al sistema, solicitar un servicio del SO(interrupción sw, sincrona). Cuando una aplicación provoca una excepción(div x 0, fallo de pagina,..) Cuando un dispositivo provoca una interrupción de hw(es asincrona) El hw garantiza que las instrucciones privilegiadas solo se ejecuten en modo kernel. En caso de intentar realizarlo estando en modo usuario, el hw manda una excepción al SO. Estructuras de almacenamiento: Los programas para que sean ejecutados, deben estar en la memoria principal (RAM), en donde el CPU tiene conexión directa con ella. La interacción se consigue a través de una secuencia de carga (load) o almacenamiento (store) de instrucciones en direcciones específicas de memoria. Es decir, mediante load se carga una instrucción a un registro interno de la CPU para que pueda ser decodificado y ejecutado. Y con store, se mueve el contenido de un registro a la memoria principal. Según la arquitectura von Neumann: 1. Se extrae una instrucción de memoria y se almacena dicha instrucción en el registro de instrucciones. 2. La instrucción se decodifica y se guardan los operandos en un registro interno del CPU. 3. Una vez ejecutada la instrucción con los operandos correspondientes, se guarda el resultado en memoria. Debido a que: La memoria principal es muy pequeña como para almacenar todos los programas y datos. Es de tipo volátil (pierde su contenido cuando se le quita la alimentación). Se utilizan estructuras de memoria secundarias, como por ejemplo, discos magnéticos, CD-ROMs, memorias flash, etc. Estructuras de E/S: Dicho anteriormente, cada dispositivo tiene un controlador asociado, en la cual se compone de búferes locales y registros de propósitos especiales. Con esto, el controlador es responsable de la transferencia de datos entre los dispositivos que controla y su búfer local, para de esta manera, poder realizar las operaciones correspondientes. Arquitectura de un sistema informático: De un solo procesador: hay una CPU principal que se encarga de ejecutar un conjunto de instrucciones. Pero además, también existen pequeños microprocesadores de propósito especial en el cual sólo se encargan de ejecutar instrucciones específicas, por ejemplo: el teclado tiene un microprocesador en el que traduce la pulsaciones de teclas en código para la CPU. Multiprocesador: se disponen de dos o más CPU que se comunican entre sí, compartiendo el bus de la computadora, memoria y dispositivos periféricos. Poseen tres grandes ventajas: Mayor rendimiento: gracias al mayor trabajo de los N procesadores. Economía escalada: resulta más barato tener múltiples procesadores en un sistema, que múltiples sistemas de un solo procesador. Mayor fiabilidad: si las funciones están bien distribuidas, el fallo de un procesador no hará que el sistema deje de funcionar, sino que sólo lo ralentizará. Hay dos tipos de sistemas multiprocesador: Asimétricos: cada procesador tiene una tarea específica. Hay un procesador maestro que se encarga de controlar y asignar tareas a los demás procesadores. Simétrico: todos los procesadores son iguales, es decir, no existe una relación maestro-esclavo, en la que todos ejecutan instrucciones del sistema operativo. En cluster: también utilizan múltiples procesadores, pero a diferencia de los sistemas multiprocesador, están formados por dos o más máquinas individuales acopladas. Asimétrico: una máquina espera en caliente, controlando a la otra, mientras ejecuta las aplicaciones. Si dicho servidor falla, la máquina que estaba esperando se convierte en la activa. Simétrico: ambas máquinas ejecutan aplicaciones y se controlan entre sí, de esta manera se aprovecha todo el hardware. Operaciones del sistema operativo: Para prevenir que, en caso de error en algún proceso, no haya problemas con las demás aplicaciones que se están ejecutando, existen dos formas: Modo dual: usuario y el kernel. El primero se utiliza para aplicaciones de usuario; el segundo contiene las instrucciones privilegiadas de máquina. En el caso de que el proceso requiera hacer una instrucción privilegiada, hace una llamada al sistema y de esta manera se accede al modo kernel. Temporizador: se establece un contador que se encarga de interrumpir una ejecución en un determinado tiempo. Gestiones del sistema operativo: Gestión de procesos: Crear y borrar procesos de usuario y del sistema. Suspender y reanudar procesos Proporcionar mecanismos para la sincronización, comunicación y tratamientos de interbloqueos de los mismos. Gestión de memoria: Decidir qué datos y procesos se añadirán o extraerán de la memoria. Asignar y liberar la asignación de espacio de memoria según sea lo necesario. Controlar qué partes de la memoria están en uso y por parte de quién. Gestión de almacenamiento: Archivos: Creacion y borrado de archivos Creacion y borrado de directorios para organizar archivos Soporte de primitivas para manipular archivos y directorios Asignacion de archivos a los dispositivos de almacenamiento secundario Copia de seguridad de los archivos en medios de almacenamientos no volátiles Masivo: Gestión del espacio libre Asignación del espacio de almacenamiento Planificación del disco Caché: Es un sistema de almacenamiento con capacidad limitada, pero más rápido que la memoria principal, en donde se recibe de esta última la información que necesita la CPU, de forma temporal. Por eso, cuando se quiere buscar una información específica, el sistema primero la busca en la caché, de no encontrarla, la busca en la información original (ya sea RAM, disco rígido, etc) y hace de esta una copia para guardarla en la caché nuevamente. Comúnmente, los sistemas disponen de una o más cachés de instrucciones en donde almacena las siguientes instrucciones que esperan ser ejecutadas, esto permite que el CPU no pierda el tiempo buscando su siguiente instrucción en la RAM. En una estructura de almacenamiento jerárquica, los mismos datos pueden aparecer en diferentes niveles del sistema de almacenamiento. Por lo que es esencial una buena planificación y gestión de la caché para que garantice la coherencia entre los datos que utiliza el sistema. Seguridad y Protección: En los sistemas que admiten múltiples usuarios y permiten la ejecución concurrente de múltiples procesos, se emplean mecanismos que controlen el acceso de las aplicaciones y a los recursos del sistema. Una de las técnicas más usadas es la de asignar a uno o varios usuarios un ID de seguridad unívoco en la que el sistema podrá saber el nivel de prioridad.