linux - 多核平台上的 linux 调度程序如何处理系统调用

标签 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 也调用了一些系统调用。 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/

相关文章:

c - 模拟ARM代码

linux - 从 VPS 备份所有网页文件

c - 用于升级嵌入式设备的.bin文件

linux - 对要安装的 linux 风格感到困惑

windows - 内核调试: Windows 7 hangs at boot time

C - 系统调用 - 64 位 - 指针

exception - 系统调用和陷阱之间的区别

linux - Bash 脚本文件意外结束

Android 开发环境 Linux

linux - 如何在sys_create中设置权限