jueves, 10 de agosto de 2017

Sincronización de Procesos

 

Antecedentes: 

Un proceso es cooperativo si puede afectar o ser afectado por los otros procesos que se están ejecutando en el sistema.


• La cooperación entre procesos requiere: la ejecución concurrente de los mismos, mecanismos de comunicación y mecanismos de sincronización.

• Un problema clásico de procesos cooperativos es el problema del productor- consumidor.

• Cada rutina es correcta pero pueden no funcionar correctamente correcta, cuando son ejecutadas concurrentemente 

• La situación en la que varios procesos acceden y manipulan el mismo dato concurrentemente, y el resultado de la ejecución depende del particular orden en que los accesos tienen lugar, es llamada condición de competencia 

• Se requiere alguna forma de sincronización para garantizar que solo un proceso a la vez puede estar manipulando el dato.  


El problema de la sección crítica Dado un conjunto n de procesos, cada proceso tiene un segmento de código, llamado sección crítica, en la cual los procesos pueden cambiar variables comunes, actualizar una tabla, grabar un archivo, etc. La característica importante del sistema es que, cuando un proceso se esta ejecutando en su sección crítica; ningún otro proceso puede ejecutarse en su sección crítica. En un sistema, la ejecución de las secciones críticas de los procesos debe ser mutuamente excluyentes en el tiempo. El problema de la sección crítica consiste en diseñar un protocolo que los procesos puedan usar para cooperar. Cada proceso debe solicitar permiso para ingresar a su sección crítica. La sección de código que implementa esta solicitud es la sección de ingreso. La sección crítica puede ir seguida de una sección de egreso. El código que queda es la sección restante. 

 Concurrencia.


Concurrencia es cuando el sistema trata de hacer mas de una cosa a la vez. Y el manejo de esta concurrencia es uno de los core problemas en la programación de Sistemas Operativos.

Los bugs relacionados con la concurrencia son los mas fáciles de crear y los mas difíciles de encontrar.

En los primeros kernel habían relativamente pocas fuentes de concurrencia (ya que SMP no era soportado) y la única causa de ejecuciones concurrentes era el uso de interrupciones de hardware.

Pero en respuesta al nuevo hardware y las nuevas aplicaciones el kernel evoluciono y muchas cosas pasan simultáneamente.

Condiciones de corrida, por otro lado, son el resultado de accesos no controlados a datos compartidos. Estos accesos no controlados producen resultados inesperados (ya que por ejemplo un proceso puede pisar los datos de otro)

CONCURRENCIA Y SU MANEJO:


En los sistemas linux actuales, hay un gran numero de fuentes de concurrencia y por esto posibles condiciones de corrida.

Hay que tener en cuenta de que el cogido de kernel es prescriptible (es decir, que el cogido del driver puede perder el procesador en cualquier momento y el proceso que lo reemplaza puede estar corriendo en nuestro driver también)

También las interrupciones (eventos asíncronos) pueden causar ejecuciones concurrentes de nuestro código.

En el mundo hotplugueable de hoy en dia, nuestro dispositivo puede desaparecer mientras estamos trabajando con el.
Entonces como hace el programador de drivers para evitar la creación de caos absoluto?

  • Usa primitivas de kernel para el control de concurrencia
  • Tiene en cuenta algunos principios básico anti concurrencia
Las condiciones de corrida, como habíamos dicho antes, vienen como resultado del acceso compartido de los recursos. Cuando dos hilos de ejecución tienen que trabajar con la misma estructura de datos (o recurso de hardware) la posibilidad de mezcla existe. Entonces primera regla para el diseño de nuestro driver: “Evitar los recursos compartidos cuando sea posible”.

La aplicación mas obvia de esta regla es evitar el uso de variables globales.
El problema es que este compartimiento es por lo general requerido. Los recursos de hardware, por naturaleza, son compartidos y los recursos de software o lo general tiene que estar disponibles para mas de un hilo de ejecución.

Hay que tener en mente que las variables globales no son la única manera de compartir datos, cada vez que nuestro código pasa un puntero a otra parte del kernel, estamos potencialmente creando una situación de comportamiento. “Compartir es un hecho de la vida”.

Abrazo mortal

En sistemas operativos, el bloqueo mutuo (también conocido como interbloqueo, traba mortal, deadlock, abrazo mortal) es el bloqueo permanente de un conjunto de procesos o hilos de ejecución en un sistema concurrente que compiten por recursos del sistema o bien se comunican entre ellos. A diferencia de otros problemas de concurrencia de procesos, no existe una solución general para los interbloqueos.

Todos los interbloqueos surgen de necesidades que no pueden ser satisfechas, por parte de dos o más procesos. En la vida real, un ejemplo puede ser el de dos niños que intentan jugar al arco y flecha, uno toma el arco, el otro la flecha. Ninguno puede jugar hasta que alguno libere lo que tomó.



No hay comentarios:

Publicar un comentario