标签: lightweight-processes

从技术上讲,为什么Erlang中的进程比OS线程更有效?

Erlang的特点

来自Erlang Programming(2009):

Erlang并发性快速且可扩展.它的进程是轻量级的,因为Erlang虚拟机不会为每个创建的进程创建一个OS线程.它们在VM中创建,调度和处理,与底层操作系统无关.结果,进程创建时间大约为微秒,并且与并发存在的进程的数量无关.将其与Java和C#进行比较,其中为每个进程创建底层OS线程:您将获得一些非常有竞争力的比较,Erlang大大优于两种语言.

来自Erlang的并发编程(pdf) (幻灯片)(2003):

我们观察到创建Erlang进程所需的时间是1μs到2,500个进程; 此后,对于多达30,000个过程,它增加到大约3μs.Java和C#的性能显示在图的顶部.对于少量过程,创建过程大约需要300μs.创建两千多个流程是不可能的.

我们看到,对于多达30,000个进程,在两个Erlang进程之间发送消息的时间约为0.8μs.对于C#,每个消息大约需要50μs,直到最大进程数(大约1800个进程).Java更糟糕的是,对于多达100个进程,每个消息花了大约50μs,此后当大约有1000个Java进程时,它每个消息迅速增加到10ms.

我的想法

我并不完全理解为什么Erlang进程在产生新进程方面更有效率,并且每个进程的内存占用量更小.OS和Erlang VM都必须进行调度,上下文切换,并跟踪寄存器中的值等等......

为什么OS线程的实现方式与Erlang中的进程不同?他们还需要支持更多的东西吗?为什么他们需要更大的内存占用?为什么他们的产卵和沟通较慢?

从技术上讲,为什么在产生和通信时,Erlang中的进程比OS线程更有效?为什么操作系统中的线程不能以同样有效的方式实现和管理?为什么操作系统线程的内存占用量更大,产生和通信速度更慢?

更多阅读

erlang multithreading lightweight-processes green-threads

165
推荐指数
4
解决办法
3万
查看次数

Haskell轻量级线程开销并用于多核

我一直在阅读"真实世界Haskell"一书,关于并发和并行的章节.我的问题如下:

  • 由于Haskell线程实际上只是一个"真正的"OS线程中的多个"虚拟"线程,这是否意味着创建它们(如1000)不会对性能产生重大影响?即,我们可以说创建Haskell线程所产生的开销forkIO几乎可以忽略不计吗?如果可能的话,请带上典型的例子.

  • 轻量级线程的概念是否阻止我们使用多核架构的好处?据我所知,两个Haskell线程不可能在两个独立的内核上并发执行,因为从操作系统的角度来看它们实际上是一个单独的线程.或者Haskell运行时是否做了一些聪明的技巧来确保可以使用多个CPU?

concurrency multithreading haskell multicore lightweight-processes

58
推荐指数
2
解决办法
7815
查看次数

如果有的话,Erlang进程如何映射到内核线程?

Erlang因能够支持许多轻量级进程而闻名.它可以做到这一点,因为它们不是传统意义上的进程,甚至不是P线程中的线程,而是完全在用户空间中的线程.

这很好(实际上太棒了).但是,如何在多核/多处理器环境中并行执行Erlang线程?当然它们必须以某种方式映射到内核线程才能在不同的内核上执行?

假设情况就是这样,这是怎么做到的?许多轻量级进程是否映射到单个内核线程?

或者还有另一种解决这个问题的方法吗?

parallel-processing erlang multithreading lightweight-processes

48
推荐指数
2
解决办法
5985
查看次数

轻量级进程和线程有什么区别?

我在这里找到了问题的答案.但我不明白答案中的一些想法.例如,据说轻量级进程与其他进程共享其逻辑地址空间.这是什么意思?我可以理解2个线程的相同情况:它们共享一个地址空间,因此它们都可以从bss段读取任何变量(例如).但是我们有很多不同的流程和不同的bss部分,我不知道如何分享它们.

multithreading process lightweight-processes

15
推荐指数
3
解决办法
1万
查看次数

"绿色线程"和Erlang的流程之间有什么区别?

在阅读了Erlang的轻量级过程后,我非常确定它们是"绿色线程".直到我读到绿色线程和Erlang的进程之间存在差异.但我不明白.

有什么实际差异?

