【Linux】内核线程
本文最后更新于 47 天前,其中的信息可能已经有所发展或是发生改变。

内核线程

概述

内核线程(thread)或叫守护进程(daemon),在操作系统中占据相当大的比例,当 Linux操作系统启动以后,尤其是 Xwindow 也启动以后,你可以用“ps”命令查看系统中的进程,这时会发现很多以“d”结尾的进程名,这些进程就是内核线程。 内核线程也可以叫内核任务,它们周期性地执行,例如,磁盘高速缓存的刷新,网络连接的维护,页面的换入换出等。在 Linux 中,内核线程与普通进程有一些本质的区别,从以下几个方面可以看出二者之间的差异。

与普通进程的区分

  • 内核线程执行的是内核中的函数,而普通进程只有通过系统调用才能执行内核中的函数。

  • 内核线程只运行在内核态,而普通进程既可以运行在用户态,也可以运行在内核态。

  • 因为内核线程指只运行在内核态,因此,它只能使用大于 PAGE_OFFSET(3G)的地址空间。另一方面,不管在用户态还是内核态,普通进程可以使用 4GB 的地址空间。

面给出“怎么区分内核线程”和“普通进程/用户线程”的方法

  • 名称特征:ps/top/htop 中,内核线程名称通常用方括号包裹,如 [kworker/0:1]、[rcu_sched]。
  • 父进程:多以 kthreadd(PID 2)为父进程。
  • 无用户态映像:/proc/PID/exe 不存在或不可解析;/proc/PID/cmdline 与 /proc/PID/environ 通常为空。
  • 标志位:/proc/PID/status 的 Flags 字段包含 PF_KTHREAD(0x00200000)表示内核线程。
  • 工具提示:htop 可在 F2 -> Display options -> Show kernel threads 打开/隐藏内核线程。
下一篇