Asynchrony from the Roots 🤟🕸

Theba Gomez

Instructor @Fictizia 🤖

Adalab fan and mentor 🙆‍♀️

 💜 FOSS Contributor and advocate 🥑

 🔥 🌪 Software Eng. @Devo

  💚 Node Girls Madrid Lead

💃🏻 Embajadora de los Guilds

y Org. @Open Source Weekends

    @KoolTheba

💜 = 🧠

Para amar algo, hay que comprenderlo antes...

  • Sincronía y Asincronía  🚧 
  • Sistemas Operativos
  • Programa y Procesos ⚙️ ⛓
  • Single 🕸 y Multiple  Threads 🕸🕸🕸
  • Concurrencia y Paralelismo 👯‍♀️
  • Browsers y Servidores 📬
  • ¡Preguntas! 📣📣

Qué veremos??

Qué es la asincronía?

Asincronía: se refiere a la existencia de eventos independientes del flujo principal del programa y a las formas de gestionar esos eventos.

Definición Wikipedia...

¿¿Por qué asincronía?? 

La evolución de las aplicaciones, necesidades de usuario y escalabilidad hace que nazcan modelos que gestionen muchas acciones y peticiones

Ejemplos

  • Lectura / Escritura en disco
  • Comunicación con bases de datos
  • Peticiones de clientes
  • Peticiones Web

En el Frontend

Más usos

  • Timers
  • Ajax (técnica de desarrollo para crear aplicaciones interactivas) - Asynchronous Js and XML
  • Eventos 

Llamada asíncrona procedural - Sistemas Operativos

Asynchronous Javascript XML - aplicaciones web

Asynchronous method dispatch - servidor

Sincronía y Asincronía

Procesando...

by RisingStack

AJAX (cliente)

fetch('/data')
.then(res => res.json())
.then(console.log)
.catch(err => throw err)

AJAX (server)

const express = require('express');
const {readFileSync} = require('fs')

const app = express();

app.get('/data', (req, res) => {
  const content = readFileSync("./my_data.json")
  res.json(content);
});

app.listen(3000, () => {
  console.log('Server on port 3000!');
});

Conceptos básicos

S.O + KERNEL + HW

  • Abstrae la complejidad del Hardware y gestiona recursos
  • Protege (memoria p.e.) y aisla

Conceptos básicos

Tareas CPU vs IO

CPU

Computaciones numéricas, lógicas... Leer/escribir en el sistema de ficheros
​Análisis datos en memoria Acceso a cámara, micrófonos y otros...
Simulaciones Leer/escribir a/desde tarjeta de red (Wifi/cable...)
Leer desde el stdin (consola...)

Input/Output

Bound (atascos)

By LemonCode

Síncronas/ Secuenciales

Asíncronas

⚠️ ⚠️ Bound === Limitaciones o Cuellos de botella

Conceptos básicos

Programa y Procesos

Programa:   

No es algo vivo hasta que se ejecuta, y se ejecuta en procesos.

Es sencillamente un conjunto de estructuras de datos y código.

Proceso: 🏃🏻‍♀️🏃🏻‍♀️

Unidad mínima de ejecución de un SO (instancia de un programa en ejecución). a.k.a. Tareas (o Jobs)

Tiene un flujo de control que ejecuta una instrucción tras otra.

Puede tener 1 o varios hilos de ejecución.

Ejemplo visual

2 instancias de ejecución [procesos] de un programa de edición de texto (p.ej. Word...) con dos estados diferentes

Activity Monitor

Entendiendo el ciclo de vida

Fase de espera: a que el sistema esté listo, los datos estén disponibles o que la operación se complete

Fase de ejecución: respuesta/siguiente acción con los datos recibidos

¿Diferencias entre procesos e hilos? 🤨

Hilos o Threads

Es la unidad o la tarea por defecto de uso de la CPU

y de ejecución de un proceso

Procesos vs Hilos

Proceso == programa + el estado de la ejecución de los hilos

Hilos o Threads

👉 Aquí entra la concurrencia! 👈

  • Trabaja simultáneamente con otros muchos hilos
  • Requiere coordinación ya que comparten recursos: I/O dispositivos, CPU, memoria...

Concurrencia

Si tienes tareas de input/output y quieres programarlos para que den los resultados correctos, lo que estás tratando de hacer es resolver un problema de concurrencia

Concurrencia 

Es esencial en la programación moderna:

  • Páginas web que deben manejar a múltiples usuarios simultáneamente 
  • Aplicaciones móviles que necesitan hacer procesamiento en servidores/en la nube
  • Las GUIs (Graphical User Interfaces) suelen requerir tareas en el back que hace que no se interrumpa el flujo de usuario

