Definición
La concurrencia se refiere a dos
o más eventos cuyo orden es no determinista, en otras palabras, que no se puede predecir el orden de
ocurrencia de éstos.
En un sistema operativo o en un
programa la concurrencia se presenta cuando se necesita interactuar con otros,
parte del procesamiento puede depender de datos obtenidos en fuentes externas
por lo que la cooperación con hilos o procesos externos es fundamental.
Muchos de los lenguajes de
programación convierten cada instrucción en una serie de operaciones de máquina
de tal forma que una instrucción aparentemente simple implica la realización de
varias operaciones de bajo nivel.
En un sistema operativo
multitarea cuando un proceso agota el tiempo de procesador establecido o
detiene su ejecución por otra razón, los valores almacenados en los registros
se preservan para poder restaurarlo cuando la ejecución continúe.
El problema con la concurrencia,
es que puede hacer que un programa funcione correctamente la mayor parte del tiempo,
pero de vez en cuando puede fallar, es por eso que se utiliza una serie de
acciones para prevenir o corregir dichos fallos.
Antes de entrar de lleno a las
acciones correctivas, es necesario identificar algunos conceptos que son útiles
para entender el concepto de las concurrencias.
Operación atómica: Se
refiere a una manipulación de datos que requiere la garantía de que se
ejecutará como una sola unidad de ejecución pues de lo contrario fallará
completamente sin mostrar resultados parciales.
Condición de carrera: Conocido
también como race condition, es una categoría de errores de programación que
involucra a dos procesos que fallan al comunicarse su estado mutuo arrojando resultados
inconsistentes.
Región crítica: Área de código que requiere ser protegida de
accesos simultáneos donde se realiza la modificación de datos compartidos.
Recurso compartido: Es un
recurso al que se puede tener acceso desde más de un proceso.
Una de las opciones utilizadas
para los problemas de concurrencia es el algoritmo de Peterson,
propuesto en el año de 1957 y consiste en la utilización de banderas para
indicar qué proceso puede entrar, pero además usa un turno para desempatar en
caso de que ambos procesos busquen entrar a la vez.
Se podría decir que es un
algoritmo amable, ya que si un proceso detecta que el otro fue primero en
actualizar el turno, entonces lo deja pasar.
Otra posible solución para las
eventualidades de concurrencia son los mecanismos de sincronización.
Regiones de exclusión mutua:
mutexes. La palabra mutex se refiere a las regiones de exclusión mutua. Es
un mecanismo que asegura que cierta región del código será ejecutada como si
fuera atómica. Un mutex no implica que el código no se va a interrumpir mientras
se está dentro de ésta región, el mutex implica un mecanismo de seguridad que
mantiene en espera a cualquier hilo o proceso que quiera entrar a la sección
crítica protegida hasta que el proceso que la está ejecutando salga de ella.
Una región protegida debe ser mínima, es decir, tan corta como sea
posible para evitar que otros hilos queden bloqueados fuera del área crítica y debe
ser completa, en otras palabras, analizar con detenimiento cuál es el área
a proteger y no arriesgarse a proteger de menos.
Semáforos, es una variable
de tipo entero que tiene definida la interfaz de inicialización, se
puede iniciar el semáforo a cualquier valor entero; decrementar, cuando
un hilo decrementa el semáforo, si el valor es negativo, el hilo se bloquea y
no puede continuar hasta que otro hilo incremente el semáforo; incrementar, cuando
un hilo incrementa el semáforo, si hay hilos esperando, uno de ellos es despertado,
el nombre que recibe ésta instrucción es signal, up, reléase, post.
Multiplex, Permite la
entrada de no más de n procesos a la región crítica.
Torniquete, Esta
estructura garantiza que un grupo de hilos o procesos pasa por un punto
determinado de uno en uno incluso en un ambiente multiprocesador.
Apagador, Cuando se tiene
una situación de exclusión categórica, varios procesos de la misma categoría
pueden entrar a la sección crítica, pero procesos de dos categorías distintas
deben tenerlo prohibido.
Barrera, Es una generalización
que permite la sincronización entre varios hilos y no requiere que la categoría
de cada uno de ellos sea distinta.
Cola, Se emplea cuando se
tienen dos clases de hilos que deben proceder en pares. Este proceso es referido
muchas veces como baile de salón ya que hace falta que haya un líder y un
seguidor.
Rendezvous, término que se
utiliza para “dar una cita”. Se busca que dos hilos se esperen mutuamente en
cierto punto para continuar en conjunto.
Para terminar de entender el concepto se recomienda ver el video Concurrencia
