kthread在什么上下文中执行?

kthread在什么上下文中执行?

系统调用在调用进程内执行,中断可以在任何进程内执行(当中断发生时,中断处理程序在当前正在运行的进程内执行)但是kthreads在哪里执行?我们假设当前正在内核模式下执行的某些函数调用kthreads_create.这应该会产生新的内核线程,但是它的执行上下文是什么?抱歉,如果您认为我的问题是虚拟的,我绝对是 Linux 内核的新手

答案1

内核线程获得自己的进程上下文。内核线程按以下方式列出ps

$ ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 May29 ?        00:00:44 /sbin/init
root         2     0  0 May29 ?        00:00:00 [kthreadd]
root         3     2  0 May29 ?        00:00:05 [ksoftirqd/0]
root         5     2  0 May29 ?        00:00:00 [kworker/0:0H]
root         7     2  0 May29 ?        00:00:01 [migration/0]
root         8     2  0 May29 ?        00:02:57 [rcu_preempt]
root         9     2  0 May29 ?        00:00:00 [rcu_bh]
root        10     2  0 May29 ?        00:00:00 [rcu_sched]
root        11     2  0 May29 ?        00:00:00 [watchdog/0]
root        12     2  0 May29 ?        00:00:00 [watchdog/1]
...

[方括号]中的所有进程名称均指内核线程。

也可以看看https://lwn.net/Articles/65178/kthread_create只是创建一个数据结构。然后将该数据结构传递给wake_up_process运行该进程的 。

看来内核文档使用术语过程,线任务相当松散并且或多或少可以互换。

答案2

内核线程与普通进程类似,但有以下两个区别:(1)内核线程在内核模式下运行,(2)它们没有自己的地址空间。正如其名称所示,内核线程不会转换到用户空间,而是继续在内核模式下运行。每个内核线程都有自己的堆栈,但地址空间与内核的其余部分共享。在这方面,它们就像用户空间线程,但当然有区别,用户空间线程位于它们启动的用户级进程的地址空间中。

相关内容