我试图了解如何在具有抢占式内核的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也调用了一些syscall。 T2被挂起,并将CPU2分配给内核线程kT2。
在时间t4,kT1一直在等待的数据准备就绪。调度程序选择(随机)抢占kT2并将CPU2分配给kT1。
在时间t5,kT1的系统调用执行返回到用户空间。即kT1不可运行,并选择T1在CPU2上执行。
在时间t6,用户空间线程T3终止,并且CPU1被分配给了kT2。
在时间t7,kT2的系统调用执行返回到用户空间。
这是在运行时如何执行的吗?调度程序是否知道内核空间线程和用户空间线程之间的差异,或者是否对它们进行了等效处理(如本例所示)? 线程优先级/好的值呢?内核线程是否从相应的用户级线程继承这些属性?
答案 0 :(得分:0)
有区别。为了避免竞争条件,抢占内核线程要困难得多。因此,是的,调度程序需要了解两种线程类型之间的差异。但是通常情况下,您描述的情况都会发生。