Chinaunix

标题: 请教进程fork()相关的,执行效率的问题,看我这段程序. [打印本页]

作者: harry_li    时间: 2004-08-12 09:00
标题: 请教进程fork()相关的,执行效率的问题,看我这段程序.
//parsepsml.c  main()中一段
docname = argv[1];
docname1 = argv[2];
pid=fork();
if (pid<0)
{
  printf("fork error\n";
  exit(1);
  }
else if (pid==0)
{
   parseDoc (conn,docname);  //解析docname文件,然后存入数据库
  printf("%s/n",docname);
  }
else
  {
     parseDoc(conn,docname1); ////解析docname1文件,然后存入数据库
    printf("%s/n",docname1);
   }
  exit(0);
------
程序测试结果,解析两个文件入库的时间约为130秒,而我没有用fork()的时候,单独解析一个文件入库的时间约为70秒.我在想用fork()进程怎么效率没见的提高阿?还是我的程序写的有问题?还有,我从数据库插入的纪录来看,用fork的时候,并不是两个文件交叉插入的.这就没有体现并行执行的效果嘛.
作者: harry_li    时间: 2004-08-12 10:24
标题: 请教进程fork()相关的,执行效率的问题,看我这段程序.
请大家帮忙看看,第一次用fork不是很懂
作者: henngy    时间: 2004-08-12 11:01
标题: 请教进程fork()相关的,执行效率的问题,看我这段程序.
不是已经节省了10秒?文件多的话,,就能体现出来了
作者: harry_li    时间: 2004-08-12 11:14
标题: 请教进程fork()相关的,执行效率的问题,看我这段程序.
哦.我这个程序应该没有问题吧.我现在想不通的是,存入数据库的时候为什么没有并发执行存入呢.从数据库的纪录看,分明是先执行第一个文件的存入,然后在执行第二个文件的存入.
另外如果我再fork一个的话,实现三个文件的同时执行,是不是在子进程中再fork()一下??谢谢
作者: aero    时间: 2004-08-12 12:33
标题: 请教进程fork()相关的,执行效率的问题,看我这段程序.
随便,也可以在父进程继续fork。注意好好写fork啊,不然很容易让机器当掉的。
作者: harry_li    时间: 2004-08-12 12:51
标题: 请教进程fork()相关的,执行效率的问题,看我这段程序.
现在我用了3个进程,但是感觉执行效率上面并没多少提高阿.你们用多进程的时候效率能提高多少阿?
作者: aXe    时间: 2004-08-12 17:17
标题: 请教进程fork()相关的,执行效率的问题,看我这段程序.
问题在于数据库
让不让你并发的写入。。。。
作者: harry_li    时间: 2004-08-12 17:51
标题: 请教进程fork()相关的,执行效率的问题,看我这段程序.
哦是吗?有可能.你用过postgresql嘛?那数据库这端是不是可以设置,允许用户并发的插入数据??
作者: harry_li    时间: 2004-08-12 22:37
标题: 请教进程fork()相关的,执行效率的问题,看我这段程序.
可是我看了一些postgresql的资料,肯定可以支持100个并发进程以上阿.总不可能不容许并发插入阿
作者: A0110A    时间: 2004-08-12 22:50
标题: 请教进程fork()相关的,执行效率的问题,看我这段程序.
你只有一个cpu ,再快也快不到哪里去阿
作者: JohnBull    时间: 2004-08-13 02:36
标题: 请教进程fork()相关的,执行效率的问题,看我这段程序.
[quote]原帖由 "A0110A"]你只有一个cpu ,再快也快不到哪里去阿[/quote 发表:


没错,况且数据插入这种IO密集型的应用即使在SMP下也未必高效.
SMP对运算密集型应用更有效.

要想高效,想办法升级外存硬件吧.比如使用硬件RAID0或者50.
作者: harry_li    时间: 2004-08-13 08:37
标题: 请教进程fork()相关的,执行效率的问题,看我这段程序.
原帖由 "JohnBull" 发表:


没错,况且数据插入这种IO密集型的应用即使在SMP下也未必高效.
SMP对运算密集型应用更有效.

要想高效,想办法升级外存硬件吧.比如使用硬件RAID0或者50.

我想应该不是硬件的问题吧.我的也是服务器配置阿,2cpu+1G内存.不过没有使用RAID0.照例来说应该性能还可以的.我觉得是不是程序上面有问题阿?
或者要线程来做?
作者: weichongli    时间: 2004-08-13 08:45
标题: 请教进程fork()相关的,执行效率的问题,看我这段程序.
小弟刚刚接角虫C哦,我有一个问题,
上面那段程序,父进程没有使用wait/waitpid,这样,如果父进程先处理完了,子进程就变成Z状态的了,那样的话,系统是不是还是另外花时间来处理这个问题哦?
另外,那个exit(0)是不是改成_exit(0)更保险一些啊?
请各位不吝赐教....
作者: aero    时间: 2004-08-13 12:01
标题: 请教进程fork()相关的,执行效率的问题,看我这段程序.
_exit(0)怎么会比exit(0)保险呢?
作者: weichongli    时间: 2004-08-13 12:20
标题: 请教进程fork()相关的,执行效率的问题,看我这段程序.
因为,子进程和父进程共用一些东西,如果子进程先用exit()退出那么,父进程上的一些资源也会被exit()给关掉,是不是这样的?
作者: aero    时间: 2004-08-13 12:31
标题: 请教进程fork()相关的,执行效率的问题,看我这段程序.
你做过实验了吗?我刚做过,实践证明,exit是会退出当前进程,和父进程没有关系。

呵呵,仔细一想,确实。进程开辟出来后就是不相关的两个了。父子,其实也和兄弟差不多。而且,如果子进程可以exit掉父进程的话,那么任何一个调用exit的程序都能exit掉shell的进程啊!推理下去,呵呵,任何一个exit似乎都可以让UNIX崩溃了。
作者: weichongli    时间: 2004-08-13 12:57
标题: 请教进程fork()相关的,执行效率的问题,看我这段程序.
没做实验,我在WINDOWS里用电驴下了两周东西,
只是,从理论上讲,父子进程共用数据区,包括标准I/O流,用exit()退出的时候,可能会把父进程的I/O也给关掉呵呵,多谢指教。
作者: aero    时间: 2004-08-13 13:20
标题: 请教进程fork()相关的,执行效率的问题,看我这段程序.
原帖由 "weichongli" 发表:
没做实验,我在WINDOWS里用电驴下了两周东西,
只是,从理论上讲,父子进程共用数据区,包括标准I/O流,用exit()退出的时候,可能会把父进程的I/O也给关掉呵呵,多谢指教。


公用数据区?是因为子进程把父进程的环境统统copy了一份,所以看起来一样。JohnBull老大发过一个测试程序。就讲了这个问题。缓冲区也是复制了的。

  1. #include <stdio.h>;
  2. #include <stdlib.h>;
  3. #include <sys/types.h>;

  4. int main(int argc,char *argv[]) {]
  5.     printf("hello");
  6.     fork();
  7.     printf("\n");
  8.     return 0;
  9. }


