Erlang/Elixir 有句格言道:“不要通过共享内存来通信,要通过通信来共享内存。”

hpyhacking · 2013年05月03日 · 最后由 jjym 回复于 2013年05月06日 · 14128 次阅读

有句格言道:“不要通过共享内存来通信,要通过通信来共享内存。”

16 年前 Erlang 就是这样做的~

举个具体的例子吧?

就是提倡使用消息机制。要做好这点要有语言或库的支持。像 Erlang...

没注意到就是在 Erlang node 下

貌似楼主说的不是 Erlang 中的消息机制,而是 objects 之间的 message,通过 message 的传递减少对象之间的耦合,个人意见,欢迎指正

#5 楼 @leomayleomay 这是规矩而已,没感觉有什么区别,Erlang 是这么做的,OO 也是这么想的,所以套用在哪里无所谓了。

OO 可以按消息理解,但消息不是 OO。要按消息的方式用,内部应该解决了同步问题。Erlang 就解决得很好,Scala 也内建了 actor。比较遗憾的是 Ruby 没有内建这样的机制

#7 楼 @wushexu ruby 有 Celluloid 这个库,可以把对象封装成 Actor. Actor 所谓同步就是 mailbox 同步下..

#8 楼 @jjym 以库的形式容易出错,要自己约束自己,否则很容易按传统的方式写代码,使用共享变量,又带来问题。语言内建的就不一样,像 Erlang 你几乎没有办法使用共享变量

我的理解是,共享内存来通信 需要锁的结构,在并发上效率很低。当对象具有不变性时,你就可以没有锁了。

#9 楼 @wushexu 自己约束容易出错,要以库的方式用,否则很容易按传统的方式写代码,使用共享变量,又带来问题。语言内建的也差不多,像 Erlang 只要你想还是可以共用内存

#11 楼 @jjym 是可以,但那属于很刻意,很不自然,新手看着都别扭的代码。比如使用一个可修改的全局字典,新手都不会这样做。

语言内建的好处是,它确立了一套范式,现成的最佳实践。库可以实现更高级的模型。比如,语言内建 actor,库基于 actor 实现 dataflow 之类。

#12 楼 @wushexu 如果你不是新手的话,用 celluloid 也不会出错

15 楼 已删除

没想到引起这么多讨论

进程间通信靠信号量和管道通信,但是性能比较低 共享内存区的优点是性能非常高,但是缺点显而易见,某一个使用该内存区的进程出现了错误,很有可能导致其他进程崩溃

取舍的问题了吧

#18 楼 @jasl 楼主的本意不是说 IPC

#18 楼 @jasl 消息队列怎么样?

#18 楼 @jasl 那是 UNIX 太烂了,连映射一个内存页给另外一个进程都不行...

#21 楼 @bhuztez 内存页是操作系统低层实现的,不会暴露给系统程序员。

#22 楼 @wushexu 试问mmap是什么

#18 楼 @jasl 信号量用作进程同步,不适合共享数据。如果考虑未来要分布的话,可用 socket,否则管道我认为是首选,就是个文件句柄,比较简单。 IRC 有两套实现,POSIX 和 System V,前者比较自然,后者有些怪异

#23 楼 @bhuztez unix 进程编程都能出一大本书了, 还像 windows 那样加个进程间共享内存不晕菜掉... 另外 fork 也算是进程间共享内存啊

@jasl #23 楼 @bhuztez 还有就是你们别从 erlang process 跑题到系统进程...

#25 楼 @luikore unix 也不是完全不能,但是,就是都是类似放在/dev/shm下面这种要命名的,Windows 这里并没有什么区别。

fork 那种不能算。需要的是 a,b 两个独立进程,能像通过 socket 发送数据一样发送内存页。

#23 楼 @bhuz 你看 API 吧,把文件映射到虚拟内存,跟内存页有什么关系

#27 楼 @bhuztez 哦, 以前没学过这样的, 还在等 Unix 网络编程第三版第二卷...

那映射一个内存页给另一个进程的例子?

#26 楼 @luikore Erlang 从设计目标上看,在大方向上都搞对了,语法上也没多少绕的地方,语言本身还有啥好讨论的 ...

#29 楼 @luikore 唔...因为看到这帖子的时候刚起床 想到 os 进程上了。。。

#29 楼 @luikore 比如 L4 都可以 Map/Grant ...

进程通信推荐共享,共享的形式待定,内存只是一种而已,你可以用文件,数据库,等等。

http://golang.org/doc/effective_go.html#concurrency Do not communicate by sharing memory; instead, share memory by communicating. 如果没有 golang/erlang 这样低廉的通讯成本,这话也很难成立吧

#35 楼 @reus 这个是设计思路,跟具体的实现无关吧。就算没有 golang, erlang,还会有别的语言,按照这种设计思路去发展。

#35 楼 @reus SIMULA 67 可是在 1967 年就已经实现了啊

#36 楼 @daqing #37 楼 @bhuztez 我只是指出这句话的出处…

所有有 memory 且能 communicate 的生物都是 share memory by communicating 而不是 communicate by sharing memory 的,这何止是设计思路,简直就是自然法则,出现了至少几亿年了吧

这个话在应用在操作系统进程内才有指导意义。一个操作系统进程共享地址空间,才会说共享内存。通信是在线程 (系统级线程用户级线程) 之间,轻量级进程之间,或纤程之间

我觉得真实世界就跟光的波粒二象性一样,并不是完全区分二者的

#41 楼 @ShiningRay +1, 好用才是王道

需要 登录 后方可回复, 如果你还没有账号请 注册新账号