Como sabemos, JS usa el bucle de eventos para simular subprocesos múltiples en un solo subproceso. Estoy confundido acerca de su eficiencia.
Supongamos que queremos leer un archivo y hay una manera de usar la función de sistema de read de Linux. Según mi conocimiento, mientras se ejecuta la función de read , la CPU enviará el trabajo a DMA para que la CPU pueda hacer otras cosas.
En otros lenguajes reales de subprocesos múltiples como C++, creamos un nuevo subproceso para leer el archivo. Mientras DMA está procesando el archivo, la CPU realmente puede cambiar de ese hilo de lectura de archivos para hacer otros trabajos.
Pero en JS, solo hay un hilo que realmente funciona. Incluso ahora guarda este trabajo de lectura de archivos, pero en el futuro debe hacer ese trabajo en este hilo. Cada vez que desee llamar a la función de read , ya debe estar en la pila del subproceso, aunque la CPU puede dejar el trabajo en DMA, el subproceso todavía está bloqueando allí y no puede saltar a otro subproceso (porque solo hay un subproceso, ¿verdad?)
Entonces, creo que el modelo de bucle de eventos de JS no es realmente concurrencia, ¿verdad? A pesar de que puede guardar el trabajo temporalmente, todavía necesita la misma cantidad de tiempo para ocuparse del trabajo. El tiempo total de ejecución no se reduce. Estoy confundido y ayúdenme por favor.
Puede ejecutar subprocesos múltiples reales en javascript utilizando trabajadores web. No puede simular subprocesos múltiples en un entorno de un solo subproceso. Asíncrono y subprocesos múltiples no son lo mismo. Puede ejecutar async en javascript pero no subprocesos múltiples (sin WebWorkers).
Incluso si JavaScript fuera de subproceso único (que ya no es gracias a Web Workers), podría pedirle al sistema operativo que realice muchas operaciones de E/S al mismo tiempo:
En lugar de usar E/S de bloqueo, donde le pedimos al sistema operativo que ponga el subproceso en reposo hasta que los datos estén aquí, podemos usar E/S sin bloqueo, donde le pedimos al sistema operativo que obtenga datos y nos notifique cuando esté aquí. , permitiéndonos hacer otras cosas mientras tanto.
Por ejemplo, en la API del sistema de archivos node.js, cada función existe en varios tipos:
por lo que podemos elegir si deseamos dormir hasta que los datos estén aquí, o hacer otras cosas en ese momento.
Vale la pena señalar que el hardware real no bloquea. Por ejemplo, Direct Memory Access permite que un disco coloque datos en la memoria sin involucrar una CPU e interrumpa la CPU una vez que se completa la transferencia.