锁定老帖子 主题:关于探索Erlang轻量级进程的一点疑问
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2010-10-29
最后修改:2010-10-29
首先我觉得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出来的两个进程在哪里? 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2010-11-01
erlang的进程和操作系统的进程线程2码事情。 它的进程是在虚拟机内部实现的。
|
|
返回顶楼 | |
发表时间:2010-11-02
ls说的很对,其实从反面想一下,要操作系统开几万个进程是不太可能的,尤其是windows下,开几万个线程鸭梨也很大,但是erlang可以轻易做到。
|
|
返回顶楼 | |
发表时间:2010-11-02
Ricepig 写道 ls说的很对,其实从反面想一下,要操作系统开几万个进程是不太可能的,尤其是windows下,开几万个线程鸭梨也很大,但是erlang可以轻易做到。
这个又不是什么新技术,值得大惊小怪么. 在Windows NT年代,就有一个叫纤程的概念了(Fiber,不是Thread),Fiber就是用户可控制的CPU时间片,(线程、进程都是OS控制的) 稍微转换一下概念,就是Erlang的进程的意思了。 |
|
返回顶楼 | |
发表时间:2010-11-02
ray_linn 写道 Ricepig 写道 ls说的很对,其实从反面想一下,要操作系统开几万个进程是不太可能的,尤其是windows下,开几万个线程鸭梨也很大,但是erlang可以轻易做到。
这个又不是什么新技术,值得大惊小怪么. 在Windows NT年代,就有一个叫纤程的概念了(Fiber,不是Thread),Fiber就是用户可控制的CPU时间片,(线程、进程都是OS控制的) 稍微转换一下概念,就是Erlang的进程的意思了。 Fiber这东西 和 co-rountine有些类似。需要用户自行控制 切换时间,用得好 可以写出异步高效的程序来。 不过有些奇怪,.net上似乎没出现过这玩意。传闻当时 2.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更好控制一些 |
|
返回顶楼 | |
发表时间:2010-11-02
erlang的进程和windows的fiber, lua的coroutine都是一个概念的东西,但是做的很彻底的只有erlang!
|
|
返回顶楼 | |
发表时间:2010-11-02
不知道ruby的fiber和楼上提到的几个东西相比是个什么情况
|
|
返回顶楼 | |
发表时间:2010-11-02
t0uch 写道 不知道ruby的fiber和楼上提到的几个东西相比是个什么情况
多态而已。 |
|
返回顶楼 | |
发表时间:2010-11-02
mryufeng 写道 erlang的进程和windows的fiber, lua的coroutine都是一个概念的东西,但是做的很彻底的只有erlang!
UMS也很强。 |
|
返回顶楼 | |