在Linux内核级别,我们有线程/任务(属于内核和用户),例如,
swapper:是一个内核线程(进程0),是start_kernel()函数在Linux初始化阶段从头开始创建的所有进程的祖先 . 也
init:一个额外的内核线程,进程1(init进程)
HelloWorld:用户程序的一个线程
我的问题是关于内核调度程序,它执行以下作业:
-
在固定的时间内安排任务(即上下文切换)
-
动态计算时间片(基于短/长与优先级)
-
动态分配流程优先级(需要时)
-
监控流程到其工作(这包括更进一步吗?)
更具体地说,我的问题变成:内核级别的哪个线程/任务对应于调度程序?应该是'调度程序'等,还是来自内核的任何其他任务都可以完成它的工作?
P.S:
内核中的“swapper”是具有最低优先级(暂停)的空闲线程/任务[1] . 除了“降压”之外,这会做什么吗?
Linux是否为多核系统中的每个核心创建了一个专用的调度程序实例?如果不是,那么它在多核上的表现如何呢?
2 回答
Linux调度程序没有与之对应的任务或线程 . Linux调度程序代码(主要是schedule()函数)在用于调度的计时器发出中断或在内核代码中显式调用时(例如,作为系统调用的一部分)运行 .
在多核上,调度程序代码在每个核心上独立运行 . Core 0上收到的定时器中断通常通过使用IPI(处理器间中断)到其他内核进行广播 . 如果平台具有每个CPU计时器,则Linux通常使用这些来发出调度所需的中断而不是使用IPI .
我不认为有一个单独的线程运行调度程序 . schedule()是执行调度的函数 . 可以从以下位置调用schedule()函数的某些位置:
像这样,可能有许多地方可以调用schedule()函数 .