我知道线程和进程之间的区别。但在阅读Galvin的Operating System Principles时,我遇到了LWP (lightweight process)。虽然Galvin将其定义为虚拟进程,但其他一些消息来源称它基本上是一个线程。
由于阅读了各种来源的资料,我现在对纤程和线程模型也有类似的困惑。我的问题是:
1. What exactly is a LWP?
2. What role does LWP plays in different threading models
(one-to-one, many-to-one etc)
3. Some idea on how LWP are implemented
4. What is a fiber? Is it a generic term or related to some specific OS/library?另外,关于线程模型,它们是如何调度的?线程库例程是在用户空间中调度线程,还是内核在进行调度。
本质上,我希望得到一个详细的答案,解释与多线程和线程模型相关的各种术语。
发布于 2014-01-23 00:37:43
使用轻量级进程的主要原因是最小化context switching带来的开销。
要做到这一点,一个简单的方法是将LWP实现为同一地址空间内的线程(即,在一个进程内),这大致减少了进程切换到线程切换的成本。如果您正在寻找麻烦,您通常仍然能够观察到共享内存,因为您的编程环境足够低级。从开发人员的角度来看,您只是在假装使用流程(即。您选择不使用共享内存来交换数据,尽管在技术上您可以这样做),而从操作系统的角度来看,您的“进程”本质上是线程。
请注意,LWP可以在系统中的不同级别上实现:许多操作系统都提供了对LWP的支持,但从理论上讲,您也可以用自己喜欢的线程感知编程语言编写一个纯用户模式的LWP框架并开始破解。
因为LWP基本上是线程,所以它们原则上支持内核线程在同一操作系统上执行的所有线程模型。类似地,操作系统中的实现基本上是基于线程的,加上在记账方面的必要更改,以使用户能够识别它们为LWP。
总而言之,LWP通过线程实现了进程的概念,这允许我们摆脱一些上下文切换开销。权衡的是,我们失去了操作系统为进程强制提供的独特的内存地址空间。但只要我们表现良好,我们就可以假装我们仍然在使用真实的过程。Erlang programming language就是这个概念的一个很好的真实例子。
纤程在不同的层次上做同样的事情:纤程(这是一种轻量级线程)通过单个线程实现多线程的概念,这允许我们摆脱线程切换开销(我们停留在相同的调用堆栈上)。这里的权衡是我们失去了抢占式的多任务处理。这意味着一个纤程必须自愿声明它已经准备好停止执行,然后另一个纤程才能工作。
与LWP一样,纤程的概念也可以在纯用户模式下实现,而不需要操作系统的帮助。然而,当人们谈论纤程时,他们通常指的是操作系统中的实现,而用户模式实现通常使用术语协程(它们实际上意味着相同的东西)。现实世界中的协程示例有Lua programming language或C++的Boost coroutine库。
https://stackoverflow.com/questions/21286680
复制相似问题