我有一个关于服务器节点操作系统的问题
当请求发送到我们的 HTTP 服务器时
第一个问题:这个请求是新连接还是新进程还是新线程?
第二个问题:事件循环是用来管理异步任务的,它如何找出这个执行的任务与哪个请求相关?
我的意思是如果发送了很多请求
这些请求的结果如何发送给每个人
我认为应该有一个部分来将每个新请求的 ID 与其在 JavaScript 引擎中的任务进行映射
我期望在操作系统中的某个地方或在 javascript 中的某个地方
指定与哪个 ID 的请求相关的执行任务
当传入请求到达您的服务器时,它由操作系统级别(在 TCP 堆栈中)的侦听对象进行处理。因此,在操作系统级别,这会导致创建一个新套接字,该套接字代表客户端和服务器之间的双向 TCP 连接。该套接字本质上是标识两个端点之间特定连接的 ID。
同时,nodejs 进程中的监听对象会收到其 http 服务器上有一个新连接的通知。这会通过 Nodejs 事件队列,其中事件队列的特定阶段会检查这些传入通知,如果找到,则调用该通知的 Javascript 回调侦听器。此时,它只是在nodejs中运行正常的Javascript。
第一个问题:这个请求是新连接还是新进程还是新线程?
创建新连接的初始部分是在操作系统内完成的,这实际上取决于操作系统如何做到这一点。它可能使用操作系统内的一些线程(TCP 堆栈内),但不会为每个传入连接创建新线程。
然后,传入连接由nodejs事件循环的特定阶段处理,该阶段不使用新线程,也不为传入连接创建线程。传入连接仅由 NodeJS 事件循环的正常操作进行处理,并且它从事件循环中调用来处理此事件的 Javascript 回调只是在解释器的单个 Javascript 线程中运行的正常 Javascript 回调。
第二个问题:事件循环是用来管理异步任务的,它如何找出这个执行的任务与哪个请求相关?
操作系统中的网络堆栈创建一个套接字对象,该对象唯一标识两个端点之间的特定连接。 Nodejs 中的 TCP 库使用该套接字对象。它被包装到 HTTP 库使用的 NodeJS 套接字对象中。当流量到达该套接字或发送到该套接字时,它使用 TCP 套接字对象作为标识符,以便底层 TCP 堆栈知道将数据发送到哪个端点或传入数据来自哪个端点。
这些请求的结果如何发送给每个人 我认为应该有一个部分来将每个新请求的 ID 与其在 JavaScript 引擎中的任务进行映射
操作系统中的 TCP 堆栈知道如何使用它创建的套接字对象来了解该套接字属于哪些端点、连接处于什么状态、它有什么设置、为其缓冲什么流量等等...
我期望在操作系统中的某个地方或在 javascript 中的某个地方
在操作系统 TCP 堆栈的本机代码中。