Node.js se basa en varias dependencias bajo el capó para proporcionar varias funciones.
- V8
- libuv
- llhttp
- c-ares
- OpenSSL
Libuv es uno de ellos, analicemos libuv en detalle.
libuv: libuv es una biblioteca C escrita originalmente para Node.js para abstraer operaciones de E/S sin bloqueo .
- El modelo de E/S asíncrona controlada por eventos está integrado.
- Permite que la CPU y otros recursos se utilicen simultáneamente mientras se siguen realizando operaciones de E/S, lo que resulta en un uso eficiente de los recursos y la red.
- Facilita un enfoque basado en eventos en el que la E/S y otras actividades se realizan mediante notificaciones basadas en devolución de llamadas.
Ejemplo: si un programa está consultando la base de datos, la CPU permanece inactiva hasta que se procesa la consulta y el programa se detiene, lo que provoca el desperdicio de recursos del sistema. Para evitar esto, se usa libuv en Node.js, lo que facilita una E/S sin bloqueo.
También tiene mecanismos para manejar servicios como sistema de archivos , DNS , red, procesos secundarios , canalizaciones, manejo de señales , sondeo y transmisión .
Para realizar operaciones de bloqueo que no se pueden realizar de forma asíncrona a nivel del sistema operativo, libuv también incluye un grupo de subprocesos para distribuir las cargas de la CPU.
- ¿Qué es un grupo de subprocesos?
Libuv asigna tareas a un grupo de subprocesos de trabajo. Sin embargo, todas las devoluciones de llamada que se producen al finalizar la tarea se ejecutan en el subproceso principal.
Nota: Después de Node 10.5, los subprocesos de trabajo también se pueden usar para ejecutar JavaScript en paralelo. Libuv usa 4 hilos por defecto, pero se puede cambiar usando UV_THREADPOOL_SIZE
process.env.UV_THREADPOOL_SIZE = 5
Características de libuv:
- Bucle de eventos completo respaldado por epoll (Linux), kqueue (OSX), IOCP (Windows), puertos de eventos (SunOS).
- TCP asíncrono (módulo de red) y UDP (módulo de programa)
- Resolución DNS asíncrona (utilizada en parte para el módulo dns)
- Archivo asíncrono, operaciones y eventos del sistema de archivos (módulo fs)
- Código de escape ANSI controlado TTY
- Grupo de subprocesos y manejo de señales
- Procesos secundarios
- Reloj de alta resolución
- Primitivas de enhebrado y sincronización.
- Comunicación entre procesos mediante sockets y sockets de dominio Unix (Windows)
Evento o bucle de E/S: el bucle de evento o E/S utiliza un enfoque de E/S asíncrono de un solo subproceso , por lo tanto, está vinculado a un solo subproceso. Para ejecutar múltiples bucles de eventos, cada uno de estos bucles de eventos debe ejecutarse en un subproceso diferente . No es seguro para subprocesos de forma predeterminada, con algunas excepciones.
Libuv mantiene una cola de eventos y un demultiplexor de eventos . El bucle escucha las E/S entrantes y emite un evento para cada solicitud. Luego, las requests se asignan a un controlador específico (depende del sistema operativo). Después de una ejecución exitosa, la devolución de llamada registrada se pone en cola en la cola de eventos que se ejecutan continuamente uno por uno.
Nota: libuv almacena en caché el tiempo actual requerido durante todo el proceso al comienzo de cada iteración del ciclo para minimizar las llamadas frecuentes al sistema.
Ejemplo: si se realiza una solicitud de red, se registra una devolución de llamada para esa solicitud y la tarea se asigna al controlador. Hasta que se realiza, continúan otras operaciones. En una ejecución/terminación exitosa, la devolución de llamada registrada se pone en cola en la cola de eventos que luego ejecuta el subproceso principal después de la ejecución de las devoluciones de llamada anteriores ya presentes en la cola.
Utiliza mecanismos específicos de plataforma como se mencionó anteriormente para lograr la mejor compatibilidad y rendimiento epoll (Linux), kqueue (OSX), IOCP (Windows), puertos de eventos (SunOS).
E/S de archivos: la E/S de archivos se implementa en libuv utilizando un grupo de subprocesos global en el que todos los bucles pueden funcionar en cola. Permite utilizar el disco de forma asincrónica abstracta. Desglosa operaciones complejas en operaciones más simples para facilitar un comportamiento similar al asincrónico .
Ejemplo: si el programa indica que se escriba un búfer en un archivo específico, en situaciones normales, la E/S se bloqueará hasta que la operación sea exitosa o finalice. Sin embargo, libuv abstrae esto de manera asíncrona al colocar una notificación de evento que notificaría sobre el éxito/fallo de las operaciones una vez finalizadas, hasta que las otras operaciones de E/S se puedan realizar sin problemas.
Nota: libuv no garantiza la seguridad de subprocesos (con algunas excepciones)
A diferencia del bucle de eventos, la E/S de archivos utiliza mecanismos independientes de la plataforma. Hay 3 tipos de API de disco asíncrono que maneja File I/O:
- linux AIO (compatible con kernel)
- posix AIO (compatible con linux, BSD, Mac OS X, solaris, AIX, etc.)
- E/S superpuestas de Windows
Beneficios:
- Las operaciones de disco se realizan de forma asíncrona.
- Las operaciones de alto nivel se pueden dividir en operaciones de disco más simples que facilitan la rectificación de la información.
- El subproceso del disco puede usar operaciones vectoriales como readv y writev, lo que permite pasar más búferes.
Referencia: http://docs.libuv.org/en/v1.x/design.html
Publicación traducida automáticamente
Artículo escrito por omkarphansopkar y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA