node.js - 当同步 I/O 调用尚未返回时 CPU 正在做什么

标签 node.js api operating-system

CPU 是否持续检查某些状态以查看 I/O 调用是否返回?

我问这个问题只是因为我想了解为什么异步模式服务器(如nodejs)可以处理更多并发请求。

如果在同步 I/O 调用未返回时 CPU 只是空闲,那么服务器可以启动一个新线程来处理新请求,因为它仍然有足够的 CPU 资源。

最佳答案

如果您执行同步 I/O,那么您的进程(或线程)将被阻塞,直到操作完成。这就是为什么它被称为同步。这段时间内CPU在做什么?为其他进程提供服务。就像大多数现代操作系统"dispatch"多个进程的工作一样,即使作业数量多于处理器,它们也不会被完全剥夺,当 I/O 导致进程不再可运行时,就会发生调度。如果没有可用的可运行进程,处理器可以闲置一段时间。

异步(又名非阻塞、事件)I/O 是不同的。在那里,在单个进程中,您可以在等待 I/O 事件的同时执行更多工作。这就像您在自己的进程中安排工作,而不是根据操作系统来选择等待 I/O 时要执行的工作。 Node.js 可以处理许多并发连接,因为所有 I/O 都是以非阻塞模式完成的,因此单个 Node.js 进程可以实现单个处理器核心的高利用率,并且永远不会卡在等待任何事情(除了当然,这是真正受 CPU 限制的计算,但大多数 Node.js 程序都没有太多这样的计算)。

关于node.js - 当同步 I/O 调用尚未返回时 CPU 正在做什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25699234/

相关文章:

c++ - 使用 MySQL C API 和 C++ 获取 MySQL 数据库表中的行

ruby - *nix 是什么意思?

java - 如何使用Java获取操作系统级别信息?

javascript - 批量 REST API POST 处理

node.js - 对 jsx 的 React 文件命名约定

c# - 如何从 Visual Studio 中的 Swagger 文件更新 REST API 客户端

assembly - 在引导加载程序中将 SS 寄存器设置为 0 时 CPU 复位 (CPU 0) 和三重故障

node.js - AWS-DocumentDB 不支持 $lookup 运算符,AWS-DocumentDB 中 $lookup 的任何替代方案

javascript - 无法读取未定义的属性 'undefined',但我确定 var 是有效的

c - C 中的 JSON 解析器技巧