erlang multithreading lightweight-processes green-threads

11
推荐指数
3
解决办法
2085
查看次数

BEAM代表Elx编程语言的iex是什么?

BEA和M.的字母代表什么?我记得看到对首字母缩略词"BEAM"的解释,但我还没有找到它.

它出现在错误代码中:

?  gentoo  iex
Erlang/OTP 17 [erts-6.4.1] [source] [64-bit] [smp:8:8] [async-threads:10] [kernel-poll:false]

Interactive Elixir (1.0.4) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)> import Math

08:05:02.839 [error] Loading of /var/opt/proj/elx/ubuntu/Elixir.Math.beam failed: :badfile

** (CompileError) iex:1: module Math is not loaded and could not be found

08:05:02.846 [error] beam/beam_load.c(1104): Error loading module 'Elixir.Math':
  non-ascii garbage '78705400' instead of chunk type id


    (elixir) src/elixir_exp.erl:123: :elixir_exp.expand/2
iex(1)> 
Run Code Online (Sandbox Code Playgroud)

因此,看起来.beam文件存在某种问题,可能是由于我使用了vi.(注意Elixir程序员:不要编辑.beam文件,这很痛苦.)

这个问题解释了BEAM虚拟机什么,而不是字母代表什么.似乎很难在Erlang中心快速找到关于词源的更多信息.据说 BEAM是Erlang和Elixir的秘诀.

architecture acronym elixir lightweight-processes beam

11
推荐指数
1
解决办法
4254
查看次数

Linux中的线程和LWP

这句话是否正确:"Linux中的所有线程都是LWP,但并非所有LWP都是线程".实际上,我尝试了解Linux中的线程实现.pthread_create调用clone syscall但是在man clone中我没有找到任何对LWP的引用.那么,Linux有LWP吗?

linux multithreading lightweight-processes

8
推荐指数
1
解决办法
3820
查看次数

LLVM是否提供了实现"绿色线程"/轻量级进程的任何工具?

我正在研究使用LLVM作为本机代码生成器来设计支持轻量级进程("绿色线程")的并发语言.轻量级进程以M:N方式分配给本机OS线程,并且线程之间的工作窃取应该是可能的(即,进程应该由可以在线程之间传递的数据结构表示,如果需要).可能同时存在大量进程,因此进程不应占用大量内存,并且它们之间的上下文切换应尽可能快.此外,在上下文切换期间或者如果发生垃圾收集,"暂停"轻量级进程应该相当简单.我知道Erlang有一个LLVM后端,但我发现很少有关于它的实现的文献;

programming-languages llvm lightweight-processes green-threads

7
推荐指数
1
解决办法
601
查看次数

.NET中的Erlang风格轻量级进程

有没有办法在.NET中实现Erlang风格的轻量级进程?

我找到了一些实现Erlang消息传递模型(actor模型)的项目.例如,阿克苏姆.但我没有发现轻量级流程的实现.我指的是在单个OS线程或OS进程的上下文中运行的多个进程.

.net c# concurrency erlang lightweight-processes

6
推荐指数
2
解决办法
3879
查看次数

Python生成器函数/对象命名约定

我在同一个类中实现了一些逻辑过程。一个类实例为每个过程获取一个生成器,并run()推进所述生成器。就我而言,生成器不会结束。

您如何在下面的代码中调用foo_functionfoo_object

class C(threading.Thread):
    def foo_function(self):
        """ generator *function*,
            logical process foo """
        while True:
            # some state checks
            if self.some_attr:
                # side-effects here
                pass
            yield

    def __init__(self):
        # generator *object*
        # i.e. process instance
        self.foo_object = self.foo_function()  # <- here

    def run(self):
        while True:
            next(self.foo_object)
            next(self.another_object)
            if xxx:
                next(self.yet_another_object)
Run Code Online (Sandbox Code Playgroud)

典型的方法是discoveryauthenticationwatchdog,等。

如何命名以合理方式定义生成器的函数和包含生成器对象的属性?

最后,只是踢一下,同一个名字会疯了,对吗?

class C:
    def foo(self):
        yield 1; yield 2
    def __init__(self):
        self.foo = self.foo()

c = C() …
Run Code Online (Sandbox Code Playgroud)

python naming generator naming-conventions lightweight-processes

5
推荐指数
1
解决办法
2008
查看次数