Multitarea – Condiciones de carrera



Las condiciones de carrera (Race Condition o Race Hazard en inglés) es un problema de diseño propio de los sistemas multitarea. Diferentes tareas o proceso compiten por determinados recursos compartidos y en ocasiones pueden provocar la caída del sistema o una mala experiencia de usuario.

Intentemos explicar las condiciones de carrera con una carrera de caballos.



Imaginemos que una carrera de caballos, todos los jinetes intentan cabalgar por el carril mas interno.

El carril más interno de la pista de carreras es un recurso compartido, puesto que puede ser ocupado por cualquiera de los jinetes en un momento dado.

Pero el uso de este carril, implica que al ser uno solo, los jinetes compitan por ocuparlo y esa competencia tiene que tener determinada sincronización.

Una vez ocupado este carril, puedes correr a toda velocidad si no tienes ningún caballo delante, o correr teniendo en cuenta la velocidad del o los caballos que tengas delante en el mismo carril.

Otro problema es que dos caballos no pueden ocupar el mismo carril a la vez en la misma posición porque se produciría una colisión que podría traer como consecuencia la caída de caballos y jinetes.

La única solución que tiene un jinete en una carrera de caballos para utilizar este carril es la sincronización:

  • Si está vacío, puedes ocuparlo a toda velocidad y correr mientras no tengas nadie delante
  • Si está ocupado, tienes que ir a una velocidad inferior a la de los caballos que tengas delante
  • Si vas a entrar o a salir del carril, tienes que cuidar que no haya colisión con otros caballos

Un problema similar ocurre con los ordenadores y teléfonos móviles. Imaginemos que el carril es un recurso compartido, por ejemplo el micrófono de un teléfono móvil. Los caballos son hilos de ejecución (threads). Como por lo general, el teléfono solo tiene un micrófono, un hilo de ejecución donde se ejecuta una llamada de voz no puede interferir con hilo que ejecuta una grabación de notas de voz.



Y lo mismo pasa con la pantalla. Un juego que presenta animaciones en pantalla, no puede interferir con el uso del visor de la cámara de fotos que utiliza también la pantalla.

Si no sincronizan y se respetan estas acciones, el usuario grabaría una conversación de voz que no sería transmitida al otro interlocutor a través de la red telefónica, o el juego continuaría enviando imágenes animadas a una pantalla por donde tenemos que mirar antes de hacer una foto.

Las condiciones de carrera en un sistema informático se producen siempre cuando varios procesos o tareas acceden a un recurso compartido (memoria, disco, dispositivo de entrada / salida) cambiando temporalmente su estado que es reportado a otro proceso como un error. Por ejemplo que se grabe una conversación de voz en vez de trasmitirse a la voz a otro usuario.

Otra condición de carrera se produce cuando un proceso descarga un archivo de música o vídeo desde Internet y otro proceso intenta reproducirlo al mismo tiempo. 



El proceso que reproduce tiene que tener dos facilidades implementadas:

  • Buffering (a almacenamiento temporal) de los datos que desea reproducir. El proceso de descarga transfiere bloques de datos a este buffer bloqueándolo durante un corto espacio de tiempo y luego liberándolo para que el proceso reproductor lo pueda leer
  • Mecanismo para sincronizar cuando el buffer tiene datos disponibles o cuando se han terminado los datos o simplemente cuando no se actualiza el buffer durante un período de tiempo demasiado grande

Si no hay buffering, el proceso que reproduce puede intentar leer un fichero que puede estar bloqueado por el proceso de descarga. Esto implicaría que nuestra aplicación tendría que esperar terminar la descarga antes de reproducir su contenido.

Si no hay sincronismo entre procesos, el que reproduce fallará porque el buffer podría estar en uso por el proceso de descarga.

0 comentarios:

Publicar un comentario

Entrada más reciente Entrada antigua Inicio