Linux内核:schedule()运行的进程是什么?

时间:2011-12-05 05:58:34

标签: linux kernel scheduler

当您在进程X中调用诸如fork之类的系统调用时,内核被称为在进程上下文中执行。所以,fork可以说是在进程X中运行,对吗?

但是如果在同一个进程中调用schedule()(并且它不是一个sys调用),你会说它是作为X的一部分运行的吗?或者它是否在交换器进程中运行?或者这听起来很荒谬,考虑到内核的整体性质?

4 个答案:

答案 0 :(得分:6)

schedule()始终在进程上下文中运行。关于它的特殊部分是它可以改变哪个进程上下文是最新的 - 但它总是有一个进程上下文。在调用context_switch()之前,它在要交换的进程的上下文中运行,并在交换进程中运行之后。

Linux内核没有专门的“交换器”任务(有一个空闲任务,如果没有其他资格可以运行,它总是可以运行的。)

答案 1 :(得分:3)

这实际上取决于schedule()来电的来源;可以从进程上下文或工作队列中调用schedule()。工作队列是内核调度的线程:

# ps auxw | grep worker
root      1378  0.0  0.0      0     0 ?        S    20:45   0:00 [kworker/1:0]
root      1382  0.0  0.0      0     0 ?        S    20:45   0:00 [kworker/2:0]
root      1384  0.0  0.0      0     0 ?        S    20:45   0:00 [kworker/3:1]
...

[..]表示进程不在用户空间中执行。

worker_thread()函数在处理工作项之后但在重新开始之前调用schedule()

也可以通过驱动程序或信号处理代码,文件系统内部或无数其他选项代表进程调用

schedule()

答案 2 :(得分:0)

调度程序负责所有进程,因此不会在一个进程内运行。

当然,例如由于时钟中断,某个进程正在运行(后来又安排了另一个进程),因此计划进程。

您无法将所有内核视为正在运行的进程(仅限系统调用)。

答案 3 :(得分:0)

  

问:所以,fork可以说是在进程X中运行,对吗?

答:是的,绝对的。进程REQUESTS“fork”的系统调用发生在用户空间中。使系统调用TRANSITIONS从用户空间到内核空间的行为。系统调用的实现可能涉及许多单独的步骤。有些可能发生在用户空间;其他步骤发生在内核空间中。

  

问:考虑到内核的整体性质?

答:“用户空间”与“内核空间”的问题绝对没有关系到内核是“整体”,“微内核”还是其他东西。