linux - 哪些任务对应Linux内核调度器?

标签 linux multithreading linux-kernel scheduler

在内核级别的 Linux 中,我们有线程/任务(属于内核和用户),例如,

swapper:是一个内核线程(进程 0),所有进程的祖先,在 Linux 的初始化阶段由 start_kernel() 函数从头开始创建。还有

init:一个额外的内核线程,进程1(init进程)

HelloWorld:用户程序的线程

我的问题是关于执行以下作业的内核调度程序:

-在固定时间内安排任务(即上下文切换)

-动态计算时间片(短/长与基于优先级)

-动态分配进程优先级(需要时)

-监控其作业的进程 (这还包括什么吗?)

更具体地说,我的问题变成了:内核级别的哪个线程/任务对应于调度程序?它应该是“调度程序”等还是来自内核的任何其他任务是否完成它的工作?

附言:

内核中的“swapper”是一个空闲线程/任务,具有最低优先级(暂停)[1]。这除了“降压”之外还有什么作用吗?

Linux 是否为多核系统中的每个内核创建一个专用的调度程序实例?如果不是,那么它在多核上的表现如何?

[1] Why do we need a swapper task in linux?

最佳答案

Linux调度器没有与之对应的任务或线程。 Linux 调度程序代码,主要是 schedule() 函数,在用于调度的计时器发出中断或在内核代码中明确调用它时(例如,作为系统调用的一部分)运行。

在多核上,调度程序代码在每个核上独立运行。 Core 0 上接收到的定时器中断通常使用 IPI(处理器间中断)广播到其他内核。如果平台有每个 CPU 定时器,那么 Linux 通常会使用它们来发出调度所需的中断,而不是使用 IPI。

关于linux - 哪些任务对应Linux内核调度器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20629964/

相关文章:

c++ - 线程处理 C++ linux OS

c - 了解 POSIX 和 Linux/glibc sched_* 函数之间的差异

c++ - OpenMP 中的 "static"和 "dynamic"调度有什么区别?

java - Swing Worker 在混合线程中的使用

java - 调用 SwingUtilities.invokeAndWait() 时创建的新线程?

linux - Linux 上的汇编 : unexpected behaviour from Assembly

linux - 如何在 makefile 中将您的项目链接到 64 位库

linux - 如何在每次迭代中以批处理模式从 Linux Top 获取输出?

c - Netlink 组播内核组

c - 在 Linux 中如何进行 CPU 分配?线程级还是进程级?