Concurrencia: habilidad de distintas partes de un programa de ser ejecutado en desorden o en orden parcial, sin afectar el resultado final.

Concurrencia y patrones

A nivel de lenguajes de programación:

  • Canales/Streams
  • Corutinas
  • Multithreading
  • Futuros y promesas

A nivel del Sistema Operativo:

  • Computación multi-tarea, incluyendo cooperativo y preemptive ()
    • Con el ej. Time-Sharing
  • Procesos
  • Hilos

Concurrencia y patrones

- Condición de carrera (race condition)

- Interleaving - intercalado

- Nudos (locks)

- Queues

- Thread Pool

- Espera (Waiting)

- Exclusión (Mutex)

***

- Polling (mecanismo de sondeo - async I/O)

- Interrupts (async I/O)

Concurrencia: control y coordinación de hilos

En el caso de hilos, al compartir el mismo entorno del proceso, dirección y datos, pueden darse conflictos y hay que solucionarlo

Exclusión mutua o Mutex: el acceso (a datos p.e.) se le concede a sólo a un hilo por turno.

 Se evita que entre más de un hilo a la vez en una sección crítica

Espera: se especifica a qué esperan antes de proceder. Se le notifica explícitamente cuándo proceder.

👇 Ambos son mecanismos de sincronización 👇

En la práctica

  • Chequear el dispositivo (idle/waiting - fase de espera):

    • Bloqueante: esperas hasta que el dispositivo esté listo, thread bloqueado

    • No-bloqueante: devuelve el control - p.ej. con un polling sondea constante y periódicamente hasta que esté listo y entonces…

Hacer operaciones I/O consiste en 2 pasos:

  • Transmitir datos (ready/running - fase ejecución):
    • Síncronamente: ejecutando la operación (p.ej. escribir o leer) iniciada por el programa hasta que se completa

    • Asíncronamente: la finalización de la operación se notifica al programa (con una promesa, p.ej.) y la respuesta de gestionará más tarde 

Bloqueante y no-bloqueante

by Lemoncode

Sincronía y Asincronía

Sincrono

Asíncrono

by Lemoncode

Event loop (mono-hilo)

by Lemoncode

Event loop (mono-hilo)

Servidores

Multi Threaded Server

Los servidores modernos han cambiado hacia el modelo Asíncrono

No-bloqueante

Nodejs

Event Loop (Pattern)

Browser

Browser inside:

Sistema Operativo

Hardware

Asíncronas y no-bloqueantes

La petición devuelve inmediatamente el control para evitar el bloqueo del hilo de ejecución

  1. Se envía una notificación una vez que la operación se ha completado
  2. Es entonces cuando la función que procesará la respuesta (callback) se encola para ser ejecutada en algún momento en nuestra aplicación

HTTP (Req & Res)

fetch('/data')
.then(res => res.json())
.then(console.log)
.catch(err => throw err)

Questions

Thank U!

Explórate. Aprende. 

Escucha al mundo.

Y vuelve a aprender.

NOTAS!!!

Qué es la asincronía

Asincronía: se refiere a la existencia de eventos independientes del flujo principal del programa y a las formas de gestionar esos eventos.

 

Una forma clásica de gestionar la asincronía en un programa es con subrutinas (métodos, funciones) que retornan al origen de la llamada un objeto, generalmente llamado futuro o promesa, que representa los eventos que están sucediendo.

 

Asincronía - ejemplos

Llamada asíncrona procedural - Sistemas Operativos

Asynchronous Javascript XML - aplicaciones web

Asynchronous method dispatch - servidor

AJAX client

AJAX server

Conceptos básicos

Aplicaciones web

Server

Sistema Operativo - rol

  • Abstrae la complejidad del Hardware y gestiona recursos
  • Protege (memoria p.e.) y aisla

Sistema Operativo - rol

Añadir la parte del Browser como aplicación y de cómo se gestiona con el SO

Operaciones CPU | I/O

By LemonCode

Ops Síncronas/ Sec

Ops Asíncronas

⚠️ ⚠️ Bound === Limitaciones o Cuellos de botella

Programa y Procesos

Programa:

No es algo vivo hasta que se ejecuta, y se ejecuta en procesos.

Su lógica se puede ejecutar en secuencial o en paralelo.

Es sencillamente un conjunto de estructuras de datos y código.

Proceso:

