`
weiqingfei
  • 浏览: 315454 次
  • 性别: Icon_minigender_1
  • 来自: 黑洞
社区版块
存档分类
最新评论

进程创建速度

阅读更多
《Erlang Programming》这本书里给了一个测试大概的进程创建速度的程序,如下
myring.erl
-module(myring).
-export([start/1, start_proc/2]).

start(Num) ->
	start_proc(Num, self()).
start_proc(0, Pid) ->
	Pid ! ok;
start_proc(Num, Pid) ->
	NPid = spawn(?MODULE, start_proc, [Num-1, Pid]),
	NPid ! ok,
	receive ok -> ok end.

从程序中我们可以看出,这是个随创建随结束的过程,所以运行时,即使在启动shell时,没有指定最大进程数,也不会出现溢出错误。

那么在没有结束进程的情况下,创建速度又会是怎样的呢?

粗略的修改了下程序,如下
-module(myring1).
-export([start/1, start_proc/3]).

start(Num) ->
	spawn(?MODULE, start_proc, [Num-1,self(), self()]),
	receive ok -> ok end.
start_proc(0,NPid,Pid) ->
	Pid ! ok,
	NPid ! ok;
start_proc(Num,NPid,Pid) ->
	spawn(?MODULE, start_proc, [Num-1,self(),Pid]),
	receive ok -> 
		NPid ! ok,
		ok 
	end.


由于创建过程中没有销毁,所以在启动shell时要指定启动参数(3G内存所能启动进程数的级别就是100多万,所以指定200万足以)
werl.exe +P 2000000


测试结果
11> timer:tc(myring, start, [1400000]).
{2281000,ok}


13> timer:tc(myring1, start, [1400000]). 
{2484000,ok}

需要注意的是,由于myring1程序给shell的进程所发送msg多了一个,所以如果多次执行的话,要flush()一下。

从结果上来看140万的进程数,在途中没有结束进程的情况下,会多了0.2秒,虽然还不到10%(多次运行,结果相差不大)。
搞不清楚,多出的时间是由OS引起的,还是evm引起的。
分享到:
评论
6 楼 xuhuankeven 2010-08-20  
yufeng大师分析得厉害。。
5 楼 mryufeng 2009-09-05  
这个问题有4个点:

1. 创建process数据结构 是从内存池里申请出来的 需要开销, 你不销毁的话 这个池就没有意义了 大量的时间会在分配内存空间上。

2. 销毁一个进程的时候 要做很多撤销工作。 但是如果你的进程啥事情没做的话 那么撤销的开销基本上等于free一块内存。

3. 进程创建和销毁都会记录时间 这个需要涉及到去时间的系统调用

4. 和你的VM的类型很大关系 如果是beam.smp就会涉及大大量的锁争用。

所以可以说这个测试很不科学
4 楼 weiqingfei 2009-09-02  
奇怪了,在家里测试反而是,中间没有进行销毁的myring1的速度更快一些。

公司的机器是:AMD Athlon (2.8G?) 64位,3G内存,XP Pro系统,禁用虚拟内存
家里的机器:Core 2 E8400, 4G内存,Win7 RC系统,默认虚拟缓存。

是不是这个测试不够科学?

其实本来这个测试也没有什么必要性,我就是觉得,在创建的过程中同时也销毁,会影响创建速度。
3 楼 weiqingfei 2009-09-02  
mryufeng 写道
参考这篇 http://mryufeng.iteye.com/blog/433086


我上面的结果只是两个程序的比较,如果有系统调用的话,这两个程序应该都有,我不解的是两个结果的差距。
2 楼 mryufeng 2009-09-02  
参考这篇 http://mryufeng.iteye.com/blog/433086
1 楼 ray_linn 2009-09-02  
是伪进程吧?

相关推荐

    测试系统创建进程的极限

    合理地控制进程创建的速度和顺序是必要的。 3. **异常处理**:在创建进程中可能会遇到各种错误,如文件找不到、权限不足等,需要编写合适的错误处理代码。 4. **资源监控**:使用系统性能计数器(Performance ...

    生产者消费者算法模拟-(源码、课程设计说明书)

    设计一程序,由一个进程创建三个子进程,三个子进程一个是生产者进程,两个是消费者进程,且要求: 1、父子进程都使用父进程创建的共享存储区进行通信,由生产者进程将一个数组中的十个数值发送到由5个缓冲区组成的...

    获取某个进程的主窗口以及创建进程的程序名

    在Windows操作系统中,获取某个进程的主窗口以及创建该进程的程序名是常见的系统编程任务,这涉及到进程管理和窗口句柄操作。以下是如何实现这一功能的详细步骤。 首先,我们需要理解“进程”这个概念。在计算机...

    进程创建、控制与撤消.pdf

    进程创建的目的是为了满足用户的需求,提高系统的并发度和响应速度。 在实验中,学生可以通过编写程序来模拟进程的创建过程,例如,通过键盘输入进程的名称、大小、优先级等信息,然后系统将为其创建进程,并将进程...

    linux实验四 进程控制实验

    3. **进程创建方法**: 在Linux中,通常使用`fork()`系统调用来创建新进程。`fork()`会复制当前进程的所有资源,包括代码、数据、打开的文件等,创建出一个子进程。子进程和父进程拥有相同的程序计数器(PC),但...

    进程创建(南邮操作系统实验).pdf

    进程创建实验报告 一、进程创建系统调用 在操作系统中,进程创建是通过系统调用fork()实现的。fork()函数的作用是创建一个新的进程,该进程是当前进程的副本。fork()函数的返回值是整数,表示新创建的进程的标识符...

    获取电脑进程列表,显示各个进程的CPU,内存,上行速度,下载速度

    本文将深入探讨如何获取电脑的进程列表,展示每个进程的CPU使用率、内存占用、上行速度和下载速度,以及如何通过进程ID(PID)来结束进程。我们将特别关注使用WinPCAP库来捕获和分析进程的网络速率。 首先,让我们...

    进程创建,最后修改和最后一次打开的时间

    标题“进程创建,最后修改和最后一次打开的时间”涉及的是Prefetch文件中记录的关于进程的重要元数据,包括进程的创建时间、最后修改时间以及用户最后一次打开或交互的时间戳。 当一个程序首次运行时,Windows会...

    此代码示范了如何获取某个进程的主窗口以及创建此进程的程序名(19kb)

    在编程领域,尤其是在Windows操作系统环境下,有时我们需要获取进程的相关信息,比如它的主窗口句柄以及创建该进程的应用程序名称。这个任务通常涉及到进程管理和Windows API的使用。标题和描述所提及的代码示例展示...

    进程控制实验说明

    调用`fork()`会创建一个与父进程几乎完全相同的子进程,但子进程和父进程是两个独立的进程。 - **返回值**: - 在子进程中,`fork()`返回0。 - 在父进程中,`fork()`返回子进程的PID。 - 如果调用失败,则`fork...

    文件IO读取过程描述LINUX

    写时复制技术则是用来提高进程创建速度的,当父进程和子进程试图写共享页帧时会产生异常,这时需要为进程分配新的页帧。 在文件系统层面,Linux使用了Super_block、Inode、Dentry和File等结构。其中Super_block包含...

    多进程聊天室

    2. 服务器的多进程创建:如何使用`fork()`创建子进程,如何处理每个子进程的职责。 3. 共享内存的创建和使用:查看`shmget`、`shmat`等函数的调用,了解如何分配和访问共享内存。 4. 信号量的使用:如果存在,查看...

    Unix/linux进程池管理

    这种设计可以避免频繁的进程创建和销毁带来的性能开销,提高系统的响应速度和资源利用率。 **1. 进程池的工作原理** 进程池由一个主进程和若干工作进程组成。主进程负责接收客户端请求,根据池内工作进程的状态分配...

    Erlang中文手册

    Erlang的进程创建速度快,资源消耗低,适合构建高并发系统。 **错误处理与容错性** Erlang强调在设计时就考虑错误情况,采用“let it crash”原则。当一个进程崩溃时,其他进程不会受到影响,而是通过监控和链接...

    Linux环境下进程管理.doc

    由于进程的并发执行,屏幕上的显示结果可能会有各种排列,如"acb"或"abc",这取决于系统调度和进程执行的相对速度。 接着,实验中修改程序,使每个进程输出一句话而不是一个字符。在这种情况下,由于`printf()`函数...

    操作系统实验一:进程控制

    本实验旨在加深对进程概念的理解,掌握 Linux 操作系统的进程创建和终止操作,体会父进程和子进程的关系及进程状态的变化,并编写并发程序。 一、进程概念 在计算机科学中,进程是操作系统中最基本的执行单元。...

    windows多进程开发 启动程序,隐藏DOS窗口 创建一个进程等这个进程执行完毕再继续往下执行.zip

    本项目“创建一个进程等这个进程执行完毕再继续往下执行”似乎是一个示例应用,它展示了如何在C++环境中实现这样的功能,并且能够隐藏DOS窗口,提供更友好的用户体验。 首先,我们来看`StdAfx.cpp`和`StdAfx.h`这两...

    操作系统 进程通信

    2. **实现从一个父进程中创建两个子进程,并控制它们的执行顺序**:具体来说,要求能够使父进程创建出两个子进程后,先让这两个子进程完成各自的任务,然后再由父进程执行特定操作。这一过程涉及进程间的同步问题,...

    进程的软中断通讯!源代码

    在本案例中,源代码可能利用软中断来创建一种新的通信机制,可能是为了实现高速、低延迟的数据传输或者在特定硬件交互时提高效率。 软中断不同于硬中断,硬中断是由外部设备如I/O设备触发的,而软中断通常由内核...

    苏州大学操作系统实验二进程间通信李培峰班

    实验的主要目标是让父进程创建子进程,并实现两者之间的有效通信。首先,我们需要了解进程的创建。在Unix/Linux系统中,通常使用`fork()`函数来创建新进程。`fork()`会复制调用它的进程,返回两次,一次在父进程中...

Global site tag (gtag.js) - Google Analytics