我最近研究了 Silberschatz 写的操作系统书[操作系统概念]。
本书在第5章描述了“Contention scope”的概念,并提到有两种类型的contention scope。一个是 PTHREAD_SCOPE_PROCESS,另一个是 PTHREAD_SCOPE_SYSTEM。
对于 PTHREAD_SCOPE_SYSTEM,用户级线程将绑定(bind)到一个 LWP[虚拟处理器],而这个 LWP 将附加到一个内核线程。
其实我对LWP的概念不是很了解。 在命令行终端上,我可以键入以下命令:
ps -eLf
而且我可以看到一个进程 [PID] 可能有多个 LWP [线程 ID]。通过做一些调查,我发现 LWP 似乎只是指 linux 中的线程或任务。 喜欢以下链接:
How Linux handles threads and process scheduling
所以我有以下两个问题:
第一季度: LWP在linux中定义为虚拟处理器吗?内核中的哪些源代码定义了它?
Q2: 在下图中,syslog 的 PID 为 [852],并且有四个线程。而这4个LWP会各自绑定(bind)一个内核线程吗?或者内核会直接安排它们?
上图摘自:
http://www.softprayog.in/tutorials/ps-command-usage-examples-in-linux
提前致谢
最佳答案
Linux 不支持 PTHREAD_SCOPE_PROCESS
。参见示例 http://man7.org/linux/man-pages/man3/pthread_attr_setscope.3.html
POSIX.1 requires that an implementation support at least one of these contention scopes. Linux supports PTHREAD_SCOPE_SYSTEM, but not PTHREAD_SCOPE_PROCESS.
在 Linux 中,一个进程的多个线程就像碰巧共享同一地址空间的独立进程。是的,这是一个完全的过度简化,它们也共享其他资源——特别是信号处理程序、文件描述符和各种 ID——并且还有其他更细微的差异,但它们都是成熟的独立可调度实体。内核中使用的术语是“任务”。每个进程至少有一个任务。一个多线程进程有多个。
问题 1:LWP 与虚拟处理器不同(无论您指的是什么——在此上下文中,它并不为人所熟悉)。一个 LWP 对应于 linux 中的一个任务。尽管在内核开发之外,“进程”和“线程”仍然是更常用的术语。
Q2:每个LWP对应一个单独的任务(或用户线程),每个都可以被内核单独调度。 (在 linux 中,术语“内核线程”具有完全不同的特定含义:内核线程是一个线程[真正的任务],它在内核中度过它的整个生命周期。它们通常用于各种内部管理功能。)
有关 Posix 线程模型的更多信息,请参阅这个非常好的解释:http://www.icir.org/gregor/tools/pthread-scheduling.html讨论了 Linux 和 FreeBSD 的实现。
还有这个,用于更通用的线程概念:http://timetobleed.com/threading-models-so-many-different-ways-to-get-stuff-done/
关于linux - 理解linux内核中LWP的概念,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34892371/