Tema 1. Introducción. Sistema Operativo : Es un "programa" cargado al encender el computador, que actúa como intermediario entre el usuario y el hardware de la máquina, cuyo objetivo es proporcionar unas utilidades que permitan ejecutar diversos procesos de manera cómoda y fácil. Evolución de los S.O. : 1. - Biblioteca de Operaciones. 2. - Monitor Sencillo (uso de tarjetas en bloques). 3. - Proceso fuera de linea (conversión tarjeta a cinta en terminales remotos). 4. - Buffering (uso de buffers). 5. - Spooling (uso de colas). 6. - Multiprogramación. 7. - Sistemas de tiempo compartido (multiusuarios). Tema 2. Estructura del Sistema Operativo. Funciones del Sistema Operativo: 1. - Administración de procesos. 2. - Administración de la memoria principal. 3. - Administración del almacenamiento secundario. 4. - Administración del sistema de E/S. 5. - Administración de archivos. 6. - Control de Redes. 7. - Sistema de Protección. 8. - Sistema interprete de mandatos (SHELL). Servicios del Sistema Operativo: - Al usuario ============> mediante programas del sistema (que a su vez utilizan llamadas al sistema) - Al programa o proceso ===> mediante llamadas al sistema Programas del Sistema (se agrupan en 7 categorías): 1. - programas de aplicación. 2. - comunicación 3. - carga y ejecución de programas. 4. - apoyo a lenguajes de programación. 5. - modificación de archivos. 6. - manipulación de archivos. 7. - información de estado. Llamadas al Sistema (se agrupan en 5 categorías): 1. - control de procesos. 2. - manipulación de archivos. 3. - manipulación de dispositivos. 4. - mantenimiento de la información. 5. - comunicaciones. Estructura del Sistema Operativo: - estructura sencilla (MS-Dos, Dr-Dos) - enfoque por capas (Venus, 370, OS/2) Maquina Virtual (pag. 77-81) Diseño e implantación de un Sistema Operativo (pag. 81-85) Tema 3. Procesos. Hay que tener muy claras las diferencias entre programa y proceso: Un programa es una entidad pasiva compuesta únicamente por un código y unos datos, es decir, tiene un listado fijo. Un proceso es una entidad activa, es el "programa" en ejecución Un proceso se compone de: - Código del programa que ejecuta. - Estado del proceso: - sección de datos. - pila - contador de programa - puntero de pila - palabra de estado - registros de uso general - información del S.O. Un proceso puede tener tres estados distintos: - preparado: el proceso está listo para pasar a ejecutarse. - en ejecución - en espera: por alguna razón (operación de E/S, interrupción, etc.) el proceso debe esperar a que se acabe una acción sin la cual no puede continuar su ejecución. Ejecución de procesos: El S.O. inicia la ejecución de un proceso nuevo que está preparado. Cuando este proceso no va a utilizar la CPU durante un tiempo (hay una llamada a E/S, etc.) el S.O. lo pone en espera hasta que acaba esa operación. Mientras tanto pasa a la CPU la ejecución de otro proceso que estuviera preparado y realiza los mismos pasos: ejecuta hasta que este deja de usar la CPU, lo pone en espera si es necesario y pasa a ejecutar otro. Cuando la acción del proceso que está en espera termina (acaba la E/S, etc.) el S.O. lo pone otra vez en estado de preparado, así hasta que termina con todo el proceso. En todos estos cambios de estado el S.O. debe guardar el "contexto" del proceso, en el cual está toda la información necesaria para volver a ejecutarlo donde se dejó. Esta información se guarda en el Bloque de Control de Procesos (PCB), que tiene una dirección de memoria protegida que solo puede modificar el S.O. El S.O. deberá decidir que proceso de los que están en espera pasará a ejecución cuando la CPU quede libre, esta decisión la hará a través de un Planificador de Procesos. Planificación de Procesos: Existen dos planificadores que se encargan respectivamente de pasar trabajos o procesos a la memoria principal y a la CPU. El más importante es el Planificador de la CPU que se encarga de decidir qué procesos de los que están preparados pasarán a ejecución cuando la CPU se libere de algún otro proceso (cuando este pase a estar en espera). Esta planificación puede ser apropiativa o no apropiativa, siendo la primera aquella en la que unos procesos tienen prioridad sobre otros y cuando acaban de estar en espera y pasan a preparado hacen que el S.O. les dé paso a la CPU que abandona el proceso que tenía en ejecución, lo pone en preparado y pasa a ejecutar el que tiene prioridad. Con el otro sistema la CPU ejecuta un proceso hasta que lo termina o por alguna razón éste pasa a estar en espera. Existen varios criterios por los cuales la CPU es capaz de cambiar de proceso en ejecución: - Utilización de la CPU: el S.O. pretende que la CPU este el menor tiempo posible inactiva. - Productividad. - Tiempo de retorno: el proceso en ejecución tarda mucho en acabar una acción, pudiendo encontrarse en un bucle muy largo. - Tiempo de espera: se pretende que los procesos no estén demasiado tiempo en espera. - Tiempo de respuesta. Algoritmos de planificación. - FCFS (first come, first served). - SJF (short job first). - Planificación por prioridades. - RR (round robin). - Planificación de colas de multiples niveles. - Planificación de colas de multiples niveles con realimentación. Planificación de procesadores multiples. Evaluación de algoritmos. - Modelado determinista. - Modelos de colas. - Simulaciones. Tema 4. Sicronización de Procesos. Sección Crítica Segmento de código en el cual el proceso puede estar modificando variables comunes. Una solución para el problema de la sección crítica debe cumplir los tre requisitos siguientes: - Exclusión mútua: Solo un proceso puede estar ejecutando su sección crítica. - Progreso. - Espera limitada. Semáforos Herramienta de sincronización de procesos. Permiten ejecutar un proceso que se detiene en espera de que otro (ejecutado concurrentemente) le pase un dato o le de permiso. Ejemplo: P2 necesita que la cola C esté libre para poder entrar. La CPU ejecuta C2 hasta llegar al punto en que debe entrar, un semáforo detiene su ejecución, y la pasa a otros procesos hasta que uno de ellos (P1) hace que la cola se vacíe. Cuando P1 acabe su uso de la CPU y lo recupere P2 el semáforo estará abierto y P2 podrá hacer su faena en la cola. Al tratarse de una espera activa la CPU consume tiempo cada vez que libera un proceso para comprobar el estado de todos los semáforos que tiene. Implementación sin espera activa (pag. 155/56) : Se realiza un bloqueo de P2 y se pone en estado de espera, saliendo de la CPU. P2 seguirá en espera hasta que llegue una señal de Despertar generada por otro proceso que tenga la CPU en uso. Si Semáforo.nombre >0 ----------> Semáforo Abierto Si Semáforo.nombre <=0 --------> Semáforo Cerrado Si llega señal(Semáforo.nombre) ---> Saca proceso de la espera Si llega espera(Semáforo.nombre)--> Añade proceso a la cola y lo bloquea. En general | Semáforo.nombre | = nº de procesos en la cola del semáforo. - Bloqueo mutuo - Problemas de sincronización: + Problema del Productor-Consumidor. + Problema de los Lectores-Escritores. + Problema de los filósofos comensales. Regiónes Críticas Esta construcción lingüistica asegura que dentro de una región solo un proceso puede acceder a una variable compartida. Mientras se ejecuta el enunciado S ningún otro proceso puede tener acceso a la variable v. var v: shared T; region v do S; Para cada variable v el compilador genera un semáforo v-mutex con valor inicial 1, cuyas operaciones quedan ocultas al programador. Existe tambien la región crítica condicional que presenta la forma: region v when B do S; donde B es una expresión booleana. Cada vez que se entra en la región de la sección crítica, se evalua la expresión booleana B. Si es cierta, se ejecuta el enunciado S, y si es falsa, el proceso libera la exclusión mutua y se bloquea hasta que B sea verdadera y ningun otro proceso se encuentre en la región asociada con v. Monitores Otra construcción de alto nivel para la sincronización. La sintaxis de un monitor es: type nombre-monitor = monitor (* Declaración de variables * ) ... (* Declaración de Operaciones *) procedure entry P1 (...); begin ... end; procedure entry P2 (...); begin ... end; ... procedure entry Pn (...); begin ... end; begin (* Asignación de variables iniciales *) end. (* Variables de sincronización *) var x,y: condición; fvar Un procedimiento declarado dentro de un monitor solo puede tener acceso a las variables declaradas localmente y a los pará,etrosformales. La construcción monitor asegura que sólo un proceso a la vez puede estar activo en el monitor. Las únicas operaciones que pueden invocarse para una variable condición son espera y señal. La operación x.espera; significa que se suspende el proceso que invoca la operación hasta que otro invoque x.señal; La operación x.señal reanuda exactamente un proceso suspendido; si no hay ninguno, entonces la operación no tiene efecto, es decir, el estado de x es el mismo que tendría si la operación nunca se hubiera ejecutado. [ Leer pag. 173 ]