Coordinación y Sincronización de Procesos

En Proceso

Concurrencia

    La concurrencia de procesos se refiere a las situaciones en las que dos o más procesos puedan coincidir en el acceso a un recurso compartido o, dicho de otra forma, que requieran coordinarse en su ejecución. Para evitar dicha coincidencia, el sistema operativo ofrece mecanismos de arbitraje que permiten coordinar la ejecución de los procesos. 
 

Semáforos

Un semáforo es una variable especial (o tipo abstracto de datos) que constituye el método clásico para restringir o permitir el acceso a recursos compartidos (por ejemplo, un recurso de almacenamiento del sistema o variables del código fuente) en un entorno de multiprocesamiento (en el que se ejecutarán varios procesos concurrentemente). Fueron inventados por Edsger Dijkstra en 1965 y se usaron por primera vez en el sistema operativo THEOS.

Operaciones

Los semáforos sólo pueden ser manipulados usando las siguientes operaciones (éste es el código con espera activa):

En el que se iniciará la variable semáforo s a un valor entero v.

La cual mantendrá en espera activa al regido por el semáforo si este tiene un valor inferior o igual al nulo.



Estas instrucciones pueden modificarse para evitar la espera activa, haciendo que la operación P duerma al mismo proceso que la ejecuta si no puede decrementar el valor, mientras que la operación V despierta a un proceso que no es quien la ejecuta. En un pseudolenguaje más entendible, la operación P suele denominarse "wait" o "espera" y la operación V "signal" o "señal".

El porqué de los nombres de estas funciones, V y P, tiene su origen en el idioma neerlandés. "Verhogen" significa incrementar y "Proberen" probar, aunque Dijkstra usó la palabra inventada prolaag, que es una combinación de probeer te verlagen (intentar decrementar). El valor del semáforo es el número de unidades del recurso que están disponibles (si sólo hay un recurso, se utiliza un "semáforo binario" cuyo valor inicial es 1).

La verificación y modificación del valor, así como la posibilidad de irse a dormir (bloquearse) se realiza en conjunto, como una sola e indivisible acción atómica. El sistema operativo garantiza que al iniciar una operación con un semáforo, ningún otro proceso puede tener acceso al semáforo hasta que la operación termine o se bloquee. Esta atomicidad es absolutamente esencial para resolver los problemas de sincronización y evitar condiciones de competencia.

Si hay n recursos, se inicializará el semáforo al número n. Así, cada proceso, al ir solicitando un recurso, verificará que el valor del semáforo sea mayor de 0; si es así es que existen recursos libres, seguidamente acaparará el recurso y decrementará el valor del semáforo.

Cuando el semáforo alcance el valor 0, significará que todos los recursos están siendo utilizados, y los procesos que quieran solicitar un recurso deberán esperar a que el semáforo sea positivo, esto es: alguno de los procesos que están usando los recursos habrá terminado con él e incrementará el semáforo con un signal o V(s).

Monitores

    En la programación paralela, los monitores son estructuras de datos abstractas destinadas a ser usadas sin peligro por más de un hilo de ejecución. La característica que principalmente los define es que sus métodos son ejecutados con exclusión mutua. Lo que significa, que, en cada momento en el tiempo, un hilo como máximo puede estar ejecutando cualquiera de sus métodos. Esta exclusión mutua simplifica el razonamiento de implementar monitores en lugar de código a ser ejecutado en paralelo.    
     
     En el estudio y uso de los semáforos se puede ver que las llamadas a las funciones necesarias para utilizarlos quedan repartidas en el código del programa, haciendo difícil corregir errores y asegurar el buen funcionamiento de los algoritmos. Para evitar estos inconvenientes se desarrollaron los monitores. El concepto de monitor fue definido por primera vez por Charles Antony Richard Hoare en un artículo del año 19741​ La estructura de los monitores se ha implementado en varios lenguajes de programación, incluido Pascal concurrente, Modula-2, Modula-3 y Java, y como biblioteca de programas.

Sección Crítica