复制代码


你看看这个测试程序会打印几次hello。IO流都是行缓冲的。
作者: harry_li    时间: 2004-08-13 17:28
标题: 请教进程fork()相关的,执行效率的问题,看我这段程序.
用了fork()还是觉得没有并行插入数据库.看到的明明是子进程执行完再执行父进程的.今天有测试了以下程序,也是没有并行的执行:程序如下:
pid=fork();
if (pid<0)
{
printf("fork error\n";
exit(1);
}
if (pid==0)
{
//parseDoc (conn,docname);
int i;
for(i=0;i<30;i++)
{ printf("%d\n",2*i+1);}

}
else
{
// parseDoc(conn,docname1);
int j;
for(j=0;j<30;j++)
{
printf("%d\n",2*j);}
}
exit(0);
---------
执行结果是先打印奇数的,再打印偶数的.并没有交叉的打印阿
作者: aXe    时间: 2004-08-13 17:47
标题: 请教进程fork()相关的,执行效率的问题,看我这段程序.
你这样根本测不出来,因为运行的太快.
你加上个sleep试试.
作者: harry_li    时间: 2004-08-14 10:53
标题: 请教进程fork()相关的,执行效率的问题,看我这段程序.
在哪里加上sleep??子进程嘛???
作者: xstart    时间: 2004-08-17 22:42
提示: 作者被禁止或删除 内容自动屏蔽
作者: JohnBull    时间: 2004-08-18 13:39
标题: 请教进程fork()相关的,执行效率的问题,看我这段程序.
原帖由 "harry_li" 发表:

我想应该不是硬件的问题吧.我的也是服务器配置阿,2cpu+1G内存.不过没有使用RAID0.照例来说应该性能还可以的.我觉得是不是程序上面有问题阿?
或者要线程来做?


What is "性能"?? What is "服务器配置"????
Does disk I/O perfoemance get benifits from SMP??




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2