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