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

我是node.js的新手 目前我正在阅读由Basarat Ali Syed撰写的Beignning Node.js ”。

以下是摘录自传统Web服务器线程池的缺点:

大多数Web服务器使用线程池这种方法几年前,许多继续使用今天。 但是,这种方法不是没有缺点。 线程之间的内存浪费了。 另外,操作系统需要在线程之间进行上下文切换(即使它们处于空闲状态),这会导致浪费CPU资源。

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

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

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

上下文切换是指操作系统需要运行更多的线程而不是CPU核心。 比如说你有10个线程。 他们都很忙(这意味着他们没有完成任务)。 但是你的CPU只是一个双核CPU(为简单起见,不要考虑超线程)。 那么,10个线程怎么能运行呢? 这是不可能的!!

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

术语“上下文切换”是指当操作系统需要将CPU提供给另一个线程/进程时,它需要将寄存器中的所有值临时复制到该线程的内存中,否则另一个进程/线程将会混淆切换线程恢复时。 操作系统也将需要重新虚拟内存表,以便两个进程不会混淆对方的内存。 这个操作是多么昂贵取决于CPU架构。 Sparc等一些体系结构针对上下文切换进行了优化。 超线程是一种在硬件中实现上下文切换的function,因此速度更快(但是,如果在Intel / AMD64架构上实现超线程,则每个CPU只能获得一个额外的上下文)。

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

但是,现在很难find一个单核CPU。 您希望运行的理想线程数等于您拥有的内核数。 这样做也会避免上下文切换。 但即便如此,让一个复杂的multithreading程序运行起来并不容易。 让一个非阻塞的单线程程序更容易运行。 而在大多数Web应用程序中,multithreading程序与非阻塞单线程程序相比没有任何优势,因为它们都是I / O绑定的。

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

Interesting Posts