M1L1
M1L1
M1L1
Introducción
Cuando hablamos de concurrencia lo hacemos desde el punto de vista técnico, de programas
que se ejecutan de manera simultánea.
Este tipo de ejecución conlleva a no solo problemas, sino además a sus soluciones mediante el
tratamiento de diversos algoritmos que se verán a medida que avancemos con el contenido de la
materia en las presentes lecturas.
La programación secuencial ejecuta sus instrucciones en serie, es decir que, además de ejecutar
una instrucción por vez, hasta que esta no termine, la siguiente instrucción no se ejecuta.
Por tanto, en un programa secuencial, solo existe una única actividad o hilo de ejecución.
Es la forma tradicional de programar, debido a que las primeras computadoras tenían un
único procesador y los sistemas operativos no proporcionaron soporte para múltiples
actividades dentro de un mismo proceso.
Para que en un determinado proceso haya múltiples actividades, cada una de estas estará
soportada por un hilo de ejecución.
Para que un conjunto de actividades constituya un programa concurrente, todas ellas
deben cooperar entre sí para realizar una tarea común. (figura 1). (Muñoz Escoí et al.,
2012, https://bit.ly/3wprEgR)
Figura 1: Programa concurrente
Fuente: elaboración propia.
Para adentrarnos en la concurrencia, tomaremos como caso de ejemplo, simple pero efectivo, un
procesador de texto. Estos
son capaces de realizar varias tareas en segundo plano, mientras vamos escribiendo.
Como por ejemplo, revisión de ortografía, guardado automático del documento,
actualización de la vista en pantalla del mismo en tiempo real y otros que puedas conocer.
Para ello, se necesita un hilo de ejecución que se dedique a cada una de esas acciones [y
otro que atienda la entrada del usuario]. (Muñoz Escoí et al., 2012, https://bit.ly/3wprEgR)
Como podemos ver, existen múltiples hilos de ejecución y todos ellos cooperan entre sí,
compartiendo la información de un mismo documento, el que estamos editando.
Ahora bien, a partir de este caso, podremos determinar cuáles son los ámbitos de la
programación concurrente, sus aplicaciones, ventajas y desventajas.
● en hardware, CPU multicore, tarjetas gráficas con procesadores concurrentes, por ejemplo; y
Por supuesto que todo esto conlleva a mayor complejidad, y esta motiva a más y mejores
desarrollos, pero además a otras ventajas y desventajas.
Eficiencia: podemos tener varias actividades dentro de una misma aplicación, haciendo que se
ejecute de manera más veloz, además de utilizar más recursos a la vez, es decir, de manera
simultánea y que la aplicación no deje de ejecutarse.
Escalabilidad: habilidad para que el sistema se siga comportando correctamente a pesar de que
diferentes aspectos del sistema crezcan en tamaño u otras características.
Aplicaciones reales
Podemos nombrar los navegadores web, servidores web, aceleradores lineales (tratamiento de
radioterapia para algunos tipos de cánceres), videojuegos.
Como ejemplo del navegador web, podemos nombrar el caso en que Google presentó a
su navegador Chrome, en diciembre de 2008, su arquitectura era muy distinta a la del
resto de navegadores web de ese momento.
En Chrome, cada pestaña abierta está soportada por un proceso independiente. De esa
manera, si alguna de las pestañas falla, el resto de ellas puede seguir sin problemas. Para
mejorar su rendimiento, se optimizó su soporte para Javascript, compilando y
manteniendo el código generado en lugar de interpretarlo cada vez. Además, en cada
pestaña, se utilizan múltiples hilos para obtener cada uno de los elementos de la página
que deba visualizarse. Con ello, la carga de una página podía realizarse de manera
mucho más rápida que en otros navegadores. Actualmente, la mayor parte de los
navegadores web han adoptado una arquitectura similar a la de Chrome, dadas las
ventajas en rendimiento y robustez que proporciona. (Muñoz Escoí et al., 2012,
https://bit.ly/3wprEgR)
1- Se debería impedir que los métodos de acceso al buffer fuesen ejecutados por más de
una actividad de manera simultánea. Es decir, cuando alguna actividad haya iniciado la
ejecución de algún método, ninguna actividad más podrá ejecutar alguno de los métodos
de acceso al buffer.
2- Para evitar que se desborde el buffer, se deberá impedir que los productores ejecuten
el método de inserción cuando el valor del tamaño del buffer y el número actual de
elementos en el buffer sean iguales.
3- Para no extraer elementos de un buffer vacío, se debe evitar que los consumidores
ejecuten el método de extracción cuando el número de elementos del buffer sea nulo.
(Muñoz Escoí et al., 2012, https://bit.ly/3wprEgR)
Lectores-escritores
En este problema, se asume que existe un recurso compartido por todas las actividades.
El estado de este recurso se puede modificar. Algunas actividades utilizarán métodos para
modificar el estado del recurso: se considerarán “escritores”. Otras actividades o procesos
llegarán a leer el estado del recurso, pero no lo modificarán: son “lectores”. Un ejemplo
válido de recurso de este tipo será un fichero, que podrá ser leído o escrito por diferentes
procesos.
Para garantizar un uso correcto del recurso se imponen las siguientes restricciones:
2- Solo un proceso escritor puede estar accediendo al recurso. En caso de que un escritor
acceda, ningún proceso más podrá utilizar el recurso.
Así, se garantiza la consistencia en las modificaciones realizadas sobre el recurso.
Mientras un proceso escriba sobre él, ninguna escritura más llegará a causar
interferencias. También, se evita que algún proceso lector pudiera leer un estado
intermedio durante la escritura.
Cinco filósofos
En este problema, se asume que existen cinco filósofos cuya única misión es pensar y
comer. En la mesa que comparten, hay cinco plazas. A estos filósofos solo les gustan los
spaghetti y para comer necesitan dos tenedores cada uno. Sin embargo, en la mesa, hay
cinco platos y cinco tenedores, tal como se muestra en la figura 3. Por tanto, cuando un
filósofo vaya a comer, tendrá que tomar los dos tenedores que queden a ambos lados de
su plato, pero para ello ninguno de sus dos filósofos vecinos podrá estar comiendo.
Referencias
Muñoz Escoí, F. D., Argente Villaplana, E., Espinosa Minguet, A. R., Galdámez Saiz, P.,
García-Fornés, A., de Juan Marín, R. y Sendra Roig, J. S. (2012). Concurrencia y sistemas
distribuidos. Valencia, España: Universitat Politècnica.