Unidad mínima de ejecución de un SO (instance of an executing program). a.k.a. Tasks o Jobs

Tiene un flujo de control que ejecuta una instrucción tras otra.

Es el código que ejecuta al programa + conjunto de registros + contador de programa con instrucciones + pila o stack

Puede tener 1 o varios hilos de ejecución.

Procesos

2 instancias de ejecución de un programa de edición de texto

(p.ej. Word...) con dos estados diferentes

Procesos - ciclo de vida y estados

Estados: 

  • New/admission control o nuevo
  • En interrupción o idle o ready
  • En ejecución o running
  • Terminado en éxito o en error - exit

Modelos MultiHilo - Kernel y usuario

Check out this video: https://classroom.udacity.com/courses/ud923/lessons/3065538763/concepts/34341886380923

- One-to-One model

- Many-to-One model

- Many-to-Many model

Hilos o Threads

Proceso mono-hilo

Proceso multi-hilo

Process Control Block

Programa, Procesos e Hilos

Al ejecutarse, se crea(n) un hilo de ejecución que cruza el código y datos del programa haciendo uso de ello

Programa, Procesos e Hilos

  • Un programa puede tener muchos hilos de ejecución.
  • Se puede crear conflictos entre hilos de ejecución.
  • Pueden querer modificar los mismos datos, usar los mismos recursos, etc.
  • El SO es quien tiene que gestionar estos conflictos y resolverlos.

Programa, Procesos e Hilos

By Udacity

Programa, Procesos e Hilos - EJ.

Programas = Browser

Hilo = llamada al Servidor 📫

Hilo = pintar la UI 🧑‍🎨

En la práctica

Concurrencia y Paralelismo

Concurrencia

Concurrencia: que los hilos se ejecuten en un mismo entorno

Concurrencia se refiere a la habilidad de distintas partes de un programa, algoritmo, o problema de ser ejecutado en desorden o en orden parcial, sin afectar el resultado final

Concurrencia: control y coordinación de hilos

En el caso de hilos, al compartir el mismo entorno del proceso, dirección y datos, pueden darse conflictos y hay que solucionarlo

Exclusión mutua o Mutex: el acceso (a datos p.e.) se le concede a sólo a un hilo por turno.

 Se evita que entre más de un hilo a la vez en una sección crítica

Espera: se especifica a qué esperan antes de proceder. Se le notifica explícitamente cuándo proceder.

👇 Ambos son mecanismos de sincronización 👇

Concurrencia y Paralelismo

Concurrencia:

2 ó más procesos, hilos, etc, suceden progresivamente

No implica que sucedan al mismo tiempo

Técnica: las tareas se descomponen y entrelazan mientras comparten recursos

Paralelismo:

Técnica concurrente en la que 2 ó más procesos, hilos, etc se ejecutan a la vez

'Hijo de la concurrencia'

No se comparten recursos

👇

Sincronía y Asincronía

Operaciones en contexto I/O

Fase de espera: a que el sistema esté listo, los datos estén disponibles o que la operación se complete

Fase de ejecución: respuesta/siguiente acción con los datos recibidos

Bloqueante y no-bloqueante

Con respecto a cómo la fase de espera afecta a nuestro programa:

Bloqueante: llamada/operación que no devuelve el control a nuestra aplicación hasta que no ha terminado y el thread queda bloqueado en estado de espera.

No-bloqueante: devuelve el control indep. de si ha terminado.

Si se completa: devuelve los datos,

Si no se completa: devuelve un mensaje de error

Asincronía: se refiere a la existencia de eventos independientes del flujo principal del programa y a las formas de gestionar esos eventos.

 

Una forma clásica de gestionar la asincronía en un programa es con subrutinas (métodos, funciones) que retornan al origen de la llamada un objeto, generalmente llamado futuro o promesa, que representa los eventos que están sucediendo.

 

Sincronía y Asincronía

Sincronía: operación I/O que se produce de forma secuencial. Esperamos a que termine para procesar el resultado.

Se le considera bloqueante.

Asincronía: la finalización de la op. se señaliza 'más tarde', con un callback, promesa o evento.

Ayuda a que la respuesta sea gestionada 'en diferido'.

Devuelve el control inmediatamente, por lo que se le considera 'no-bloqueante'.

Sincronía y Asincronía

Processing...

Sincronía y Asincronía

(A)sincronía en Lenguajes

Origen:

Interacción con usuario web, ejecución en browsers y peticiones de datos a servidor

  • Modelo asíncrono y no-bloqueante para ops. I/O
  • Loop de eventos
  • Single thread