我知道线程和进程之间的区别。但在Operating System Principles
之前阅读Galvin
时,我遇到了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?
关于线程模型,它们是如何安排的?线程库例程是在用户空间中调度线程还是内核正在进行调度。
基本上,我希望得到一个详细的答案,解释与多线程和线程模型相关的各种术语。
答案 0 :(得分:1)
使用轻量级进程的主要原因是最小化context switching引起的开销。
一种简单的方法是将LWP实现为同一地址空间内的线程(即在一个进程内),这大致降低了进程切换到线程切换的成本。如果您正在寻找麻烦,考虑到您的编程环境足够低,您通常仍然可以观察共享内存。从开发人员的角度来看,你只是假装来处理进程(即你选择不使用共享内存来交换数据,即使你在技术上可以),而从操作系统的角度来看你的“进程”本质上就是线程。
请注意,LWP可以在系统的不同级别实现:许多操作系统都提供对它们的支持,但理论上,您还可以用您喜欢的线程感知编程语言编写纯用户模式LWP框架并开始破解
由于LWP基本上是线程,因此它们原则上支持内核线程在同一操作系统上执行的所有线程模型。类似地,操作系统中的实现基本上基于线程,加上簿记中的必要更改,使其可以被识别为用户的LWP。
总而言之,LWP通过线程实现进程的概念,这允许我们摆脱一些上下文切换开销。权衡是我们失去了操作系统对进程强制执行的不同内存地址空间。但只要我们自己表现出来,我们就可以假装我们仍在使用真正的流程。 Erlang programming language是这个概念的一个很好的现实世界的例子。
光纤在不同的层面上做同样的技巧:光纤(它是一种轻量级线程)通过单个线程实现多线程的概念,这允许我们摆脱线程切换开销(我们留下在同一个调用堆栈上)。这里的权衡是我们失去了先发制人的多任务处理。这意味着光纤必须自愿声明它已准备好在另一根光纤可以工作之前停止执行。
与LWP一样,光纤的概念也可以在纯用户模式下实现,无需操作系统的帮助。然而,当人们谈论光纤时,他们通常会参考操作系统中的实现,而用户模式实现通常使用术语 coroutine (尽管它们的确意味着相同)。现实世界中协同程序的示例是C ++的Lua programming language或Boost coroutine库。