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