我想了解在具有可抢占内核的 Linux 下如何实现多线程调度。尤其是系统调用是如何在多线程、多核环境中执行的。
如果我理解正确的话,linux 内核使用的是一对一模型,即对于每个用户级线程,都会创建一个专用的内核线程。现在我不确定我是否正确理解了调度程序如何处理线程。
我想通过下面的例子来描述我目前的理解:
假设我们有一个由 2 个 CPU 和 3 个用户级线程(T1、T2、T3)组成的平台。然后另外,linux内核会创建3个专用的内核线程(分别是kT1,kT2,kT3)。
假设在时间 t0,线程 T1 和 T2 被选中在 2 个可用的 CPU 上并行执行。还没有相应的内核线程在运行,因为到目前为止还没有系统调用被调用。
在时间 t1,线程 T1 调用系统调用。因此线程 T1 被挂起,CPU1 被分配给内核线程 kT1。
现在让我们假设在时间 t2 内核线程 kT1 必须等待一些 I/0。因此调度器挂起kT1并选择用户级线程T3在CPU1上执行。
在时间 t3,线程 T2 也调用了一些系统调用。 T2 被挂起,CPU2 被分配给内核线程 kT2。
在时间 t4,kT1 一直在等待的数据准备就绪。调度器选择(随机)抢占kT2并将CPU2分配给kT1。
在时间 t5,kT1 的系统调用执行返回到用户空间。 IE。 kT1 变为不可运行,T1 被选择在 CPU2 上执行。
在时间 t6,用户空间线程 T3 终止,CPU1 被分配给 kT2。
在时间 t7,kT2 的系统调用执行返回到用户空间。
这是运行时执行的方式吗?调度程序是否知道内核和用户空间线程之间的区别,或者它们是否被同等对待(如本例所示)? 线程优先级/nice 值怎么样。内核线程是否从相应的用户级线程继承这些属性?
最佳答案
有区别。抢占内核线程以避免竞争条件要困难得多。所以,是的,调度程序需要知道两种线程类型之间的区别。但一般情况下,您描述的情况可能会发生。
可能是关于该主题的有用帖子: https://unix.stackexchange.com/questions/5180/what-is-the-difference-between-non-preemptive-preemptive-and-selective-preempti
关于linux - 多核平台上的 linux 调度程序如何处理系统调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51838679/