什么是内核线程?

tij*_*jin 25 c operating-system kernel-module linux-kernel

我刚刚开始编写设备驱动程序和新线程,编写了很多文档来了解线程.我还有一些疑惑.

  1. 什么是内核线程?
  2. 它与用户线程有何不同?
  3. 两个线程之间的关系是什么?
  4. 我该如何实现内核线程?
  5. 我在哪里可以看到实现的输出?

谁能帮我 ?.谢谢.

Mir*_*cea 18

  1. 内核线程task_struct没有用户空间组件.
  2. 除了从用户空间缺乏的,它具有不同的祖先(kthreadd内核线程代替init处理),并通过一个仅内核API取代的序列创建clonefork/exec系统调用.
  3. 两个内核线程kthreadd作为父级.除此之外,内核线程与用户空间进程享有相同的"独立性".
  4. 使用kthread.h头文件中kthread_run函数/宏你最有可能要写一个内核模块来调用这个函数,所以你应该看看Linux设备驱动程序
  5. 如果您指的是实现的文本输出(通过printk调用),您可以使用该dmesg命令在内核日志中看到此输出.


Bas*_*tch 8

内核线程是仅在内核模式下运行的内核任务; 它通常没有被创建fork()clone()系统调用.一个例子是kworkerkswapd.

如果你不知道它们是什么,你可能不应该实现内核线程.

谷歌提供了很多关于内核线程的页面,例如Frey的页面.

  • 对于内核线程的信息`task-> mm`实际上是'NULL`. (2认同)

Var*_*rma 5

用户线程和堆栈:

每个线程都有自己的堆栈,因此它可以使用自己的局部变量,线程共享的全局变量,它们是 linux 可执行文件的 .data 或 .bss 部分的一部分。由于线程共享全局变量,即当我们想在多线程应用程序中访问/修改全局变量时,我们使用像互斥锁这样的同步机制。局部变量是线程独立堆栈的一部分,因此不需要任何同步。

内核线程 内核线程应运而生,因为它需要在进程上下文中运行内核代码。内核线程是工作队列机制的基础。本质上,线程内核是只在内核模式下运行并且没有用户地址空间或其他用户属性的线程。

要创建线程内核,请使用 kthread_create():

#include <linux/kthread.h>

structure task_struct *kthread_create(int (*threadfn)(void *data),
                                      void *data, const char namefmt[], ...);
Run Code Online (Sandbox Code Playgroud)

内核线程和堆栈: 内核线程用于为内核执行后处理任务,例如 pdf 刷新线程、workq 线程等。内核线程基本上是没有地址空间的新进程(可以使用带有所需标志的 clone() 调用创建),意味着他们无法切换到用户空间。内核线程与普通进程一样是可调度和可抢占的。

内核线程有自己的堆栈,用于管理本地信息。

有关内核堆栈的更多信息:- https://www.kernel.org/doc/Documentation/x86/kernel-stacks