我可以通过多种方式提出这个问题。假设我们有一个单核 CPU,操作系统在其上运行两个进程。进程1是一个Node应用程序,进程2我们不关心。鉴于只有一个核心,两个进程必须共享对其的访问,这意味着大约一半的时间,每个进程都不会执行。
现在,如果我们在进程 1 中调用
setTimeout(callback, 1000)
,回调是否会在 1000(现实世界)毫秒后执行,还是会在进程 1 尚未执行的时间里出现一些未计算的延迟?
如果没有额外的延迟,事件循环如何知道何时准确返回回调?这是否意味着事件循环直接使用 CPU 时钟来调度事件,而不是进程级抽象(例如循环数)?即便如此,事件循环如何确保在需要返回回调时它具有 CPU 访问权限?事件是否安排在 CPU 级队列上,可以在特定时间对某些进程进行优先级排序?或者一旦进程 1 重新获得访问权限,这个回调就会被执行,即使晚了?
但是,如果存在额外的延迟,这会对需要精确同步的时间敏感型应用程序产生什么影响?我们如何确保 Node 进程能够持续访问 CPU 核心?
现在,如果我们在进程 1 中调用
,回调是否会在 1000(现实世界)毫秒后执行,还是会在进程 1 尚未执行的时间里出现一些未计算的延迟?setTimeout(callback, 1000)
每种形式的睡眠最终都会以一种或另一种方式到达操作系统。因为只有操作系统可以让进程/线程进入睡眠状态并提供时间。那么睡眠时间就永远不准确。事实上,“精确”究竟意味着什么?它必须达到一定的精度,这是物理学。但还有更多:大多数操作系统只会保证睡眠时间“至少”是您所要求的,可以更多。事实上,根据 CPU 负载和操作系统调度程序的优先级,这可以是任意长的。这就是为什么你的机器上运行的其他东西实际上很重要的原因之一。
但是,如果存在额外的延迟,这会对需要精确同步的时间敏感型应用程序产生什么影响?我们如何确保 Node 进程能够持续访问 CPU 核心?这取决于敏感程度。低于毫秒?将会产生很大的影响。另一方面,如果是这种情况,你就不会使用 JavaScript。