标签: message-passing

是什么让Erlang适合软实时应用?

一些背景

我正在为数字媒体编程构建一种编程语言,它应该支持使用无共享消息传递和软实时的并发(即尽量计算音频/视频而不丢失样本或帧并且具有恒定的吞吐量) .

事实证明,这两个特征难以组合,主要是因为一个特定的约束:实时代码不应动态分配内存.

我的语言应该可以很容易地实现这样的事情:

  • 一个线程根据参数计算音频样本.例如,这些可以是合成器的不同控制的值.该线程"实时"运行.
  • 一个线程接收来自用户或另一台计算机的输入以更改这些值.这可以是GUI线程,例如,对用户用鼠标转动旋钮作出反应.

我希望用户设置的新值通过队列发送到合成器引擎.如果我只想发送浮点数和其他原子值,那么问题就不会很有趣了.实际上,我希望任何类型的数据都能够从一个线程流向另一个线程,甚至是复杂的对象或数据结构,这对于线程和优先级的任何配置都应该是可能的.如果没有实时动态内存分配,这就变得非常困难,而不会对程序员施加任何似乎任意的限制.

Erlang经常被宣传为适合实时系统.我的理解是,Erlang从不会禁止内存分配.如果我做了同样的事情,那将会导致许多问题消失,代价是在执行这些分配的代码中引入非确定性时序.

这个问题

那么是什么让Erlang如此合适呢?它是否实现了特殊的技巧来规避内存分配引起的问题,还是完全忽略了这个问题?它需要另一种实时方法吗?

举例说明这个问题

让我们假设我们在Erlang中编写一个合成器,它必须每50毫秒产生64个样本,否则声音中会出现裂缝和爆裂声.让我们假设当我在字符串上移动一些滑块时,一个小对象(假设它是一个列表或包含参数名称和新值的元组)必须从GUI进程发送到音频进程,其中a副本已创建.这将需要动态内存分配.Erlang如何帮助我确保此分配不会延迟我的音频计算?

concurrency erlang real-time message-passing

11
推荐指数
2
解决办法
4172
查看次数

Erlang是否总是在同一节点上的进程之间复制消息?

忠实地实现actor消息传递语义意味着消息内容从逻辑视点深度复制,即使对于不可变类型也是如此.消息内容的深度复制仍然是实现actor模型的瓶颈,因此对于性能,一些实现支持零拷贝消息传递(尽管它仍然是程序员的观点的深层拷贝).

在Erlang中是否实现零拷贝消息传递?在节点之间显然不能这样实现,但是在同一节点上的进程之间呢?这个问题是相关的.

erlang message-passing

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

Erlang如何在同一节点上的进程之间传递消息?

在节点之间,消息(必须)通过TCP/IP传递.但是,它们在同一节点上运行的进程之间传递了什么机制?在这种情况下是否也使用TCP/IP?Unix域套接字?"节点内"和"节点间"消息传递之间的性能差异是什么?

erlang message-passing

10
推荐指数
2
解决办法
1790
查看次数

为共享内存配置MPI意味着什么?

我有一些研究相关的问题.

目前我已经完成了基于MPI(特别是使用openmpi 6.3)的结构骨架框架的实现.框架工作应该在单台机器上使用.现在,我将它与其他先前的骨架实现(例如scandium,fast-flow,..)进行比较

我注意到的一件事是我的实现的性能不如其他实现.我认为这是因为,我的实现基于MPI(因此需要匹配发送和接收操作的双向通信),而我正在比较的其他实现基于共享内存.(...但我仍然没有很好的解释来证明这一点,这是我的问题的一部分)

这两个类别的完成时间有很大差异.

今天我也介绍了配置open-mpi for shared memory => openmpi-sm

我的问题出现了.

1,为共享内存配置MPI意味着什么?我的意思是MPI进程存在于自己的虚拟内存中; 究竟是什么标志就像在下面的命令一样呢?(我认为在MPI中,每次通信都是通过显式传递消息,进程之间没有共享内存).

    shell$ mpirun --mca btl self,sm,tcp -np 16 ./a.out
Run Code Online (Sandbox Code Playgroud)

第二,为什么MPI的性能与为共享内存开发的其他骨架实现相比要差得多?至少我也在一台多核机器上运行它.(我想这是因为其他实现使用了线程并行编程,但我没有令人信服的解释).

任何建议或进一步讨论都是非常受欢迎的.

如果我需要进一步澄清我的问题,请告诉我.

感谢您的时间!

