内核线程数 = 核心数?

sta*_*orn 5 kernel

我想知道系统最大内核线程是否取决于您的 CPU 有多少个内核。还是以另一种方式决定的?

Red*_*ick 5

不,您可以将最大内核线程数设置为非常高的数字。

请注意,“线程”一词用于许多不同的事物:

可能是英特尔的使用引起了混乱。


更新内核线程

下面是一些在 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]
Run Code Online (Sandbox Code Playgroud)

LWP是线程 ID。

(请参阅man ps:“-L 显示线程,可能带有 LWP 和 NLWP 列”……“LWP lwp(轻量级进程或线程)报告的 lwp 的 ID。(别名 spid、tid)”)

kthreadd 是内核线程守护进程,我相信它负责所有其他内核线程。注意我没有展示像 klogd 这样不在 ring 0 中执行的守护进程(据我所知)。

内核线程数!= CPU 内核数。(参考问题标题)


内核线程由一组寄存器、一个堆栈和一些相应的内核数据结构组成。

与进程相比,内核线程相对于进程的所谓优势是更快的创建和上下文切换。

内核线程被认为是“轻量级的”,人们会期望线程数仅受地址空间和处理器时间的限制

特别是,操作系统内核倾向于将内核线程视为一种特殊的进程,而不是一个独特的实体。例如,在 Solaris 内核中线程被称为“轻量级进程”(LWP)。Linux 实际上使用称为“clone”的特殊 fork 变体创建内核线程,并且直到最近才给每个线程一个单独的进程 ID。由于这种传统,实际上内核线程在内存和时间成本上往往比用户级线程更接近进程,

可迁移并行程序中的多控制流2006)