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
- Se envía una notificación una vez que la operación se ha completado
- 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
Asynchrony from the Roots 🤟🕸
By Teba Gómez
Asynchrony from the Roots 🤟🕸
Talk @WomenTechMakers Madrid event 7th March 2020
- 736