Node.JS内核模式线程

7vux5j2d  于 2023-01-08  发布在  Node.js
关注(0)|答案(1)|浏览(111)

我试图弄清楚Node.JS(Windows版本)是如何在幕后工作的。
我知道有用户模式线程和内核模式线程,并且我知道处理模型看起来像这样:

我还知道从内核模式线程移动到用户模式线程被认为是上下文切换。
Node.JS C++非阻塞工作线程是内核模式的吗?单事件循环线程在内核模式还是用户模式下的哪个位置?

rdlzhqv9

rdlzhqv91#

正如你所知道的,node.js有一个单线程架构,JavaScript环境和事件循环只由一个线程管理,内部所有其他线程都由一个C级别的线程池处理(就像异步I/O由libuv线程处理一样)。
为了回答您的问题,这些node.js C
非阻塞工作线程不是内核模式的,它们是用户模式的。事件循环线程也是用户模式的。这些线程在需要时请求内核模式。
当中央处理器处于核心模式时,假定它正在执行可信任的软件。核心模式是最高的特权等级,代码对所有设备有完全的访问权。在 windows 中,只有 windows 开发人员编写的选定文件才能完全在核心模式下运行。所有用户模式软件必须通过系统调用请求使用核心,以便执行特权指令,如进程创建或I/O操作。
所有的进程都是从用户模式开始执行的,只有在获得内核提供的服务时才切换到内核模式。这种模式的改变称为模式切换,而不是上下文切换,上下文切换是CPU从一个进程切换到另一个进程。
我希望您能够清楚地了解,即使是用户模式线程也可以通过系统调用执行特权操作(网络访问),并在完成所需任务后返回到用户模式。
来源:http://www.linfo.org/kernel_mode.html

更新

我应该提到模式切换并不总是意味着上下文切换。
当在操作系统中需要用户模式和内核模式之间的转换时,上下文切换是不必要的;模式转换本身不是上下文切换。2然而,取决于操作系统,上下文切换也可能在此时发生。
你提到的模式切换会导致上下文切换也是正确的。但它并不总是发生。每当模式切换发生时,上下文切换(严重的性能损失)是不可取的。Windows内部发生了什么很难说,但最有可能的是模式切换并不总是导致上下文切换。
关于一对一的线程模型,Windows和Linux都遵循这一点。因此,给定每个用户线程(如node.js事件循环线程),操作系统提供一个内核线程,负责系统调用。node.js只能通过系统调用调用模式切换。上下文切换仅由内核(线程调度程序)控制。

更新2

是的,HTTP.SYS在内核模式下执行。但它还有更多功能。Node.js没有很多线程,因此线程之间的上下文切换较少,这与IIS不同。(模式切换)在HTTP.SYS中肯定更少了,这是对过去的改进(这碰巧是一场灾难),参见here。由于多线程而引起的上下文切换远远不止使用HTTP.SYS减少上下文切换。因此,总体节点。JS具有较少的上下文切换。
与node自己的HTTP实现相比,HTTP.SYS还有其他一些优点,这有助于IIS。(将来)可能会从node本身使用HTTP.SYS来利用这些优点。但目前,我不认为HTTP.SYS/IIS与node.js有任何竞争。

相关问题