我找到了问题的答案 这里。但我不明白答案中的一些想法。例如,据说轻量级进程与其他进程共享其逻辑地址空间。这是什么意思?我可以理解2个线程的相同情况:它们共享一个地址空间,因此它们都可以从bss段读取任何变量(例如)。但是我们有很多不同的流程和不同的bss部分,我不知道如何分享它们。
我找到了问题的答案 这里。但我不明白答案中的一些想法。例如,据说轻量级进程与其他进程共享其逻辑地址空间。这是什么意思?我可以理解2个线程的相同情况:它们共享一个地址空间,因此它们都可以从bss段读取任何变量(例如)。但是我们有很多不同的流程和不同的bss部分,我不知道如何分享它们。
来自MSDN, 线程和进程:
进程存在于操作系统中并且对应于哪些用户 看作程序或应用程序。另一方面,存在一个线程 在一个过程中。 出于这个原因,有时会提到线程 作为轻量级工艺。 每个过程由一个或多个组成 线程。
我不确定这里的答案是否正确,所以让我发布我的版本。
进程 - LWP(轻量级进程)和用户线程之间存在差异。我会将流程定义放在一边,因为这或多或少已知并且关注 LWP vs user threads
。
LWP本质上被称为今天的线程。最初,用户线程意味着由应用程序本身管理的线程,并且内核对它没有任何了解。
另一方面,LWP是内核调度和执行的单元。
例: 让我们假设系统有3个其他进程正在运行,并且调度是循环的,没有优先级。你有1个处理器/核心。
选项1。您有2个用户线程使用一个LWP。这意味着从操作系统的角度来看,您有一个调度单元。总共有4个LWP正在运行(另外3个+ 1个你的)。你的LWP占用了总CPU时间的1/4,而且由于你有2个用户线程,每个用户线程占用总时间的1/8(取决于你的实现)
选项2。你有2个LWP。从OS的角度来看,您有两个调度单元。总共有5个LWP在运行。你的LWP获得每个CPU总时间的1/5,你的应用程序获得2/5的CPU。
另一个粗略的区别--LWP有pid(进程id),用户线程没有。
由于某种原因,命名很少被搞乱,我们将LWP称为线程。
肯定存在更多差异,但请参阅幻灯片。 http://www.cosc.brocku.ca/Offerings/4P13/slides/threads.ppt
编辑:
发布后,我发现了一篇很好的文章,它更详细地解释了所有内容,并且比我写的更好。 http://www.thegeekstuff.com/2013/11/linux-process-and-threads/
IMO,LWP是一个 核心 可以在用户上下文中创建和执行的线程绑定。
如果我没弄错的话,你可以附上 用户 线程到单个LWP可能会增加并发级别而不涉及系统调用。
线程基本上是分配有一个目标和足以执行特定任务的信息的任务。 进程可以创建多个线程,以便尽快完成其工作。 例如,程序的一部分可能需要输入输出,一部分可能需要许可。
用户级线程 是那些可以由线程库处理的。
另一方面 内核级线程 (需要处理hadrware)也称为LWP(轻量级进程),以最大限度地利用系统,因此系统不会在一次系统调用时停止。
线程在进程内运行。
每个进程可以包含一个或多个线程。
如果内核对进程中运行的线程一无所知,那么我们就会在用户空间上运行线程,因此没有可用的多处理功能。
另一方面,我们可以在内核空间上运行线程;这意味着每个进程都在不同的CPU上运行。这使我们能够进行多处理,但您可能认为它在操作系统资源方面更加昂贵。
最后,有一个解决方案位于中间的某个位置;我们将线程组合成LWP。每个组在不同的CPU上运行,但组中的线程无法进行多处理。这是因为这个版本中的内核只知道组(它们是多处理的),但不知道它们包含的线程。 希望它足够清楚。
进程中包含一个或多个线程,线程可以执行进程可以执行的任何操作。进程中的线程也共享相同的地址空间,因为线程之间的通信成本较低,因为它使用相同的代码段,数据段和OS资源,因此线程的所有功能使其成为“轻量级进程”。