我想知道系统的最大内核线程数是否由 CPU 的内核数决定。还是以其他方式决定?
答案1
不,您可以将最大内核线程设置为非常高的数字。
请注意,“线程”一词可用于许多不同的用途:
大多数程序员用它来指代 POSIX 线程意义上的独立执行线程。这是一种组织程序的方式,不依赖于硬件支持。请参阅Linux 中每个进程的最大线程数?
Intel 用它来指代他们的“超线程”技术。参见为什么我的Intel i7-920显示8核而不是4核?和与 CPU 相关的“线程”是什么意思?
这可能是因为英特尔的使用造成了混乱。
更新内核线程
以下是在 AMD Athlon 64 X2 双核处理器上的 Vista 环境下在 CoLinux 中运行的一些 Linux 内核线程。
$ ps -eLf
UID PID PPID LWP C NLWP STIME TTY TIME CMD
root 1 0 1 0 1 17:24 ? 00:00:00 init [2]
root 2 0 2 0 1 17:24 ? 00:00:00 [kthreadd]
root 3 2 3 0 1 17:24 ? 00:00:00 [ksoftirqd/0]
root 4 2 4 0 1 17:24 ? 00:00:00 [events/0]
root 5 2 5 0 1 17:24 ? 00:00:00 [khelper]
root 21 2 21 0 1 17:24 ? 00:00:00 [kblockd/0]
root 22 2 22 0 1 17:24 ? 00:00:00 [kseriod]
root 41 2 41 0 1 17:24 ? 00:00:00 [pdflush]
root 42 2 42 0 1 17:24 ? 00:00:00 [pdflush]
root 43 2 43 0 1 17:24 ? 00:00:00 [kswapd0]
root 44 2 44 0 1 17:24 ? 00:00:00 [aio/0]
root 727 2 727 0 1 17:24 ? 00:00:00 [kjournald]
轻量级工作计划是线程 ID。
(见man ps
:“-L 显示线程,可能包含 LWP 和 NLWP 列”……“LWP lwp(轻量级进程,或线)所报告的 lwp 的 ID。(别名 spid,时间)”)
kthreadd 是内核线程守护进程,我相信它负责所有其他内核线程。请注意,我没有显示像 klogd 这样的不在 ring 0 中执行的守护进程(据我所知)。
内核线程数 != CPU 核心数。(参考问题标题)
内核线程由一组寄存器、一个堆栈和一些相应的内核数据结构组成。
…
内核线程相对于进程的优势在于,与进程相比,内核线程具有更快的创建速度和上下文切换速度。
…
内核线程被认为是“轻量级的”,线程数量仅受地址空间和处理器时间的限制
…
具体来说,操作系统内核倾向于将内核线程视为一种特殊的进程,而不是一个独特的实体。例如,在 Solaris 中,内核线程被称为“轻量级进程”(轻量级工作计划Linux 实际上使用一种称为“克隆”的特殊 fork 变体来创建内核线程,直到最近才为每个线程分配一个单独的进程 ID。由于这种传统,在实践中,内核线程在内存和时间成本上往往比用户级线程更接近进程,
(可迁移并行程序中的多控制流2006 年)