parallel-processing message-passing mpi shared-memory openmpi

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

如何将数据从远程窗口传回Chrome扩展程序的后台页面?

我有一个chrome扩展,从我的后台页面打开一个远程窗口:

chrome.windows.create({
        type : 'popup',
        url : "https://www.example.com/mypage.html"
    }, function(newWindow) {

    });
Run Code Online (Sandbox Code Playgroud)

在我的远程页面(https://www.example.com/mypage.html)上,我正在等待用户执行操作.执行此操作时,我需要将一些数据传回扩展.

我怎样才能做到这一点?我在文档中找不到任何相关内容(http://developer.chrome.com/extensions/messaging.html)

message-passing google-chrome-extension

10
推荐指数
1
解决办法
4396
查看次数

消息队列与消息传递

我在这里看到(关于IPC的维基百科文章)这些是两个不同的东西,但即使阅读每一个专用的维基百科页面,我也不明白它的区别是什么.

有人能解释一下吗?

message-passing message-queue

10
推荐指数
2
解决办法
2324
查看次数

Erlang中的进程/消息和Smalltalk中的对象/消息有什么区别?

我试图了解Smalltalk中的对象/消息与Erlang中的进程/消息之间的区别。我阅读了有关该主题的以下文章

据我了解,在Smalltalk中,所有事物都是一个对象,并且所有事物都具有相同的“对象/消息”抽象-即使数字1是只能通过消息传递才能到达的对象。是1在Erlang / Elixir中进行的过程吗?Erlang中的所有内容是否都是对消息/程序范例的响应?您可以向Erlang中的号码发送消息吗?

非常感谢。

oop erlang smalltalk message-passing elixir

10
推荐指数
1
解决办法
113
查看次数

检查反应块是否已准备好用于业务

在编写并发代码时,想要分离一个单独的(绿色或操作系统)线程,然后要求该线程中的代码对各种线程安全消息做出反应是相当常见的。Raku 通过多种方式支持这种模式。

\n

例如,文档中的许多Channel 示例显示的代码与下面的代码类似(跨两个线程打印 1 到 10)。

\n
my $channel = Channel.new;\nstart   { react whenever $channel { say $_ }}\nfor ^10 { $channel.send($_) }\nsleep 1\n
Run Code Online (Sandbox Code Playgroud)\n

但是,如果我们从 s 的单消费者世界切换Channel到 live s 的多消费者世界Supply,则等效代码不再有效。

\n
my Supplier $supplier .= new;\nstart   { react whenever $supplier { say $_ }}\nfor ^10 { $supplier.emit($_) }\nsleep 1;\n
Run Code Online (Sandbox Code Playgroud)\n

该代码不打印任何内容。据我了解,这是因为react当值被编辑 \xe2\x80\x93 时该块没有监听,emit它不会花费很长时间来处理start线程和react事件,但处理emit十个值所需的时间甚至更少。而且,从逻辑上讲,将行移到循环sleep 1上方for会导致再次打印值。

\n

毕竟,这很公平 \xe2\x80\x93,使用实时 …

concurrency message-passing thread-safety rakudo raku

10
推荐指数
1
解决办法
158
查看次数

我可以使用什么库来进行简单,轻量级的消息传递?

我将启动一个需要在分布式节点之间进行通信的项目(该项目使用C++).我需要一个轻量级的消息传递库来传递节点之间非常简单的消息(基本上只是文本字符串).该库必须具有以下特征:

  1. 无需外部设置.我需要能够在我的代码中启动并运行所有内容 - 我不想要求用户安装任何软件包或编辑任何配置文件(除了要连接的IP地址和端口列表).

  2. 库使用的基础协议必须是TCP(或者如果它是UDP,则库必须保证最终接收消息).

  3. 该库必须能够发送和接收任意大的字符串(最多3GB +).

该库不需要支持任何安全机制,容错或加密 - 我只需要它快速,简单和易于使用.我考虑过MPI,但总结说在我的项目用户的机器上需要设置太多.

你会为这样一个项目推荐什么样的图书馆?我会自己动手,但由于时间限制,我认为这不可行.

c++ message-passing distributed-system

9
推荐指数
1
解决办法
6233
查看次数

如何在消息传递系统中实现屏障?

我的理解是,一个主进程向所有其他进程发送消息.返回的所有其他进程都会向主进程发送消息.这是否足以让障碍工作?如果没有,那还需要什么呢?

c c++ message-passing mpi barrier

9
推荐指数
1
解决办法
2683
查看次数