Resumen de sistemas operativos. Segundo Corte. Secciones 703M- 704M y 705M Msc Hungria Berbesi Concurrencia, exclusión mutua y sincronización. Multiporgramación: consiste en la gestión de varios procesos dentro de un sistema monoprocesador. Multiprocesamiento: consiste en la gestión de varios procesos, dentro de un sistema multiprocesador. Procesamiento distribuido, consiste en la gestión de varios procesos, ejecutándose en sistemas de computadores múltiples distribuidas. La concurrencia puede presentarse en tres contextos diferentes: Múltiples aplicaciones: La multiprogramación se creó para permitir que el tiempo de procesador de la máquina fuese compartido dinámicamente entre varias aplicaciones activas. Aplicaciones estructuradas: como ampliación de los principios de del diseño modular y la programación estructurada, algunas aplicaciones pueden implementarse eficazmente como un conjunto de procesos concurrentes. Estructura del sistema operativo: las mismas ventajas de estructuración son aplicables a los programadores de sistema y se ha comprobado que algunos S.O. están implementados como un conjunto de procesos o hilos. En un sistema multiprogramado con un único procesador, los procesos se intercalan en el tiempo para dar la apariencia de ejecución simultánea. La multiprogramación tiene ventajas ciertas, pero a su vez crea ciertos problemas: 1. Compartir recursos globales estállenlo de riesgos. Por ejemplo, si dos procesos hacen uso al mismo tiempo de la misma variable global y ambos llevan a cabo tanto lecturas como escrituras de la variable, el orden en que se ejecuten las lecturas y escrituras es crítico. 2. Para el sistema operativo resulta difícil gestionar la asignación óptima de recursos. Por ejemplo, el proceso A puede solicitar el uso y obtener el control, de un canal de entrada.- salida particular y suspenderse antes de hacer uso del mismo. No es conveniente que el sistema operativo simplemente bloqueara el canal e impidiera su uso por parte de otros procesos. 3. Resulta difícil localizar un error de programación porque los resultados no son, normalmente ni deterministas reproducibles. La lección que hay que aprender es que es necesario protegeré las variables globales compartidas y otros recursos globales compartidos y que la única forma de hacerlo es controlar el código que accede la variable. Si se impone a norma de que solo un proceso puede acceder a la variable en cada instante y que una vez que la variable el procedimiento debe ejecutarse hasta el final antes de estar disponible para otro proceso, no se producirá el tipo de error expuesto antes. Labores del sistema operativo: Se pueden enumerar los siguientes elementos de gestión y diseño del S.O. 1. El sistema operativo debe ser capaz de seguir la pista de los distintos procesos activos. 2. EL sistema operativo debe asignar y retirar los distintos recursos a cada proceso activo. Los recursos considerados son: Tiempo de procesador, Memoria, Archivos y dispositivos de entrada-salida. 3. El sistema operativo debe proteger los datos y los recursos físicos de cada proceso contra las injerencias no intencionadas de otros procesos. 4. Los resultados de un proceso deben ser independientes de la velocidad relativa a la que se realiza la ejecución de otros procesos concurrentes. Interacción entre procesos: Dependiendo del nivel de conocimiento que cada proceso tiene de la existencia de los demás los procesos se pueden clasificar así: 1. Los procesos no tienen conocimiento de los demás: estos son procesos independientes que no están pensados para operar juntos. Estos pueden ser tanto trabajos por lotes como sesiones interactivas o una combinación de ambos. El S.O. tiene que encargarse de a competencia entre recursos. 2. Los procesos tienen un conocimiento indirecto delos otros: los procesos no conocen necesariamente a los otros por sus identificadores de proceso, pero comparten el acceso a algunos objetos, como un buffer por ejemplo. Estos procesos muestran cooperación. 3. Los procesos tienen un conocimiento directo de los otros: los procesos son capaces de comunicarse con los demás por el identificador de proceso y están diseñados para trabajar en alguna actividad. Muestran cooperación. Los procesos concurrentes entran en conflicto cuando compiten por el uso del mismo recurso. Básicamente, es posible describir esta situación como sigue: dos o más procesos necesitan acceder a un recurso durante el curso de su ejecución; ningún recurso es consciente de la existencia de otros y no se ve afectado en su ejecución. De ahí que cada proceso debe dejar tal y como esté el estado de cualquier recurso que utilice. En el caso que haya procesos en competencia, se deben solucionar tres problemas de control. EL primero es el NECESIDAD DE EXCLUSION MUTUA. Los recursos que son no compartibles y son necesitados simultáneamente por un proceso se llaman recursos críticos y la parte del programa que los utiliza se llama sección crítica del programa. Es importante que SOLO UN PROGRMAMA pueda acceder a su sección crítica en un momento dado. Hacer que se cúmplala exclusión mutua crea dos problemas de control adicionales: Uno es el interbloqueo, ) deadlock. Considérese dos procesos, P1 y P2 y dos recursos R1 y R2. Supóngase que cada proceso necesita acceder ambos recursos para llevar a cabo parte de su función. EN tal caso, es posible que se preséntela siguiente situación: el sistema asigna R1 a P2 y R2 a P1. Cada proceso está esperando a uno de los dos recursos, ninguno liberará el recurso que ya tiene hasta que adquiera el otro y realice la función para la que necesita ambos. Se produce interbloqueo. Un último problema de control es la inanición. Supóngase que tres procesos, P1, P2, y P3 necesitan acceder periódicamente al recurso R. Considérese la situación en la que P1 está en posesión del recurso y tanto P2 como P3 están parados, esperando al recurso. Puede suceder que siempre que P1 libere al recurso, P2 siempre lo tome y P3 se quede sin acceder al recuso. Se produce inanición o starvation. EL control de la competencia involucra al sistema operativo, porque es el sistema operativo el que asigna los recursos. Además, los procesos deben ser capaces por sí mismos de expresar de algún modo los requisitos de exclusión mutua, como puede ser bloqueando los recursos antes de usarlos. Cooperación entre procesos por compartimiento: EL caso de cooperación por compartimiento comprende los procesos que interactúan con otros procesos sin tener conocimiento explícito de ellos Por ejemplo varios procesos pueden tener acceso a variables compartidas, archivos o bases de datos. Los procesos pueden emplear y actualizar los datos compartidos sin hacer referencia a los otros procesos, pero son conscientes de que estos procesos pueden tener acceso a los mismos datos. Los mecanismos de control deben garantizar la integridad de los datos compartidos. Se pueden presentar los mismos problemas que en el caso de competencia, esto es, exclusión mutua, interbloqueo e inanición, pero además hay un diferencia. Se puede acceder a los datos de dos formas distintas, para lectura y para escritura. Solo las operaciones de lectura deben ser mutuamente exluyentes. Cooperación entre procesos por comunicación. Cuando los procesos cooperan por comunicación, en cambio, los distintos procesos participan en una labor común que une a todos los procesos. La comunicación es una manera de sincronizar o coordinar las distintas actividades. Puesto que en el paso de mensajes no se comparte nada entre procesos, no necesario el control de la exclusión mutua para este tipo de comunicación. Sin embargo los problemas de interbloqueo e inanición siguen presentes. Requisitos para la exclusión mutua, 1. Debe cumplirse la exclusión mutua: solo un proceso de entre todos los que poseen secciones críticas por el mismo recurso debe tener permiso para entrar en ella en un instante dado. 2. Un proceso que se interrumpe en una sección no crítica, debe hacerlo sin interferir con los otros procesos. 3. Un proceso no debe poder solicitar acceso a una sección crítica para después ser demorado indefinidamente, no puede permitirse el interbloqueo o la inanición. 4. Cuando ningún proceso está en su sección crítica, cualquier proceso que solicite entrar en la suya puede hacerlo sin dilación o retardo. 5. No se deben hacer suposiciones sobre la velocidad relativa de los procesos o el número de los procesadores. 6. Un proceso permanece en su sección crítica solo por un tiempo finito. Soluciones por software. EL algoritmo del matemático holandés Dekker fue presentado por Dijkstra en 1965. El algoritmo resuelve el problema de la exclusión mutua sin interbloqueo y sin inanición. Un algoritmo i gual de efectivo y más sencillo para entender fue presentado por Peterson en 1981. En el algoritmo de Peterson la variable global señal, indica la posición de cada proceso con respecto a la exclusión mutua, y la variable global turno resuelve los conflictos de simultaneidad. Las soluciones por software suelen tener un alto coste y el riesgo de errores lógicos en el programaes alto. Un segundo conjunto de métodos para soportar la exclusión mutua suponen el uso de instrucciones especiales de máquina. Estos métodos reducen la sobercarga, pero son aún ineficientes porque emplean la espera activa. Principios generales de los semáforos. Dos o más procesos pueden cooperar por medio de simples señales, de forma que se pueda obligar a detener a un proceso en una posición determinada hasta que reciba la señal específica. Cualquier requisito complicado de coordinación puede satisfacerse por medio de la estructura de señales adecuada. Un semáforo es una herramienta programada para coordinar las señales entre los proc esos. Para transmitir una señal por el semáforo s, los procesos ejecutan la primitiva signal(s). Para recibir una señal del semáforo s, los procesos ejecutan la primitiva wait(s), si la señal correspondiente aún no se ha transmitido, el proceso es suspendido hasta que tenga lugar la transmisión. Para lograr el efecto deseado, se pueden contemplar los semáforos como variables que tienen un valor entero sobre el que se definen las tres operaciones siguientes: 1. Un semáforo puede iniciarse con un valor no negativo. 2. La operación wait disminuye el valor del semáforo. Si el valor del semáforo se hace negativo, el proceso que ejecuta wait se bloquea. 3. La operación signal incrementa el valor del semáforo. Si el valor no es positivo, se desbloquea un proceso bloqueado por una operación wait. Las primitivas wait y signal no pueden ser interrumpidas, es decir son consideradas atómicas. Un semáforo binario solo puede tomar los valores 0 y 1. En los semáforos se emplea una cola para mantener los procesos esperando en el semáforo. La cuestión reside en el orden en que se retiran los procesos de dicha cola. La política más equitativa es FIFO: el proceso que ha bloqueado durante más tiempo se libera de la cola, un semáforo que no especifica el orden en el que se liberan los procesos de la cola es un semáforo débil. Monitores: Los semáforos son una herramienta básica pero potente y flexible para hacer cumplir la exclusión mutua y coordinar procesos. Sin embargo, puede resultar difícil construir un programa correcto por medio de semáforos. Los monitores son estructuras de un lenguaje de programación que ofrecen una funcionalidad equivalente a los semáforos y que son más fáciles de controlar. Un monitor es un modulo de software que consta de uno o más procedimientos, una secuencia de inicio y unos datos locales. Las características básicas de un monitor son las siguientes: 1. Las variables de datos locales están solo accesibles para los procedimientos del monitor y no para procedimientos externos. 2. Un proceso entra en el monitor invocando uno de sus procedimientos. 3. Sólo un proceso puede estar ejecutando el monitor en un instante dado; cualquier otro proceso que haya invocado al monitor quedará suspendido mientras espera a que el monitor esté disponible Paso de mensajes Cuando los procesos interactúan unos con otros se deben satisfacer dos requisitos básicos: la sincronización y la comunicación. Concurrencia: Interbloqueo e inanición. EL interbloqueo se puede definir como el bloqueo permanente de un conjunto de procesos que compite n por recursos del sistema o bien se comunican unos con otros. Los interbloqueos suponen necesidades contradictorias de recursos por parte de dos o mas procesos. El interbloqueo puede involucrar a recursos reutilizables o consumibles. Un recurso consumible es que que se destruye al ser adquirido por un proceso, como ejemplo están los mensajes y la información de los buffers. Un recurso reutilizable es quel que no se agota o se destruye por el uso, como un canal E-S o una zona de memoria. Condiciones de interbloqueo: En la política del sistema operativo, deben darse tres condiciones para que pueda producirse un interbloqueo: 1. Exclusión mutua: solo un proceso puede usar un recurso cada vez. 2. Retención y esperar: Un proceso pude retener unos recursos asignados mientras espera que se le asignen otros. 3. No apropiación: ningún proceso puede ser forzado a abandonar un recurso que retenga. 4. Círculo vicioso de espera: existe una cadena cerrada de procesos, cada uno de los cuales retiene, al menos, un recurso que necesita el siguiente proceso de la cadena. En la mayoría de los casos, estas condiciones son bastantes necesarias. Por ejemplo, la exclusión mutua hace falta para asegurar la consistencia de resultados y la integridad de la base de datos. De forma similar, la apropiación no se puede aplicar arbitrariamente y, cuando se encuentran involucrados recursos de datos, debe estar acompañada de un mecanismo de recuperación y reanudación que devuelva un proceso y sus recursos a un estado previo adecuado, desde el que el proceso pueda finalmente repetir sus acciones. La estrategia de prevención del interbloqueo consiste, a grandes rasgos, en diseñar un sistema de manera que esté excluida la posibilidad de interbloqueo. Los métodos pueden ser de dos tipos: indirectos y directos. En la predicción del interbloqueo, se pueden alcanzar las tres las tres condiciones necesarias , pero se realizan las elecciones acertadas para asegurar que nunca se llega al punto de interbloqueo. La predicción permite mas concurrencia que la prevención. Las estrategias de prevención del interbloqueo son muy conservadoras, solucionan el problema del interbloqueo limitando el acceso a los recursos e imponiendo restricciones a los procesos. En el lado opuesto, las estrategias de detección del interbloqueo no limitan el acceso a los recursos ni restringen las acciones de los procesos. Con detección del interbloqueo, se concederán los recursos a los procesos que los necesiten siempre que sea posible. Gestión de memoria Al realizar un estudio de los diversos mecanismos y políticas relacionadas con la gestión de memoria, vale la pena tener en mente los requisitos que intentan satisfacer. Se propone una lista con cinco requisitos: Reubicación Protección Compartición Organización lógica Organización física. Reubicación: En un sistema multiprogramado, la memoria principal disponible se encuentra compartido entre varios procesos. En general, el programador no puede conocer por adelantado qué otros programas residirán en la memoria en el momento de ejecución de su programa. Ademas se busca poder cargar y decargar los procesos activos en la memoria principal para maximizar el uso del procesador, manteniendo una gran reserva de procesos listos para ejecutarse. Una vez que se ha descargado un proceso en el disco, ería bastante límitado que, cuando vuelva a ser cargado, deba situarse en la misma región de la memoria principal que antes. En lugar de ello se necesita reubicar el proceso en un área distinta de memoria. Protección: cada proceso debe protegerse contra interferencias no deseadas de otros procesos, tanto accidentales como intencionadas. Así pues, el código de un proceso no puede hacer referencia a posiciones de memoria de otros procesos, confines de lectura o escritura, sin permiso. Normalmente, un proceso de usuario no puede acceder a ninguna parte del sistema operativo, ni programas ni datos. De nuevo, el programa de un proceso, normalmente no puede bifurcarse hacia una instrucción de otro proceso. Compartimiento: Cualquier mecanismo de protección que se implemente debe tener flexibilidad de permitir el acceso de varios procesos a la misma zona de la memoeria principal. Organización lógica: De forma casi invariable, la memoria principal de un sistema informático se organiza como un espacio de direcciones linéalo unidimensional que consta de una secuencia de bytes o palabras. La memoria secundaria se organiza de memoria similar. Organización física: La memoria del computador se organiza en al menos dos niveles: memoria principal y memoria secundaria. La memoria principal ofrece un acceso rápido con un coste relativamente alto. Además, la emoria principal es volátil, es decir, no proporciona almacenamiento permanente. Se borra al cortarse la electricidad. La memoria secundaria es mas lenta, y mas barata que la memoria principal y normalmente esno volátil, se mantiene al cortarse la electricidad, porque la tecnología que utiliza es magnética. En el esquema d dos niveles de memoria, la organización del flujo de información entre la memoria p rincipal y la memoria secundaria tiene un gran interés en el sistema. Bifurcación Referencia a datos Pila Requerimientos de direccionamiento para un proceso Partición de la memoria. La tarea principal del sistema de gestión de memoria es cargar los programas en la memoria principal para su ejecución en el procesador. EN casi todos los sistemas multiprogramados modernos, esta tarea requiere un sofisticado esquema llamado memoria virtual. La memoria virtual está a su vez basada en el uso de una o dos técnicas básicas: paginación o segmentación. Antes de ver éstas técnicas veremos algo mas sencillo, las particiones. Particiones estáticas: EN la mayoría de los esquemas de gestión de memoria se puede suponer que el sistema operativo ocupa una parte fija de la memoria principal y que el resto de la memoria está disponible para ser usada por varios procesos. El esquema mas sencillo de gestión de la memoria disponible es dividirla en regione con límites fijos. Ejemplo de partición estática de una memoria de 64 Mb Una posibilidad es emplear particiones de igual tamaño, en este caso cualquier proceso cuyo tamaño sea menor o igual que el tamaño de la partición pude cargarse en cualquier partición libre. Si todas las particiones están ocupadas y no hay procesos residentes en estado Listo o Ejecutando, el sistema operativo puede sacar un proceso de alguna de las particiones y cargar otro proceso de forma que siempre haya algún trabajo para el procesador. Las particiones estáticas de igual tamaño plantean dos dificultades: Un programa puede ser demasiado grande para caber en una partición. EN este caso, el programador debe diseñar el programa mediante superposiciones, para que solo una parte del programa este en memoria principal en cada instante. Cuando se necesita un módulo que no está presente, el programa de usuario debe cargar dicho módulo en la partición del programa, superponiéndose a los programas y datos que se encuentren en ella. El uso de la memoria principal es extremadamente ineficiente. Cualquier programa, sin importar lo pequeño que sea, ocupará una partición completa. En el ejemplo de la figura, puede haber un programa que ocupe menos de2 MBytes de memoria, aun así ocuparía una partición de 8 Mbytes cada vez que se cargase. Este fenómeno en el que se malgasta el espacio interno de una partición cuando el bloque de datos cargado es más pequeño que la partición, se denomina fragmentación interna. Algoritmo de ubicación. Con particiones del mismo tamaño, hay dos maneras posibles de asignar los procesos a las particiones. La forma mas simple es asignar cada proceso a la partición mas pequeña en la que quepa. En este caso, hace falta una cola de planificación para cada parición que albergue los procesos expulsados cuyo destino es dicha partición. Se minimiza la fragmentación interna pero desde el punto de vista global, no es muy eficiente. Cuando se va a cargar un proceso en la memoria principal, se selecciona la partición más pequeña disponible que pueda albergar el proceso. SI todas las particiones están ocupadas, se debe tomar una decisión de intercambio. Puede darse preferencia al intercambio de la partición mas pequeña que pueda contener al procesos entrante. También es posible considerar otros factores tales como prioridades y preferencia a descargar procesos bloqueados antes que procesos listos. Desventajas: EL numero de particiones especificadas en el momento de la generación del sistema limita el número de procesos activos en el sistema. Puesto que los tamaños de partición se programan en el momento de la generación del sistema, los trabajos pequeños no hacen un uso eficiente del espacio de partciones Asignación de memoria en partición estática Efectos de la partición dinámica. Fragmentación externa.