Se denomina región crítica,(sección crítica y región crítica son denominaciones equivalentes) en programación concurrente de ciencias de la computación, a la porción de código de un programa de ordenador en la que se accede a un recurso compartido (estructura de datos o dispositivo) que no debe ser accedido por más de un proceso o 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, por ejemplo un semáforo, monitores, el algoritmo de Dekker y Peterson, los candados.

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, pueda ser accedida por un solo proceso a la vez.

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.

El método más común para evitar que dos procesos accedan al mismo tiempo a un recurso es el de la exclusión mutua.

Bloqueos

    Los bloqueos pueden ser resueltos por el sistema operativo aunque en ocasiones pueden parar la maquina. Un conjunto de procesos se bloquea si cada proceso del conjunto espera un evento que solo puede ser provocado por otro proceso del mismo conjunto. Puesto que todos los procesos están esperando ninguno de ellos realizará el evento que pueda despertar a los demás y todos los procesos esperaran por siempre.

Cuando los recursos son compartidos entre usuarios:

    Pueden producirse interbloqueos en los cuales los procesos de algunos usuarios nunca podrán llegar a su término. Se debe considerar la prevención, evitación, detección y recuperación del interbloqueo y la postergación indefinida, que se da cuando un proceso, aunque no esté interbloqueado, puede estar esperando por un evento que probablemente nunca ocurrirá.

En algunos casos:
  • El precio de liberar interbloqueos en un sistema es demasiado alto.
  • El precio de liberar interbloqueos en un sistema es demasiado alto. Permitir el interbloqueo podría resultar catastrófico.
  • Los sistemas de cómputos tienen muchos recursos que solo pueden ser utilizados por un proceso a la vez: Ej.: impresoras, unidades de cinta, espacio de la tabla de nodos-i.
  • Los S. O. tienen la capacidad de otorgar temporalmente a un proceso el acceso exclusivo a ciertos recursos.

          Frecuentemente un proceso necesita el acceso exclusivo no solo a un recurso, sino a varios.

Ej. de bloqueo:

Dos procesos desean imprimir grandes archivos en cinta.

  • El proceso “a” solicita la impresora, que se le concede.
  • El proceso “b” solicita la unidad de cinta, que se le concede.
  • El proceso “a” solicita la unidad de cinta, pero se deniega la solicitud hasta que “b” la libera.
  • El proceso “b” solicita la impresora y se produce el bloqueo (deadlock).

En este caso ambos procesos se quedan en un ciclo infinito debido a que cada uno de los procesos se queda esperando a que el dispositivo que necesita este libre. Cuando ocurren este tipo de bloqueos la única solución es sacrificar uno de los dos procesos.

Los recursos pueden ser de dos tipos:

Apropiables.

Este tipo de recurso, es aquel que si no esta siendo utilizado por un proceso, el sistema operativo en caso de que otro proceso lo necesite se lo asigna a este proceso. Un ejemplo de este recurso es la memoria.

No apropiables.

Este tipo de recurso, es aquel es si un proceso lo esta necesitando, en este caso no se libera amenos que el proceso lo libere. Un ejemplo de este es la impresora.

Un proceso que desea utilizar un recurso sigue una serie de pasos, los cuales son lo siguientes:

Solicitar el recurso.

Aquí el sistema operativo busca el recurso y checa si esta listo, si es así el recurso es asignado al proceso, pero si no esta listo el proceso tendrá que esperar.

Utilizar el recurso.

Aquí el sistema operativo checa si el recurso asignado esta siendo ocupado si no es así, el sistema operativo se lo quita y libera el recurso.

Liberar el recurso.

Aquí el sistema operativo no puede checar o liberar el recurso, lo que hace es avisar al usuario para que no use tanto el recurso.

          Para que se presente un bloqueo se deben realizar las siguientes condiciones.

Condición de exclusión mutua.

Cada recurso esta signado a un único proceso o esta disponible.

Condición de posesión y espera.

Los procesos que tienen en un momento dado recursos asignados con anterioridad pueden solicitar nuevos recursos.

Condición de no apropiación.

Los recursos otorgados con anterioridad no pueden ser forzados a dejar un proceso. El proceso que los posee debe liberarlos en forma explicita.

Condicion de espera circular.

Debe existir una cadena circular de 2 o más procesos, cada uno de los cuales espera un recurso poseído por el siguiente elemento de la cadena.




Comentarios

Entradas populares