temporizador node loop guide event docs javascript linux node.js io libuv

javascript - loop - node js temporizador



Confusión sobre el mecanismo de E/S asíncrono interno de node.js (2)

  1. En primer lugar, libuv ha eliminado el libeio de él. Pero sí realiza la E / S de archivos asíncronos con un grupo de subprocesos como libeio tal como mencionó.

  2. libuv también elimina libev . Realiza la E / S de red asíncrona basada en las interfaces de E / S asíncronas en diferentes plataformas, como epoll , kqueue e IOCP , sin un grupo de subprocesos. Hay un bucle de eventos que se ejecuta en el hilo principal de uv que sondea los eventos de E / S y los procesa.

  3. El grupo de subprocesos dentro de libuv es un grupo de subprocesos de tamaño fijo ( 4 en uinx como sistema ). Realiza una función de cola de tareas y evita el agotamiento de los recursos del sistema al generar subprocesos indefinidamente cuando aumentan las solicitudes.

  1. He aprendido que node.js usa libeio internamente para realizar E / S asíncrona de archivos , con grupo de subprocesos, en la plataforma * nix, ¿verdad?
  2. ¿Qué pasa con la red I / O asíncrona? ¿Es hecho por libev? ¿Hay también un grupo de hilos?
  3. Si hay un grupo de subprocesos dentro, ¿cómo podría ser más eficiente que el modelo tradicional de un subproceso por solicitud? ¿Y es un hilo por solicitud de E / S?
  4. ¿Y cuál es el mecanismo en las ventanas? Sé que lo ha hecho IOCP, y hay un grupo de subprocesos a nivel del kernel, ¿verdad?
  5. ¿Por qué Linux todavía no tiene un mecanismo AIO completamente nativo como Windows IOCP? ¿Tendrá en el futuro?

Actualización de acuerdo a la respuesta de changchang:

  1. Tomé una vista rápida del código fuente que @changchang le di, encontré que el tamaño de grupo de subprocesos predeterminado se puede restablecer mediante UV_THREADPOOL_SIZE . Me pregunto en qué caso se usará esto.
  2. También encontré que getaddrinfo usa este grupo de subprocesos, ¿hay algo más excepto fs? Y si todos los trabajos de sincronización se realizarán en este grupo de subprocesos, ¿es el tamaño predeterminado ''4'' suficiente?
  3. Como entiendo ahora, habrá 6 subprocesos básicos en el proceso node.js: 1 subproceso V8 (bucle de eventos, donde se ejecutan los códigos javascript del usuario), 1 bucle de eventos libuv y 4 en el grupo de subprocesos, ¿verdad?
  4. ¿Y cómo puedo ver estos hilos en mi shell (Ubuntu)? Yo uso ps -eLf | nodo grep | grep -v grep solo vio dos:

    raíz 16148 7492 16148 0 2 20:43 pts / 26 00:00:00 ./bin/node /home/aaron/workspace/test.js
    raíz 16148 7492 16149 0 2 20:43 pts / 26 00:00:00 ./bin/node /home/aaron/workspace/test.js


El nodo de la versión 0.6 de Uptil usó libev para ejecutar el bucle de libeio y libeio para la E / S asíncrona (el back-end de Unix se encuentra en gran medida en estas dos bibliotecas). Pero libuv ha comenzado a reemplazar libeio y libeio en la versión 0.8 . Realiza, mantiene y gestiona todos los eventos y eventos en el grupo de eventos. libuv es la opción en bibliotecas de E / S asíncronas multiplataforma.

  1. Sí, hasta el nodo 0.6, obsoleto en 0.8 y utiliza el conjunto de subprocesos
  2. Sí, pero libev no utiliza grupo de subprocesos. Ver here

    Aclaración: De acuerdo con el link en la question que libeio , libeio admite todas las funciones POSIX relacionadas con la E / S (que incluye socket). Pero el autor del nodo decidió usarlo solo para la E / S de archivos asíncronos, y usa libev para la E / S de la red. No sé de dónde lo escuchaste, pero puedes usar epoll en archivos normales.

  3. libev utiliza el bucle de eventos, así que no hay problemas aquí.

  4. Sí, IOCP maneja la E / S asíncrona en Windows, el kernel usa grupos de subprocesos.
  5. El nuevo kernel de Linux tiene epoll, kqueue en el nuevo kernel BSD. libeio y libeio eran para el entorno de Linux y proporcionan un bucle / asíncrono de eventos IO para todo el kernel (admite select, poll, epoll, kqueue).

Preguntas de actualización:

  1. no se mucho sobre libuv
  2. tal vez suficiente (no sé)
  3. Aquí están mis hallazgos en Windows 8, lo verifiqué a través de Process Explorer. Mostró 4 hilos, 1 DLL, 1 archivo y 1 sección (un total de 7 entradas) para un proceso de aplicación de nodo.

  4. ps -eLf muestra todos los subprocesos y procesos, quizás esté sobre-filtrando, solo busque el nodo de proceso pid como ps -eLf | grep x ps -eLf | grep x donde x es pid para el proceso de nodo.