节点JS单线程Vmultithreading(CPU利用率:有什么区别?)

最近我已经开始阅读关于Node的很多东西了,从差异化的angular度来看,我不能清楚地理解的是,asynchronous与同步调用如何处理I / O的真正区别。

据我所知,在一个multithreading的同步环境中,如果启动I / O,正在运行的线程将被抢占,并返回到等待状态。所以基本上这与NodeJSasynchronousI / O调用发生的情况相同。 在Node JS中,当I / O被调用时,I / O操作被移出当前正在运行的线程,并被发送到事件解复用器以完成和通知。 只要I / O完成,callback方法将被推送到事件队列以进一步处理。

所以,我看到的唯一区别是在节点JS我们节省内存(由于每个线程拥有多个调用堆栈)和CPU(由于没有上下文切换保存)。 如果我只是考虑有足够的内存来购买,那么仅仅由于上下文切换而节省CPU是否会造成巨大的性能差异?

如果我的上述理解是不正确的,那么Java线程Vs Node JS的I / O处理如何保持CPU繁忙并且不浪费CPU周期。我们是否仅使用Node JS节约了上下文切换CPU周期,更多的呢?

基于这些回应,我想补充一个场景:

请求A,请求B同时来到J2ee服务器。 每个请求在这个multithreading环境中需要10ms才能完成。在10ms的时间内,执行代码逻辑需要5ms的时间来计算一些逻辑,并且在I / O中花费5ms来从DBMS中提取大的数据集。调用DBMS是代码的最后一行,然后将响应发送到客户端。

如果同一个应用程序转换为节点JS应用程序,则可能发生这种情况

  1. 请求A来,5毫秒用于处理请求。

  2. DBMS调用是从代码中调用的,但是它不是阻塞的。所以一个callback方法被推送到事件队列。

  3. 在5ms之后,请求B被服务,并且再次请求B被推送到事件队列以用于I / O完成。请求B需要5ms的处理。
  4. 事件循环运行,请求A的pickupscallback处理程序,然后将响应发送到客户端。因此,响应在10 ms后发送,因为Req A和Req B都需要5 ms用于同步代码块处理。

现在在这种情况下保存的时间在哪里?除了上下文切换和创build2个线程。 需求A和需求B无论如何都花了10毫秒与节点JS。 ?

据我所知,在一个multithreading的同步环境中,如果I / O被启动,正在运行的线程被抢占,并回到等待状态。 所以基本上这和NodeJSasynchronousI / O调用发生的一样

不,在NodeJS中,一个asynchronousI / O调用是一个非阻塞的I / O。 这意味着一旦线程进行I / O调用,它就不会等待I / O完成,并继续执行下一个语句/任务。

一旦I / O完成,它将从事件循环队列中接收下一个任务,并最终执行在进行I / O调用时给予的callback处理程序。

如果我只是考虑有足够的内存来购买,那么仅仅由于上下文切换而节省CPU是否会造成巨大的性能差异?

除此之外,这两件事也是拯救

  • 不必等待I / O完成
  • 由于线程数量有限,因此不能生成线程,所以系统的容量不受多less线程的限制。

除了上下文切换和创build2个线程。 需求A和需求B无论如何都花了10毫秒与节点JS。 ?

你在这里打折一件事 – 线程在一个特定的时间间隔后一个接一个地获得两个请求。 所以如果一个线程需要10秒钟,那么执行第二个请求需要一个新的线程。 把这个扩展到数以千计的请求,你的操作系统必须使数千个线程处理这么多的并发用户。 参考这个比喻 。