2

Programación dirigida por eventos , Programación concurrente, problemas.

Hola Platzinauta. 👋
Te comparto mis apuntes para que #NuncaParesDeAprender. 👀✍

Programación dirigida por eventos

Se caracteriza porque no controla la secuencia de ejecuciones, reacciona a los sucesos ocurridos.

Generalmente los programas corren indefinidamente integrando manejadores de eventos (event handlers).

Eventos

  • Clicks
  • Teclas
  • Sensores
  • Mensajes
  • Triggers

Casos de aplicación

  • GUIs
  • Aplicaciones web
  • Sistemas de booking
  • Sistemas de alarmas
  • Robótica
  • Videojuegos

Cómo funciona

Sí lo comparamos con la programación imperativa, tenemos una secuencia de pasos que se van a ejecutar de manera secuencial y después puede repetirse el ciclo o puede llegar a detenerse el programa porque así lo decidimos o porque forzamos su detención. En la programación dirigida por eventos, tenemos un ciclo que puede ser un while el cuál mientras haya una condición sea verdadera o falsa, se puede estar ejecutando de manera indefinida. Entonces este ciclo va a recibir ciertos eventos que van a modificar algunas variables de estado, que puede ser como el caso de un videojuego, el contador de vidas, en el cual la condición dice que mientras que el número de vidas sea mayor que 0, se va a estar ejecutando el programa, pero habrán ciertos eventos que van a hacer que ese número de vidas disminuya o aumenten y por consecuencia el videojuego termine en ese ciclo.

Lenguajes

  • Java

  • Javascript

  • C#

  • Librerías/Frameworks de GUI

    -JavaFX, React.js, PyQT

  • Prácticamente cualquier lenguaje orientado a objetos.

*Programación concurrente

Analogía: Imagina ser el propietario de una panadería, mientras se calienta el horno, estás cortando masa, cortándola, preparándola y una vez que se están horneando, 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 meter el otro lote de masa o si contratas a una persona que te ayude, dividirás las tareas, al hacer esto, estás ejecutando el paralelismo, que es dividir las tareas entre los recursos disponibles, siempre y cuando puedan dividirse.

Concurrencia

Coincidencia, concurso simultáneo de varias circunstancias.

Es cuando hay una serie de peticiones a un mismo recurso que podría ser limitado y se están atendiendo esas solicitudes 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 y a ser muy grande, por lo tanto es bastante concurrida y los clientes empiezan a acumularse, por lo tanto, tú no puedes atenderlos a todos, empezarían a enojarse por no ser atendidos de forma rápida y ordenada. Una forma de solucionarlo, podría ser un sistema de tickets, para así atender a los clientes en su orden de llegada.

Concurrencia vs Paralelismo

En la concurrencia

tenemos una serie de peticiones con un solo recurso limitado para atenderlos, ¿Cuál sería el orden, la prioridad? etc.

En el paralelismo

Tenemos recursos divididos que pueden atenderlos de forma simultanea sin ningún problema

El paralelismo y la concurrencia, son conceptos diferentes pero que van de la mano, por ello debemos entender ambos para entenderlos entre sí.

Secuencia vs Concurrencia

En una secuencia

Vamos a tener los pasos A, B, C, D. Y estos serán atendidos en el orden que se hizo la petición.

En la 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 procesamiento

Estados de un hilo

  • 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.

Comunicación entre hilos

  • Acceso exclusivo a un recurso compartido.
  • Intercambiar información con otro hilo.

Problemas de concurrencia

Carreras (Critical races)

Sucede cuando dos o más hilos desean acceder a un recurso lo más pronto posible. Podemos ver este ejemplo, tenemos una variable C, inicializamos en 0, pero después en alguna parte del código a C, le asignamos el valor de C + 1, entonces un hilo llegará primero y al ver que vale 0, le agregará el valor de 1, almacena ese dato y ahora C vale 1. Pero sí otro hilo llega después, pensará que C vale 1, entonces añadirá otro 1, almacenará ese dato y entonces C vale 2. Esto puede ser un problema en un sistema automatizado de dosificación de medicamentos. Sí el sistema es concurrente, ¿Entonces que hará? ¿Le dará una dosis o dos dosis? ¿Cómo se resuelve?.

Puntos muertos (deadlock)

Ocurre cuando un hilo espera por un evento que nunca sucederá.

Para que suceda un punto muerto deben de cumplirse 4 condiciones:

  • Los hilos deben tener derechos exclusivos a los recursos.
  • Los hilos deben contener algunos recursos mientras esperan otros.
  • Los recursos no se pueden eliminar de los hilos en espera.
  • Existe una cadena circular de hilos en las que cada uno contiene uno o más recursos del siguiente hilo.

Problema de los filósofos

El problema plantea que hay una mesa redonda donde hay 5filósofos que están conversando, frente a ellos hay un plato de comida, a su derecha y a su izquierda, hay otros filósofos y hay un palillo chino a la derecha y otro a la izquierda, para comer se necesitan ambos palillos chinos, eso significa que habrá una persona que no comerá. Hay muchas formas de abordar el problema, pero esas soluciones pueden dar otros problemas, podría ser un sistema de turnos, pero entonces algunos se quedarían esperando hasta que la comida esté fría o tenga mucha hambre. Podríamos hacer que se alternen los turnos de comida.

Estrategias

Evitar que se cumpla alguna de las condiciones

  • Semáforos: Funcionarían como una variable de tipo entero, asociado a un mecanismo de cola de hilos. Si el semáforo toma valores de “0” y “1”, es binario. En caso contrario es un “semáforo contador”.
  • Monitores: Estructuras de datos abstractas basados en los monitores o kernel de los S.O.

Los monitores tienen 4 componentes principales:

  • Inicialización: Contiene código a ser ejecutado.
  • Datos privados: Procedimientos que se utilizan desde dentro del monitor.
  • Métodos del monitor: Procedimientos que se pueden llamar desde fuera.
  • Cola de entrada: Hilos que llaman a algún método del monitor pero no tienen permiso para ejecutarse aún.

Algunos lenguajes

  • JavaScript
  • C#
  • Golang
  • Rust
  • Elixir
  • Haskell
Escribe tu comentario
+ 2