【问题标题】:NodeJS: understanding nonblocking / event queue / single threadNodeJS:理解非阻塞/事件队列/单线程
【发布时间】:2015-02-25 16:36:29
【问题描述】:

我是 Node 新手,并尝试了解 Node 的非阻塞性质。
在下图中,我创建了请求的高级图表。

据我了解,来自单个用户的单个应用程序的所有进程都在单个线程上运行。
我想了解的是事件循环的逻辑如何适合这个图表。事件循环是否与指令排队的处理器管道相同?
想象一下,我们将一个应用页面加载到 RAM 中,该页面创建一个流以供程序读取:

readstream.on('data', function(data) {}); 

创建读取流和等待数据发生的指令:该指令是否“挂起”在处理器的寄存器中(等待 I/O 完成),而在多线程环境中,处理器只是不占用直到前一个 I/O 请求的结果返回到 RAM 之前从 RAM 中获取新指令?
还是我认为这完全/部分错误的方式?

只是一个补充(相关的,也许是愚蠢的)问题:在服务器上的不同线程上运行不同的用户,单线程的好处不是只对单个用户有用吗?

我对这种类型的细节不熟悉,如果这个问题对你来说不完全有意义,请原谅。但在继续前进之前,理解这一点对我来说似乎是必不可少的。

【问题讨论】:

  • 不幸的是,关于这件事的几乎所有事情都是错误的。
  • 很难说清楚;从字面上看,这完全是错误的。事件循环与 CPU 架构无关——完全没有关系。这些概念完全不相关。
  • 嗯,我觉得这是一个很难掌握的概念,因为我是新手。我读到好处是关于单线程,这与从 RAM 中获取指令的方式有关。当指令执行并等待数据导入时,指令必须在某个地方等待执行和关闭,不是吗?好的,如果指令处理器的管道不相关。但是我找不到一些可读的文档来更详细地了解这一点,以进一步帮助我。一些答案会有所帮助。谢谢。
  • 线程与 CPU 架构也没有太大关系。 Node 是一个 JavaScript 系统,它的工作方式与 CPU 架构的细节相去甚远。重要的是操作系统如何工作,因为这是直接涉及的,而不是 RAM 或指令管道。
  • @Pointy 我很困惑......我读到的关于进程/线程的大部分内容都与处理器有关,以及在切换以使它们看起来同时执行时多个线程的管理方式。这是节点没有的,这是我想了解的。我会进一步看。对不起,如果这个问题很愚蠢,也许我在对该主题进行更多研究时看到了你所看到的。

标签: javascript node.js processor single-threaded


【解决方案1】:

事件驱动的非阻塞 I/O 依赖于现代操作系统具有在 O/S 级别执行轮询(不浪费 CPU 周期)的“选择”方法这一事实。 select 方法允许您为某些 I/O 事件注册回调。这往往比启用线程的语言中常用的“每个连接线程”模型更有效。有关更多信息,请在 Unix/Linux 操作系统上执行“人工选择”。

【讨论】:

  • 非常感谢。我不知道这发生在操作系统级别,但仔细想想,这只是合乎逻辑的。
【解决方案2】:

线程和 I/O 与操作系统实现和服务有关,而不是 CPU 架构。

涉及任何类型的输入/输出设备(大容量存储、网络、串行端口等)的操作被构造为从 CPU 到外部设备的请求,通过几种可能的机制中的一种,这些请求稍后会得到满足。

除此之外,操作系统还提供了替代的编程模型。在一个模型中,输入/输出操作的实际性质本质上是伪装的,因此执行的程序被赋予了一个看起来是同步的 API。在C程序中,调用write()系统调用会导致整个进程延迟到操作完成。

另一种编程模型更接近地揭示了系统的异步现实。这就是 Node 使用的。操作系统提供了启动长时间异步操作的方法,以及进程检查结果或阻塞并等待结果的方法。在 Node 中,运行时系统可以处理许多单独的操作,因为整个模型基于响应事件而运行的代码。事件可以是合成的事物(例如最初加载和运行的 Node 模块的“事件”),也可以是实际异步外部事件的结果。在输入/输出操作的情况下,Node 运行时等待操作系统通知并将其转换为导致某些 JavaScript 代码运行的事件。

【讨论】:

  • 哦,好吧,我完全不知道这就是操作系统正在做的事情以及它是如何工作的!感谢澄清,现在说得通了。
猜你喜欢
  • 2019-02-12
  • 2014-10-16
  • 2017-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-06
  • 2015-08-12
  • 1970-01-01
相关资源
最近更新 更多