Node.js单线程VS Tranditonal webserver线程池

时间:2015-10-13 06:13:53

标签: node.js threadpool context-switch single-threaded

我是node.js的新手。我目前正在阅读 Basarat Ali Syed 中名为“ Beignning Node.js ”的书。

以下摘录说明了传统Web服务器线程池的缺点:

  

大多数Web服务器使用线程池       几年前的方法和许多今天继续使用。然而,       这种方法并非没有缺点。再次浪费RAM       线程之间。 OS还需要在线程之间切换上下文       (即使它们处于空闲状态),这也会导致CPU资源浪费。

我不太明白为什么线程池内的线程之间有上下文切换。据我所知,一个线程将在任务期间持续。一旦任务完成,线程就可以自由接收下一个任务。

所以我的 Q1 :为什么需要上下文切换?线程之间何时会发生上下文切换?

我的 Q2 :为什么node.js不使用多个线程来处理事件队列中的事件?是不是更有效率,减少事件的排队时间?

1 个答案:

答案 0 :(得分:1)

上下文切换是指操作系统需要运行的线程多于CPU内核。比方说,你有10个线程。他们都很忙(意思是他们都没有完成任务)。但是你的CPU只是一个双核CPU(假设没有简单的超线程)。那么,所有10个线程如何运行?这是不可能的!!

答案是上下文切换。当提供大量进程和要执行的线程时,操作系统将为每个线程分配一定的时间来运行。在此之后,操作系统将切换到另一个线程,以便所有线程都有一些时间来使用CPU。

术语"上下文切换"指的是当操作系统需要将CPU提供给另一个线程/进程时,需要将寄存器中的所有值临时复制到该线程的内存中,否则其他进程/线程将搞乱切换的计算线程恢复时。操作系统还需要重新指向虚拟内存表,以便两个进程不会混淆彼此的内存。此操作的成本有多高取决于CPU架构。像Sparc这样的一些架构针对上下文切换进行了优化。超线程是一种在硬件中实现上下文切换的功能,因此速度更快(但是,在英特尔/ AMD64架构上实现的超线程每个CPU只能获得一个额外的上下文)。

完全不使用多线程可以避免上下文切换。特别是如果你的程序是唯一运行的程序。因此,在单核CPU上,非阻塞的单线程程序通常可以击败多线程程序。

然而,如今找到单核CPU很少见。您想要运行的理想线程数等于您拥有的核心数。这样做也可以避免上下文切换。但即便如此,让复杂的多线程程序快速运行并不容易。让非阻塞单线程程序快速运行变得更容易。在大多数Web应用程序中,多线程程序与非阻塞单线程程序相比没有任何优势,因为它们都是I / O绑定的。

非阻塞单线程程序基本上是使用事件在用户空间中实现类似线程的行为。这有时被称为"绿线"在支持语法的语言中,使面向事件的编程看起来像多线程编程。