猿问

go使用共享内存还是分布式计算

Go的标语是“不要通过共享内存进行通信;而是通过通信来共享内存”。我想知道Go是使用共享内存还是分布式计算方法。例如,对于MPI来说,它显然是分布式的,而OpenMP则是显然是共享内存的;但是我不确定Go的独特性。

我已经看到很多帖子,例如Shared memory vs. Go频道通信,有效的Go文档等,但无法澄清。提前致谢。


慕慕森
浏览 289回答 2
2回答

智慧大石

Go不会阻止您在goroutine /线程之间共享内存。它们的含义是,您通过通道发送数据块或指向该数据块的指针。这有效地将数据的“所有权”转移到通道的目标读取器。请注意,所有权的转移不是由语言或运行时强制执行的,只是按照惯例。如果您愿意的话,您仍然可以从两个goroutine写入同一内存。换句话说:Go并不能阻止您用脚射击自己,它只是提供了使这些错误更易于发现的语言语义。如果将值传递给通道,则程序员必须假定该值不再是他在同一goroutine中要写入的值。func F(c chan *T) {&nbsp; &nbsp; // Create/load some data.&nbsp; &nbsp; data := getSomeData()&nbsp; &nbsp; // Send data into the channel.&nbsp; &nbsp; c <- data&nbsp; &nbsp; // 'data' should now be considered out-of-bounds for the remainder of&nbsp; &nbsp; // this function. This is purely by convention, and is not enforced&nbsp; &nbsp; // anywhere. For example, the following is still valid Go code, but will&nbsp; &nbsp; // lead to problems.&nbsp; &nbsp; data.Field = 123}

呼啦一阵风

该问题假定共享内存和分布式计算是相反的。有点像在问:RAM和LAN是否相反?区分CPU /内存节点内的共享内存并发与CPU /内存节点之间的共享内存并发会更加清晰。这是并行处理研究的整体内容的一部分。有许多研究项目,包括:开发具有多个CPU共享一个内存的非冯诺依曼计算机,并通过某种形式的交换结构(通常是Clos网络)将其连接起来。OpenMP非常适合这些。开发由一组CPU组成的并行计算机,每个CPU都有自己的独立内存,并在节点之间具有一些通信结构。通常,这是MPI的所在地。第一种情况专门针对高性能计算博爱。我们大多数人都熟悉后一种情况。在这种情况下,通常这些天来的通信只是通过以太网进行的,但是(某些情况下)已经成功地开发了各种更快的低延迟替代方案(例如,从Transputer串行链路出现的IEEE1355 SpaceWire)。多年来,主要观点是,只有共享内存才能实现有效的并行性,因为(天真)认为传递消息的通信成本是过高的。对于共享内存并发,困难在于软件:因为一切都是相互依赖的,所以随着系统的变大,并发的组合设计将变得越来越困难。需要核心专业知识。对于我们其他人,Go跟随Erlang,Limbo,当然还有Occam来促进消息传递,以作为编排要完成的工作的手段。这源于通信顺序过程的代数,它为创建任何规模的并行系统提供了基础。CSP设计是可组合的:每个子系统本身都可以是更大系统的组成部分,而没有理论上的限制。您的问题涉及OpenMP(共享内存)和MPI(分布式内存消息传递),它们可以一起使用。Go可以被认为与MPI等效,因为它可以促进消息传递。但是,它也允许锁和共享内存。Go与MPI和OpenMP都不同,因为它与多处理器系统没有明确的关系。为了进入使用Go进行并行处理的世界,需要一个网络消息传递框架,例如OpenCL,有人正在为此使用Go API。
随时随地看视频慕课网APP

相关分类

Go
我要回答