【问题标题】:Will the entire process block when a system call is made or only the thread?进行系统调用时会阻塞整个进程还是仅阻塞线程?
【发布时间】:2017-10-03 07:42:06
【问题描述】:

如果一个线程进行了系统调用,整个进程会阻塞直到内核执行完系统调用,还是只会阻塞进行系统调用的线程?

【问题讨论】:

  • 在 linux 中,线程是完全独立的进程。所以从某种意义上说,是的,整个进程(读取线程)确实会阻塞,直到系统调用完成。如果您严格地以编程方式思考,那么没有其他线程不会因为进行了系统调用而阻塞
  • 如果一个线程可以通过不相关的操作不断阻塞所有其他线程,那么线程化的目的会有点失败。
  • @kaylum 如果你不介意的话,我有一个相关的问题,为什么会阻塞进行系统调用的线程?是不是因为当系统调用时,CPU切换到内核态,所以如果线程没有被阻塞,那么线程可以执行特权指令(例如:hlt)?
  • 好吧,想想一个“正常”的函数调用。在函数退出之前调用者是否可以继续?不(通常),因为调用函数的目的是让它为你做一些事情,然后你可以继续执行。与系统调用相同 - 这是对内核做某事的请求,在完成之前继续下去是没有意义的。请注意,“做某事”可能是开始一个较长的操作,这并不意味着该长时间的操作必须在系统调用返回之前完成。我认为最后一点可能是您感到困惑的地方。

标签: linux process operating-system kernel cpu


【解决方案1】:

如果您使用的是操作系统创建的真实线程,答案是否定的。线程独立执行,独立调度。

如果您使用的是由库模拟的线程(如果您真的很疯狂,您可以在 Linux 中这样做),那么所有线程都可能阻塞,具体取决于相关的系统调用。

【讨论】:

    猜你喜欢
    • 2017-04-14
    • 2014-07-15
    • 1970-01-01
    • 2014-03-23
    • 2015-04-27
    • 2013-11-16
    • 2013-04-26
    • 2016-03-24
    • 1970-01-01
    相关资源
    最近更新 更多