2016-01-20 90 views
1

我最近研究了Silberschatz编写的OS操作系统概念。不了解liunx内核中的LWP的概念

在第5章中,本书描述了“争用范围”的概念,并提到争用范围有两种类型。一个是PTHREAD_SCOPE_PROCESS,另一个是PTHREAD_SCOPE_SYSTEM。

而对于PTHREAD_SCOPE_SYSTEM,用户级别线程将绑定到一个LWP [虚拟处理器],并且此LWP将附加到一个内核线程。

其实我并不完全理解LWP的概念。 在命令行终端我可以输入以下命令:

ps -eLf 

我可以看到一个过程[PID]可具有若干LWP [线程ID。通过做一些调查,我发现LWP似乎只是Linux中的线程或任务。 类似下面的链接:

How Linux handles threads and process scheduling

所以,我有以下两个问题:

Q1: 是LWP定义为Linux虚拟处理器?内核中的哪些源代码定义了它?

Q2: 在下图中,syslog具有PID [852]并且有四个线程。这四个LWP将分别绑定一个内核线程?或者内核会直接安排它们?

enter image description here

以上图片摘自:

http://www.softprayog.in/tutorials/ps-command-usage-examples-in-linux

在此先感谢

回答

3

Linux不支持PTHREAD_SCOPE_PROCESS。例如见http://man7.org/linux/man-pages/man3/pthread_attr_setscope.3.html

POSIX.1要求执行支助这些 争用范围的至少一个。 Linux支持PTHREAD_SCOPE_SYSTEM,但不支持 PTHREAD_SCOPE_PROCESS。

在Linux中,一个进程的多线程就像分离进程,它们碰巧共享相同的地址空间。是的,这是完全简单化的过程,它们也共享其他资源 - 特别是信号处理程序,文件描述符和各种ID - 还有其他更细微的差异,但它们都是完全独立的可调度实体。内核中使用的术语是“任务”。每个进程至少有一项任务。多线程进程有不止一个。

问题1:LWP与虚拟处理器不一样(无论你是什么意思 - 这在本文中并不熟悉)。一个LWP对应于linux中的任务。尽管在内核开发之外,“进程”和“线程”仍然是更常见的术语。Q2:每个LWP对应一个单独的任务(或用户线程),并且每个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/

+0

感谢您的回复。我见过第二篇文章。第二篇文章提到了用户线程到内核线程的三种映射,它说Linux实现了1:1模型。因此,每个用户线程将映射到Linux中的一个内核线程[即这四个syslog lwp每个都会映射到我的问题帖中的一个内核线程]?我能从ps命令中看到这种关系吗?从你的回复看来,内核似乎会查看用户线程和内核线程都是“任务”并直接安排它们,对吗? –

+0

是的。每个syslog lwp(用户线程)实际上是一项任务。而linux中的术语“任务”对应于该文章称为“内核线程”的内容。但是请注意,术语“内核线程”在linux *中具有特定的含义*,与您使用的含义不同。在Linux中,用户线程和内核线程都是任务,都是可独立调度的。 –

+0

好的。由于用户线程和内核线程在linux中都是可调度的任务。有没有这样的1:1绑定像文章在linux中说的对吗? –