Coordinación y sincronización de procesos
Concurrencia
La concurrencia es el punto clave de los tres campos anteriores y fundamentales para el di-seño de sistemas operativos. La concurrencia comprende un gran número de cuestiones de diseño, incluyendo la comunicación entre procesos, compartición y competencia por los recursos, sincronización de la ejecución de varios procesos y asignación del tiempo de procesador a los procesos. Se verá que estas cuestiones no solo surgen en entornos de multi-procesadores y proceso distribuido, sino incluso en sistemas multiprogramados con un solo procesador.
La concurrencia puede presentarse en tres contextos diferentes:
La multiprogramación se creó para permitir que el tiempo de procesador de la máquina fuese compartido dinámicamente entre varios trabajos o aplicaciones activas.
Aplicaciones estructuradas: Como ampliación de los principios 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 sistemas y se ha comprobado que algunos sistemas operativos están implementados como un conjunto de procesos
Semáforos
Un semáforo es un objeto que es utilizado para sincronizar el acceso a un recurso compartido.
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 muy difícil construir un programa correcto por medio de semáforos. La dificultad está en que las operaciones wait y signal deben distribuirse por todo el programa y no es fácil advertir el efecto global de estas operaciones sobre los semáforos a los que afectan. En los semáforos, tanto la exclusión mutua como la sincronización son responsabilidades del programador.
Los semáforos permiten limitar el número de procesadores que acceden concurrentemente a un recurso compartido, estableciendo un protocolo de adquisición (wait) y liberación (signal).
Funcionamiento de los Semáforos.
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:
i.-Un semáforo puede inicializarse con un valor no negativo.
ii.-La operación wait decrementa el valor del semáforo. Si el valor se hace negativo, el proceso que ejecuta el wait se bloquea.
iii.-La operación signal incrementa el valor del semáforo. Si el valor no es positivo, se des-bloquea a un proceso bloqueado por una operación wait. Aparte de estas tres operaciones, no hay forma de examinar o manipular los semáforos.
Monitores
Los monitores son estructuras de un lenguaje de programación que ofrecen una funcionalidad equivalente a la de los semáforos y que son más fáciles de controlar.
Los monitores fueron propuestos por Brich Hansen y mejorados por Hoare para poder utilizar procesos automáticos de sincronización. Un módulo monitor encapsula la mutua exclusión de datos y procedimientos que pueden acceder a los datos protegidos. Los usuarios pueden hacer llamadas a estos procedimientos usando al monitor como una tabla de estado para determinar cuándo proceder y cuando suspender operaciones.
Los monitores ofrecen mayor seguridad (reliability), robustez y escalabilidad; complementan al encapsulamiento de un objeto, sincronizando el acceso al mismo.
Las características básicas de un monitor son las siguientes:
· las variables de datos locales están solo accesibles para los procedimientos del monitor y no para procedimientos externos.
· Un proceso entra en el monitor invocando a uno de sus procedimientos
· Solo un proceso puede estar ejecutando en el monitor en un instante dado; cualquier otro proceso que haya invocado al monitor quedara suspendido mientras espera a que el monitor esté disponible
Las dos primeras características recuerdan a las de los objetos del software orientado a objetos. En realidad, un sistema operativo o lenguaje de programación orientado a objetos puede implementar un monitor fácilmente como un objeto con características especiales. Si se cumple la norma de un proceso cada vez, el monitor puede ofrecer un servicio de exclusión mutua. Las variables de datos del monitor pueden ser accedidas solo por un proceso cada vez. Así pues, una estructura de datos compartida puede protegerse situándola dentro de un monitor. Si los datos del monitor representan a algún recurso, el monitor ofrecerá un servicio en exclusión mutua en el acceso a este recurso. Para que resulten útiles en el proceso concurrente los monitores deben incluir herramientas de sincronización. Por ejemplo, supóngase que un proceso llama a un monitor y, mientras está en el monitor, debe suspenderse hasta que se cumpla alguna condición. Hace falta un servicio para que el proceso no solo esté suspendido, sino que libere el monitor y otro proceso pueda entrar. Más tarde, cuando se cumpla la condición y el monitor está de nuevo disponible, el proceso puede reanudarse y tiene que permitírsele volver a entrar en el monitor en el punto de la suspensión.
· Un monitor proporciona sincronización por medio de las variables de condición que se incluyen dentro del monitor y que son accesibles sólo desde dentro. Hay dos funciones para operar con las variables de condición: wait(c):
· Suspende la ejecución del proceso llamado bajo la condición c. El monitor está ahora disponible para ser usado por otro proceso. signal(c)
· Reanuda la ejecución de algún proceso suspendido después de un wait bajo la misma condición. Si hay varios procesos, elige uno de ellos; si no hay ninguno, no hace nada
Sección Crítica
La sección crítica, en programación concurrente, es la porción de código de un programa de computador en la cual se accede a un recurso compartido (estructura de datos o dispositivo) que no debe ser accedido por más de un hilo en ejecución. La sección crítica por lo general termina en un tiempo determinado y el hilo, proceso o tarea sólo tendrá que esperar un período determinado de tiempo para entrar. Se necesita un mecanismo de sincronización en la entrada y salida de la sección crítica para asegurar la utilización en exclusiva del recurso. El acceso concurrente se controla teniendo cuidado de las variables que se modifican dentro y fuera de la sección crítica. La sección crítica se utiliza por lo general cuando un programa multihilo actualiza múltiples variables sin un hilo de ejecución separado que lleve los cambios conflictivos a esos datos. Una situación similar, la sección crítica puede ser utilizada para asegurarse de que un recurso compartido, por ejemplo, una impresora, puede ser accedida por un solo proceso a la vez.
El Problema de la Sección Crítica
El problema de la sección crítica es uno de los problemas que con mayor frecuencia aparece cuando se ejecutan procesos concurrentes. La manera en cómo se implementan las secciones puede variar dependiendo de los diversos sistemas operativos. Sólo un proceso puede estar en una sección crítica a la vez. Los procesos concurrentes entran en conflicto cuando compiten por el uso del mismo recurso, es decir, quieren acceder a un recurso al mismo tiempo. Y la ejecución de un proceso puede influir en el comportamiento de los procesos que compiten y el sistema operativo le asignará el recurso a uno de ellos y el otro tendrá que esperar. Por lo que el proceso que quede esperando, se retrasará, se bloqueara y en el peor de los casos nunca se terminará con éxito Es en estos procesos concurrentes, donde, se plantean una serie de situaciones clásicas de comunicación y sincronización, entre ellos el problema de la sección crítica.
Solución a la Sección Crítica.
Para resolver el problema de la sección crítica es necesario utilizar algún mecanismo de sincronización que permita a los procesos cooperar entre ellos sin problemas. Este mecanismo debe proteger el código de la sección crítica y su funcionamiento básico es el siguiente:
· Cada proceso debe solicitar permiso para entrar en la sección crítica, mediante algún fragmento de código que se denomina de forma genérica entrada en la sección crítica.
· Cuando un proceso sale de la sección crítica debe indicarlo mediante otro fragmento de código que se denomina salida de la sección crítica. Este fragmento permitirá que otros procesos entren a ejecutar el código de la sección crítica.
Cualquier solución que se utilice para resolver este problema debe cumplir los tres requisitos siguientes:
· Exclusión mutua: Si un proceso está ejecutando código de la sección crítica, ningún otro proceso lo podrá hacer.
· Progreso: Si ningún proceso está ejecutando dentro de la sección crítica, la decisión de qué proceso entra en la sección se hará sobre los procesos que desean entrar.
· Espera acotada: Debe haber un límite en el número de veces que se permite que los demás procesos entrena ejecutar código de la sección crítica después de que un proceso haya efectuado una solicitud de entrada yantes de que se conceda la suya.
RESUMEN.
Los temas centrales de los sistemas operativos modernos son la multiprogramación, el multiproceso y el proceso distribuido. Un punto fundamental en estos temas y en las tecnologías de diseño de sistemas operativos es la concurrencia. Cuando se ejecutan varios procesos concurrentemente, en el caso real de un sistema multiprocesador o en el caso virtual de un sistema monoprocesador multiprogramado, aparecen cuestiones de resolución de conflictos y de cooperación. Los procesos concurrentes pueden interactuar de varias formas. Los procesos que no tienen conocimiento unos de otros pueden competir por recursos tales como el tiempo del procesador o los dispositivos de E/S. Los procesos pueden tener conocimiento indirecto de los otros porque comparten el acceso a unos objetos comunes, tales como un bloque de memoria principal o un archivo. Los procesos pueden tener un conocimiento directo de los otros y cooperar mediante intercambio de información. Los puntos clave que surgen en esta interacción son la exclusión mutua y el interbloqueo. La exclusión mutua es una condición en la cual hay un conjunto de procesos concurrentes y sólo uno puede acceder a un recurso dado o realizar una función dada en cada instante de tiempo. Las técnicas de exclusión mutua pueden usarse para resolver conflictos, tales como competencia por los recursos y para sincronizar procesos de modo que puedan cooperar. Se han desarrollado varios algoritmos en software para ofrecer exclusión mutua, de los cuales el más conocido es el algoritmo de Dekker. Las soluciones por software suelen tener un alto coste y el riesgo de errores lógicos en el programa es también alto. Un segundo conjunto de métodos para soportar la exclusión mutua suponen el uso de instrucciones especiales de la máquina. Estos métodos reducen la sobrecarga, pero son aún ineficientes porque emplean espera activa
Otro método para dar soporte a la exclusión mutua consiste en incluir las características dentro del sistema operativo. Dos de las técnicas más comunes son los semáforos y el paso de mensajes. Los semáforos se usan para la señalización entre procesos y pueden emplearse fácilmente para hacer respetar una disciplina de exclusión mutua. Los mensajes son útiles para el cumplimiento de la exclusión mutua y ofrecen también un medio efectivo de comunicación entre procesos
No hay comentarios.:
Publicar un comentario