Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading Scala和Erlang是否使用绿色线程?_Multithreading_Scala_Erlang_Multicore - Fatal编程技术网

Multithreading Scala和Erlang是否使用绿色线程?

Multithreading Scala和Erlang是否使用绿色线程?,multithreading,scala,erlang,multicore,Multithreading,Scala,Erlang,Multicore,我已经读了很多关于Scala和Erlang如何实现轻量级线程及其并发模型(actors)的文章 然而,我有我的怀疑 Scala和Erlang是否使用与Java使用的旧线程模型(绿色线程)类似的方法 例如,假设有一台机器有两个内核,那么Scala/Erlang环境将为每个处理器分叉一个线程?其他线程将按用户空间(Scala VM/Erlang VM)环境进行调度。这是正确的吗 在幕后,这到底是如何工作的呢?Scala使用底层Java线程实现,而Java线程实现 不能说Erlang。Erlang使用

我已经读了很多关于Scala和Erlang如何实现轻量级线程及其并发模型(actors)的文章

然而,我有我的怀疑

Scala和Erlang是否使用与Java使用的旧线程模型(绿色线程)类似的方法

例如,假设有一台机器有两个内核,那么Scala/Erlang环境将为每个处理器分叉一个线程?其他线程将按用户空间(Scala VM/Erlang VM)环境进行调度。这是正确的吗


在幕后,这到底是如何工作的呢?

Scala使用底层Java线程实现,而Java线程实现


不能说Erlang。

Erlang使用的是用户空间多任务,任务会一直运行,直到阻塞或用完“减少”部分。缩减被模糊地定义为一种计算单位

在SMP调度程序之前,只有一个内核线程执行可运行任务。通过SMP调度,您可以让多个内核线程执行任务,从而在多核机器上并行执行代码。调度程序线程的数量应与内核的数量相匹配。请参阅中的
-smp[启用|自动|禁用]
开关

还有一个内核线程池,供可加载驱动程序在中执行阻塞系统调用。这称为异步线程池。请参见中的
+A尺寸

进一步阅读


有关Erlang实现细节的最新信息,请检查()。

Scala 2.8使用Java线程池。轻量级参与者(
Reactor
)和轻量级模式下的较重参与者(
react{…}
)没有自己的线索;相反,当他们有一条消息时,他们会占用一个线程,直到处理完该消息,然后返回该线程,直到下一条消息到达才运行


在2.7中对演员进行了体面的描述;2.8并没有那么不同。

嗨,dave,我知道,最新的JVM只使用本机线程,但如果只使用本机线程,scala的可伸缩性会有问题。因此,我读过的一些文章说,Scala“并发环境”使用了一个线程池(工作线程),ideia使用的是可能性较小的java线程(本机线程)。但与此同时,他们又换了别的东西。我不知道是什么。如果您感兴趣,您可以在Akka论坛(Akka.io)@Rex上询问他们,但是为了可扩展,scala不能只使用java线程(本机OS线程),它必须能够创建一个新的线程可用的环境,比如绿色线程。想象一下,100个参与者,每个参与者使用一个java线程,这不是轻量级线程,因为switch线程上下文并不太轻量级。对吧?那有点正确。这些交换机不像Erlang那样轻量级。您几乎总是可以避免在100个线程上有100个参与者(通过让他们对消息做出反应而不是持续运行),因此您仍然可以使用非轻量级Java线程来支撑整个事件,但消息消耗量要轻一些(因为多个参与者的消息可以由一个线程处理)。由于这种体系结构,您可以在不耗尽OS线程的情况下扩展到很多react样式的参与者,但它的可扩展性不如Erlang。(搜索“thread ring benchmark shootout”…)@CHAPa-Akka演员基于回调,因此不需要多个线程。从开发的角度来看,这个模型要差得多,但允许在只提供线程池的平台上使用它。@Christian。因此,用户空间多任务调度器将选择一些“线程对象”由OS线程执行。对吧?我无法描述它比我链接到的EUC'08的pdf更好。我相信当前的OTP版本现在有多个运行队列,如第5.2节“我们生活在未来”中所述。不,操作系统线程运行erlang调度器,该调度器显式地处理进程及其调度。这就是为什么每个核心很少有一个以上的线程,至少对于运行erlang代码来说,它是不需要的。对于erlang进程来说,操作系统线程通常非常繁重,Java已经十年没有使用绿色线程了