繁体   English   中英

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

[英]Linux kernel: What process does schedule() run in?

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

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

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

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

这实际上取决于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()也可以代表进程调用,可以是驱动程序,也可以是信号处理代码,或文件系统内部,或无数其他选项。

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

当然,当例如由于时钟中断而调度出一个进程时,某些进程正在运行(后来又调度了另一个进程)。

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

问:那么,fork可以说是在进程X中运行,对吧?

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

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

答:“用户空间”与“内核空间”的问题绝对没有关系到内核是“整体”,“微内核”还是完全不同。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM