Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript NodeJS:理解非阻塞/事件队列/单线程_Javascript_Node.js_Processor_Single Threaded - Fatal编程技术网

Javascript NodeJS:理解非阻塞/事件队列/单线程

Javascript NodeJS:理解非阻塞/事件队列/单线程,javascript,node.js,processor,single-threaded,Javascript,Node.js,Processor,Single Threaded,我是Node的新手,尝试了解Node的非阻塞特性。 在下图中,我创建了一个请求的高级图表 据我所知,单个应用程序的单个用户的所有进程都在单个线程上运行。 我想了解的是事件循环的逻辑如何适合这个图。事件循环是否与指令排队的处理器管道相同? 想象一下,我们将一个应用程序页面加载到RAM中,创建一个流供程序读取: readstream.on('data', function(data) {}); 创建读取流并等待数据发生的指令:此指令是否“挂起”在处理器的寄存器中(等待I/O完成),而在多线程环

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

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

readstream.on('data', function(data) {}); 
创建读取流并等待数据发生的指令:此指令是否“挂起”在处理器的寄存器中(等待I/O完成),而在多线程环境中,处理器只是在上一个I/O请求的结果返回到RAM之前不从RAM获取新指令?
还是我认为这完全/部分是错误的

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


我不熟悉这种细节,所以如果这个问题对你来说不完全有意义,请原谅。但在前进之前,理解这一点似乎对我至关重要

线程和I/O与操作系统实现和服务有关,而与CPU体系结构无关

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

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


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

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

不幸的是,几乎所有这一切都是错误的;这完全是错的。事件循环与CPU体系结构无关——根本没有关系。这些概念是完全不相关的。嗯,我觉得这是一个很难把握的概念,因为我是新来的。我读到的好处是关于单线程,它与从RAM中获取指令的方式有关。当执行指令并等待导入数据时,指令必须在某个地方等待执行和关闭,不是吗?如果指令处理器的管道不相关,则为Ok。但我找不到一些可读的文档,在那里可以更详细地了解这一点,从而进一步帮助我。一些答案会有帮助。谢谢。线程与CPU架构也没有太大关系。Node是一个JavaScript系统,其工作方式与CPU体系结构的细节相去甚远。重要的是操作系统如何工作,因为这是直接涉及的,而不是RAM或指令管道。@Pointy我很困惑。。。我读到的关于进程/线程的大部分内容都与处理器有关,以及在切换以使多个线程看起来同时执行时管理多个线程的方式。这是node没有的,这是我想理解的。我会看得更远。对不起,如果这个问题是愚蠢的,也许我看到了你在这个主题上做了更多的研究后所看到的。哦,好吧,我完全不知道操作系统是这样做的,它是如何工作的!感谢您的澄清,现在有意义了。非常感谢。我不知道这发生在操作系统级别,但仔细想想,这是合乎逻辑的。