【问题标题】:Solution to Blocking system call by worker thread in Node.jsNode.js中工作线程阻塞系统调用的解决方案
【发布时间】:2020-11-05 11:49:21
【问题描述】:

我最近在 tanenbaum 的操作系统一书中了解了用户级线程和内核级线程。由于用户级线程由库包处理,并且由于使用过 node.js 有点,我得出的结论是 node.js 使用 libuv 来处理工作线程,因此使用用户级线程。

但我想知道 node.js 如何处理某些工作线程进行阻塞的系统调用,然后即使某些线程能够运行,内核也会阻塞整个进程的情况。

【问题讨论】:

  • 你认为哪些系统调用会阻塞整个进程,甚至进程中的其他线程?
  • @jfriend00 如果一个线程导致页面错误,内核甚至不知道线程的存在,自然会阻塞整个进程,直到磁盘 I/O 完成,即使其他线程可能是可运行的. Page Fault 会导致阻塞,因为页面需要从磁盘进入内存。
  • 而且,你认为 nodejs 什么时候会导致页面错误?
  • @jfriend00 你认为什么是页面?如果你觉得我在某件事上错了,请告诉我。如果您知道答案或有任何困惑,请告诉。但我不喜欢这种迂回曲折的提问和回答方式。
  • 你是第一个使用“页面错误”的人。你认为它在你的评论中是什么?在这里兜兜转转,不费吹灰之力。您似乎认为 nodejs 可能会被长时间阻塞,我试图让您说出您认为如何/何时会发生这种情况?我从来没有听说过这个问题在你所描述的操作系统/系统级别的nodejs中,所以我要求你解释为什么你认为这是一个问题?您有责任提出一个我们可以尝试提供帮助的明确问题。就你现在的问题而言,我从未听说过这个问题是 nodejs 中的问题。

标签: node.js multithreading process operating-system libuv


【解决方案1】:

但我想知道 node.js 如何处理某些工作线程进行阻塞的系统调用,然后即使某些线程能够运行,内核也会阻塞整个进程的情况。

现代操作系统中不会发生这种情况。仅仅因为进程中的一个线程正在从磁盘读取/写入,操作系统不会阻止整个进程对其其他线程执行任何操作。

现代硬件使用DMA(直接内存访问)来精确地读取/写入磁盘,因此在从磁盘读取或写入数据块时不必阻塞 CPU。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-18
    • 1970-01-01
    • 2017-04-14
    • 2017-10-03
    • 1970-01-01
    • 2013-03-30
    • 1970-01-01
    相关资源
    最近更新 更多