论坛首页 综合技术论坛

关于探索Erlang轻量级进程的一点疑问

浏览 13411 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-10-29   最后修改:2010-10-29
小弟接触Erlang语言也快半年了,除了研究Erlang语法之余,突然对Erlang中的轻量级进程颇感兴趣,所以小小的研究了一下,遇到了不少疑问。

首先我觉得Erlang中的进程应该不是传统意义上的进程,通过$erl 命令开启的Erlang节点应该是一个传统意义的进程,而在此节点中spawn出来的进程应该都是线程,这样Erlang虚拟机才能自如的操控这些进程。

为了验证自己的想法,我就简单的测了一下。我用了《Erlang程序设计》中的代码:
start(Name) ->
    spawn(fun() -> loop(Name) end).

loop(Tag) ->
    sleep(),
    io:format("Hello, ~p~n",[Name]),
    loop(Tag).

sleep() ->
    receive
        after 3000 -> ture
    end.


启动Erlang后,etop工具显示有35个进程;
用ps axjf命令,多了一个:
PPID    PID    PGID    SID    TTY     TPGID   STAT   UID     TIME                            COMMAND
3282  4761  4761  3282 pts/1     4761     Sl+   1000    0:00  |   \_ /usr/lib/erlang/erts-5.7.4/bin/beam.smp -- -root 0/usr/lib/erlang -progname erl -- -home /home/user -- -sname user
它的父进程是bash;

用ps -eLf命令,多了:
UID           PID   PPID   LWP  C   NLWP   TTY          TIME          CMD
user        4761  3282  4801  0    7         pts/0    00:00:00
user        4761  3282  4809  0    7         pts/0    00:00:00
user        4761  3282  4810  0    7         pts/0    00:00:00
user        4761  3282  4811  0    7         pts/0    00:00:00
user        4761  3282  4812  0    7         pts/0    00:00:00
user        4761  3282  4813  0    7         pts/0    00:00:00
user        4761  3282  4814  0    7         pts/0    00:00:00
其中CMD均是/usr/lib/erlang/erts-5.7.4/bin/beam.smp -- -root /usr/lib/erlang -progname erl -- -home /home/user -- -sname user
他们的父进程是bash;

在erl shell中启动了代码之后(start(jim), start(kate)), etop中多了两个进程:
       Pid           Name or Initial Func    Time    Reds  Memory    MsgQ Current Function
<4959.64.0>    erlang:apply/2            456      162    2844            0           a:sleep/0          
<4959.62.0>    erlang:apply/2            424      162    2844            0           a:sleep/0



同时再用ps axjf,ps -eLf查看,但是没有任何新的进程或者线程!

所以,我就非常不解,spawn出来的两个进程在哪里?
   发表时间:2010-11-01  
erlang的进程和操作系统的进程线程2码事情。 它的进程是在虚拟机内部实现的。
0 请登录后投票
   发表时间:2010-11-02  
ls说的很对,其实从反面想一下,要操作系统开几万个进程是不太可能的,尤其是windows下,开几万个线程鸭梨也很大,但是erlang可以轻易做到。
0 请登录后投票
   发表时间:2010-11-02  
Ricepig 写道
ls说的很对,其实从反面想一下,要操作系统开几万个进程是不太可能的,尤其是windows下,开几万个线程鸭梨也很大,但是erlang可以轻易做到。



这个又不是什么新技术,值得大惊小怪么. 在Windows NT年代,就有一个叫纤程的概念了(Fiber,不是Thread),Fiber就是用户可控制的CPU时间片,(线程、进程都是OS控制的) 稍微转换一下概念,就是Erlang的进程的意思了。

0 请登录后投票
   发表时间:2010-11-02  
ray_linn 写道
Ricepig 写道
ls说的很对,其实从反面想一下,要操作系统开几万个进程是不太可能的,尤其是windows下,开几万个线程鸭梨也很大,但是erlang可以轻易做到。



这个又不是什么新技术,值得大惊小怪么. 在Windows NT年代,就有一个叫纤程的概念了(Fiber,不是Thread),Fiber就是用户可控制的CPU时间片,(线程、进程都是OS控制的) 稍微转换一下概念,就是Erlang的进程的意思了。



Fiber这东西 和 co-rountine有些类似。需要用户自行控制 切换时间,用得好 可以写出异步高效的程序来。


不过有些奇怪,.net上似乎没出现过这玩意。传闻当时 2.0的时候有人提出要加进去,最终也没看见。
0 请登录后投票
   发表时间:2010-11-02   最后修改:2010-11-02
mathgl 写道


Fiber这东西 和 co-rountine有些类似。需要用户自行控制 切换时间,用得好 可以写出异步高效的程序来。
不过有些奇怪,.net上似乎没出现过这玩意。传闻当时 2.0的时候有人提出要加进去,最终也没看见。



个人觉得主要是技术上有些难度,.NET的thread和OS的Thread是不同的,一个OS thread可能服务于多个.NET Thread,换句话说,OS Thread就是二房东,.NET Thread是三房东,但是Fiber只想从二房东那里租房子,不想听三房东的调遣,这样就会出现问题。(OS Thread和Fiber都是非托管的)

如果用C++,就没有这些问题了。。。

.NET 2.0虽然没有提供fiber,不过好歹给了个yield关键字,实现co-rountine的一点点东东。

在win7中提供了ums似乎比fiber更好控制一些
0 请登录后投票
   发表时间:2010-11-02  
erlang的进程和windows的fiber, lua的coroutine都是一个概念的东西,但是做的很彻底的只有erlang!
0 请登录后投票
   发表时间:2010-11-02  
不知道ruby的fiber和楼上提到的几个东西相比是个什么情况
0 请登录后投票
   发表时间:2010-11-02  
t0uch 写道
不知道ruby的fiber和楼上提到的几个东西相比是个什么情况



多态而已。
0 请登录后投票
   发表时间:2010-11-02  
mryufeng 写道
erlang的进程和windows的fiber, lua的coroutine都是一个概念的东西,但是做的很彻底的只有erlang!


UMS也很强。
0 请登录后投票
论坛首页 综合技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics