免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 16751 | 回复: 14
打印 上一主题 下一主题

[其他] 请问erlang的轻量级进程是如何实现的 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-09-06 00:39 |只看该作者 |倒序浏览
5可用积分
erlang的运行时是用c实现的吧
它的进程应该也是用c实现的
为什么用c+系统接口模拟出来的进程却要比native进程还牛逼呢?
我是函数编程以及脚本语言的菜鸟
还想问大拿们一个问题
这些语言的系统库到底是如何实现的呢? 比如erlang的gen_tcp
它是如何调用到平台的socket功能的?
是不是直接通过运行时(虚拟机)直接映射语言调用实现的呢?
比如编译器看到一个erlang的connect调用 它便生成connect(socketfd,...)类似的native代码呢??
我昏了。。。

论坛徽章:
0
2 [报告]
发表于 2008-09-07 23:51 |只看该作者
我也想了解,曾经测试过,用ab发起多线程HTTP连接,最多只能完成220req/s左右。
而用erlang的inets库随便写了一个类似的客户端,能支持到440~500req/s。
erlang是怎么做到的?

论坛徽章:
0
3 [报告]
发表于 2008-09-16 13:06 |只看该作者
它是COP(面向并发的程序设计),所有的都是进程,合理的负载均衡.
有动态语言和FPL的双重特点.
所有这些都是由语言处理方法和实现策略决定的,可以通过分析处理流程体现出来.
这些资料能在网上找到。

[ 本帖最后由 fuqiang_huang 于 2008-9-16 13:11 编辑 ]

论坛徽章:
0
4 [报告]
发表于 2008-09-16 14:36 |只看该作者
原帖由 fuqiang_huang 于 2008-9-16 13:06 发表
它是COP(面向并发的程序设计),所有的都是进程,合理的负载均衡.
有动态语言和FPL的双重特点.
所有这些都是由语言处理方法和实现策略决定的,可以通过分析处理流程体现出来.
这些资料能在网上找到。


回答得不到位啊
我想问的是erlang的进程如何映射到erlang虚拟机实现的c代码上 数据结构 以及 算法

大拿们提供一些erlang源代码分析方面的文章 和 经验

论坛徽章:
0
5 [报告]
发表于 2008-09-16 14:53 |只看该作者
我不是大拿,hehe!!,共同学习与研究
你的问题无法回答到位,太过于庞大,我只是给一个探究的方法,源码分析是要有方法与技术支持的,不可能一步到位;
“我想问的是erlang的进程如何映射到erlang虚拟机实现的c代码上”这种问法不好理解,
进程是什么?与操作系统中的进程一样吗?(不一样)
虚拟机起什么作用?要分析源码才能了解它的实现方法?
我只是说明了研究的思路。

[ 本帖最后由 fuqiang_huang 于 2008-9-16 15:13 编辑 ]

论坛徽章:
0
6 [报告]
发表于 2008-09-16 22:10 |只看该作者
Erlang的进程不一定对应系统进程的
我对这个东西不了解,瞎猜的
现代系统普遍基于虚拟内存和写时拷贝
由于函数式语言独特的变量观念,他们并不一定需要使用C的malloc机制
这样,fork的成本就会非常低,然后再mmap个共享内存,通信也不是大问题
另一方面,也可以做m:n的模型,跟线程一样
因为erlang有自己的虚拟机,这么就完全可以保证线程之间的地址空间不被错误引用
具体方式,可能跟libc_r的方法接近

论坛徽章:
0
7 [报告]
发表于 2008-09-17 22:17 |只看该作者
原帖由 blizzard213 于 2008-9-6 00:39 发表
erlang的运行时是用c实现的吧
它的进程应该也是用c实现的
为什么用c+系统接口模拟出来的进程却要比native进程还牛逼呢?
我是函数编程以及脚本语言的菜鸟
还想问大拿们一个问题
这些语言的系统库到底是如何 ...



在windows2000下加载了erlang解释器(或虚拟机),他产生了一个进程.八个线程(双核的机器)
运行如下代码:

  1. -module(mprocess).
  2.      -export([run/0, say_string/2]).
  3.      say_string(What, 0) -> done;
  4.      say_string(What,Count) ->io:format("~p~n", [What]),
  5.      say_string(What, Count - 1).
  6.      run()->spawn(mprocess, say_string, [hello, 300000]),
  7.               spawn(mprocess, say_string, [goodbye, 300000]).
复制代码


mprocess:run().

进程数量并没有增加,线程数量也没增加.

说明可能:
        1. spawn调用并不会产生windows操作系统级的进程.
        2. erlang的多进程"可能"是依赖windows操作系统的多线程为基础的(实际上这点有于时间关系还不能明确确认).
由于时间关系,没能做仔细的分析,因此还不能确认. 等有时间时在进一步确认一下.
lz或其他大拿若有时间也可仔细测试分析一下,并能把结论跟大家交流一下最好.

论坛徽章:
0
8 [报告]
发表于 2008-09-18 02:05 |只看该作者
原帖由 system888net 于 2008-9-17 22:17 发表



在windows2000下加载了erlang解释器(或虚拟机),他产生了一个进程.八个线程(双核的机器)
运行如下代码:

-module(mprocess).
     -export([run/0, say_string/2]).
     say_string(What, 0) -> don ...


恩 你的回答类型是我希望看到的
也和我的研究思路相同
谢谢 大家继续交流

[ 本帖最后由 blizzard213 于 2008-9-18 02:06 编辑 ]

论坛徽章:
0
9 [报告]
发表于 2008-09-19 17:48 |只看该作者
erlang对进程的定义重点是相互隔离,概念上和系统的进程、线程完全无关。

论坛徽章:
0
10 [报告]
发表于 2008-09-19 20:59 |只看该作者
原帖由 Magicloud 于 2008-9-19 17:48 发表
erlang对进程的定义重点是相互隔离,概念上和系统的进程、线程完全无关。

实现高并发难道可以完全不使用native进程 线程接口?
把c玩成魔法也不可能吧
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP