Linux调度程序在多核平台上如何处理系统调用

时间:2018-08-14 09:53:38

标签: linux kernel system-calls scheduling

我试图了解如何在具有抢占式内核的linux下实现多线程调度。特别是在多线程,多核环境中如何执行系统调用。

如果我理解正确,Linux内核将使用一对一模型,即为每个用户级线程创建一个专用的内核线程。现在,我不确定我是否正确理解调度程序如何处理线程。

通过以下示例,我想描述一下我目前的理解:

Corresponding figure to the following example

假设我们有一个平台,该平台由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也调用了一些syscall。 T2被挂起,并将CPU2分配给内核线程kT2。

在时间t4,kT1一直在等待的数据准备就绪。调度程序选择(随机)抢占kT2并将CPU2分配给kT1。

在时间t5,kT1的系统调用执行返回到用户空间。即kT1不可运行,并选择T1在CPU2上执行。

在时间t6,用户空间线程T3终止,并且CPU1被分配给了kT2。

在时间t7,kT2的系统调用执行返回到用户空间。

这是在运行时如何执行的吗?调度程序是否知道内核空间线程和用户空间线程之间的差异,或者是否对它们进行了等效处理(如本例所示)? 线程优先级/好的值呢?内核线程是否从相应的用户级线程继承这些属性?

1 个答案:

答案 0 :(得分:0)

有区别。为了避免竞争条件,抢占内核线程要困难得多。因此,是的,调度程序需要了解两种线程类型之间的差异。但是通常情况下,您描述的情况都会发生。

关于该主题的有用帖子: https://unix.stackexchange.com/questions/5180/what-is-the-difference-between-non-preemptive-preemptive-and-selective-preempti