Programación Concurrente y Paralelismo: Conceptos y Aplicaciones

Clase 12 de 21Curso de Historia de la Programación: Lenguajes y Paradigmas

Resumen

Imagina que trabajas en una panadería. Mientras se calienta el horno, estás cortando masa, preparando panes, y una vez que se hornean, al sacarlos hay que esperar a que se enfríen y después colocar una cobertura de chocolate. Tú intentarás optimizar los recursos. Mientras el horno se está calentando, debes preparar más masa, para que así, cuando termine, inmediatamente metes el otro lote de masa.

También puedes contratar a una persona que te ayude. Divides las tareas, ejecutando el paralelismo, que es dividir las tareas entre los recursos disponibles (siempre y cuando puedan dividirse).

Concurrencia

La concurrencia ocurre cuando hay una serie de peticiones a un mismo recurso que puede ser limitado, y se atienden esas peticiones de forma parcial o totalmente desordenada. Una analogía útil para entender puede ser la panadería. Imagina que tu panadería empieza a crecer, porque es bastante concurrida y los clientes empiezan a acumularse.

Concurrencia vs. paralelismo

En la concurrencia tenemos una serie de peticiones con un solo recurso limitado para atenderlas. Cabe preguntarse ¿cuál sería el orden y la prioridad en la que se atienden las peticiones? Por otro lado, en el paralelismo tenemos recursos divididos que pueden atender las peticiones al mismo tiempo sin ningún problema. El paralelismo y la concurrencia son conceptos diferentes, pero que van de la mano.

Secuencia vs. Concurrencia

En una secuencia tenemos los pasos A, B, C, D. Y estos serán atendidos en el orden que se hizo la petición. En cambio, en concurrencia podemos iniciar en el proceso A, saltar al D, luego al C, completar el A y después pasar al último proceso. Todo esto se hace mediante los hilos de un proceso.

Estados de un hilo

Un hilo tiene 5 estados posibles

  • Creado: no está listo para correr.
  • Ejecutable/Listo: espera para ejecutarse.
  • Ejecutando: se ejecuta en el procesador.
  • Bloqueado: espera a entrar al código que requiere acceso al recurso compartido o abandona el procesador.
  • Terminado: se ha detenido y no puede reiniciarse.

Sección crítica del hilo

Es una sección de código que requiere acceso exclusivo a una variable compartida. Sucede cuando varios hilos deben “comunicarse entre sí para decidir cuál va a tener acceso al recurso en el momento”. Esta sección crítica causa distintos problemas al usar concurrencia, los cuales exploraremos en la próxima clase.

Contribución creada por: Ciro Villafraz con los aportes de Valentina Barrios.