运行速度linux快还是Windows,转--Linux和Windows创建进程速度比较

#include

#define NUM 1000 void* callback(void* p) { return NULL; } int main() { pthread_t tid; struct timeval begin, end; int i; int ret; gettimeofday(&begin, NULL); for (i = 0; i < NUM; ++i) { //创建线程 ret = pthread_create(&tid, NULL, (void*)callback, NULL); if (ret == -1) { perror("pthread_create"); } } gettimeofday(&end, NULL); printf("%dms\n", ((end.tv_sec - begin.tv_sec) * 1000000 + end.tv_usec - begin.tv_usec) / 1000); return 0; } 创建1000个线程仅需29ms左右,系统调用统计如下。可以发现主要的时间都花在mmap2系统调用了,clone仅仅调用380个左右,有点奇怪。 ?View Code TEXT % time seconds usecs/call calls errors syscall ------ ----------- ----------- --------- --------- ---------------- 100.00 0.000306 0 1011 620 mmap2 0.00 0.000000 0 2 read 0.00 0.000000 0 1 write 0.00 0.000000 0 3 open 0.00 0.000000 0 3 close 0.00 0.000000 0 1 execve 0.00 0.000000 0 4 4 access 0.00 0.000000 0 3 brk 0.00 0.000000 0 2 gettimeofday 0.00 0.000000 0 1 munmap 0.00 0.000000 0 380 clone 0.00 0.000000 0 1 uname 0.00 0.000000 0 385 mprotect 0.00 0.000000 0 2 rt_sigaction 0.00 0.000000 0 1 rt_sigprocmask 0.00 0.000000 0 1 getrlimit 0.00 0.000000 0 4 fstat64 0.00 0.000000 0 2 1 futex 0.00 0.000000 0 1 set_thread_area 0.00 0.000000 0 1 set_tid_address 0.00 0.000000 0 1 set_robust_list ------ ----------- ----------- --------- --------- ---------------- 100.00 0.000306 1810 625 total 昨天同三百同学交流了下,他马上就看了glibc中相关的源代码,然后就发现当mmap2调用失败的情况下,就不会再调用clone了。这样确实吻合得很好,因为mmap2调用失败的次数(620)和clone的调用次数(380)加起来刚好是1000次。这里调用mmap2多于1000次,多出来的应该是加载动态库导致的。pthread_create调用成功返回0,否者返回一个非零值,这点同一般的系统调用和库函数调用失败返回-1不一样,所以上面代码判断返回值为-1认为调用失败是错误的。正确的情况应该是判断返回值是否为非零值。经过测试,发现在我的机器上一个进程最多只能创建300多个线程。在使用Intel Xeon E5420(64位CPU,内存8GB)的RHEL AS 4服务器上创建10000个线程都没有问题。 这篇文章参照了windows和linux进程启动速度比较,不过原文中有一些不妥之处: 1、使用System启动子程序。Linux下System函数会创建子进程,这样Linux创建的进程比Windows多了一倍。应该使用exec系统调用。 2、子程序代码偏多,使用malloc和free等库函数,干扰了实验结果。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值