当您在进程X中调用诸如fork
之类的系统调用时,内核被称为在进程上下文中执行。所以,fork
可以说是在进程X中运行,对吗?
但是如果在同一个进程中调用schedule()
(并且它不是一个sys调用),你会说它是作为X的一部分运行的吗?或者它是否在交换器进程中运行?或者这听起来很荒谬,考虑到内核的整体性质?
答案 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)
答:是的,绝对的。进程REQUESTS“fork”的系统调用发生在用户空间中。使系统调用TRANSITIONS从用户空间到内核空间的行为。系统调用的实现可能涉及许多单独的步骤。有些可能发生在用户空间;其他步骤发生在内核空间中。问:所以,fork可以说是在进程X中运行,对吗?
问:考虑到内核的整体性质?
答:“用户空间”与“内核空间”的问题绝对没有关系到内核是“整体”,“微内核”还是其他东西。