Linux内核线程记录

在 Linux 中,用户态进程的“祖先”,都是 PID 号为 1 的 init 进程。

现在主流的 Linux 发行版中,init 都是 systemd 进程;而其他的用户态进程,会通过 systemd 来进行管理。

Linux 中的各种进程,除了用户态进程外,还有大量的内核态线程。那么,内核态线程又是谁来管理的呢?


实际上,Linux 在启动过程中,有三个特殊的进程,也就是 PID 号最小的三个进程。

  • 0 号进程为 idle 进程,这也是系统创建的第一个进程,它在初始化 1 号和 2 号进程后,演变为空闲任务。当 CPU 上没有其他任务执行时,就会运行它(swapper->空闲任务,当系统中没有任务时,perf追踪可以看到其使用率为99%)。

  • 1 号进程为 init 进程,通常是 systemd 进程,在用户态运行,用来管理其他用户态进程。

  • 2 号进程为 kthreadd 进程,在内核态运行,用来管理内核线程。


常用的内核线程:

  • kswapd0:根据页低阈值(min_free_bytes)的配置,定期回收内存

  • ksoftirqd:处理软中断的内核线程,每个CPU都有一个,当看到此线程对CPU使用率较高时,意味着系统在进行大理的软中断操作,性能会有问题

  • kworker:用于执行内核工作队列,分为绑定 CPU (名称格式为 kworker/CPU86330)和未绑定 CPU(名称格式为 kworker/uPOOL86330)两类。

  • migration:在负载均衡过程中,把进程迁移到 CPU 上。每个 CPU 都有一个 migration 内核线程。

  • jdb2/sda1-8:jbd 是 Journaling Block Device 的缩写,用来为文件系统提供日志功能,以保证数据的完整性;名称中的 sda1-8,表示磁盘分区名称和设备号。每个使用了 ext4 文件系统的磁盘分区,都会有一个 jbd2 内核线程。

  • pdflush:用于将内存中的脏页(被修改过,但还未写入磁盘的文件页)写入磁盘(已经在 3.10 中合并入了 kworker 中)。

  注:当内核线程使用CPU较高时,可以使用perf对其进行追踪分析


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章