Linux 内核:任务与线程

Linux 内核:任务与线程

当我在读一本书(Linux内核编程)时,我发现了一个有趣/令人困惑的段落mm_segment_t addr_limit(其中的成员之一struct_task),如下所示:

mm_segment_t addr_limit;
与旧内核不同,从 2.4 开始,任务(线程)也可以位于内核内。这些任务可以访问比用户空间中的任务更大的地址空间。地址限制描述可以使用任务内核访问的地址空间。

问题:

  1. 在第一点中,它说“(任务)线程也可以在内核中”是有的。这是什么意思?线程不一定在内核中吗?

  2. 在第二句话中,“这些可以访问比用户空间中的任务更大的地址空间。”我不明白什么这些方法?如果他说的是线程,线程怎么可能比任务有更大的地址空间呢?

答案1

短语“在内核内”可能指的是内核线程内核本身使用它们来执行可以异步执行的工作。您可以在进程树中查看这些线程的示例:

# ps aux | grep '\[.*\]$' | head
root         2  0.0  0.0      0     0 ?        S    May05   0:00 [kthreadd]
root         3  0.0  0.0      0     0 ?        S    May05   0:03 [ksoftirqd/0]
root         4  0.0  0.0      0     0 ?        S    May05   0:00 [kworker/0:0]
root         5  0.0  0.0      0     0 ?        S    May05   0:00 [kworker/u:0]
root         6  0.0  0.0      0     0 ?        S    May05   0:00 [migration/0]
root         7  0.0  0.0      0     0 ?        S    May05   0:00 [watchdog/0]
root         8  0.0  0.0      0     0 ?        S    May05   0:00 [migration/1]
root         9  0.0  0.0      0     0 ?        S    May05   0:00 [kworker/1:0]
root        10  0.0  0.0      0     0 ?        S    May05   0:02 [ksoftirqd/1]
root        11  0.0  0.0      0     0 ?        S    May05   0:00 [watchdog/1]

此类线程由调用 kthread_create() 的内核代码创建。这些线程在内核模式下运行,执行您期望内核执行的各种任务。

另一方面,“用户空间中的任务”代表您通常认为的线程或进程,通过 fork+exec 或 pthread_create 创建。它们在用户模式下运行,并在需要内核服务时进行系统调用。这里的措辞有点奇怪,因为当然,内核知道这些任务并维护有关它们的信息(例如 struct_task),以便它可以在 CPU 上为它们安排时间。

至于(2),“这些”特指“内核线程”。我相信内核线程与内核共享相同的地址空间。

相关内容