【问题标题】:Any better alternative to fork() and then execvp(" gcc program.c ")?有没有更好的替代 fork() 然后 execvp(" gcc program.c ")?
【发布时间】:2009-06-26 12:23:00
【问题描述】:

以下代码段在第一次运行时需要更多时间(5 秒),而在连续运行时需要更少时间(250 毫秒)。有没有更好的方法来执行 gcc。

int pid,status;
char * argv[] = {"gcc","program.c",NULL};
if(!(pid=fork())){
    execvp("gcc",argv);
}
while(pid!=wait(&status)){
    //do nothing
}

【问题讨论】:

  • 当然,有更好的方法...从风格上讲。使用 execlp,您将不需要单独的数组。 :-)

标签: gcc process exec fork


【解决方案1】:

嗯,我不这么认为。第一次使用 5 秒可能是从磁盘读取所有内容到内存的时间。编译器本身,要编译的源代码,要包含的头文件,要链接的库等等。它分散在整个磁盘上,因此磁盘头必须寻找很多。这很慢。

在您将所有数据缓存在 RAM 中之后,它只是解析和编译,并且可能成为 CPU 负载而不是磁盘 IO 限制。

【讨论】:

  • 有什么方法可以让 GCC 所需的所有数据始终缓存在 RAM 中,无论系统中的其他进程有多重?
  • 解决问题的硬件。更快的磁盘。更多内存。开发人员需要好的工具。您可以调整低级 I/O 调度。这是特定于系统的,我不知道如何在您使用的任何操作系统上执行此操作。
  • 如何在 Linux (uname -r ?) 上设置每个进程的磁盘 I/O 调度或内存缓冲是另一个问题的材料,可能在 superuser.com 启动后。
  • "uname -r" 给出 2.6.18-8.el5
【解决方案2】:

没有其他方法可以在不同的 Unix 版本上运行。要运行单独的进程,您必须使用 fork-exec - 这正是它们的用途。

【解决方案3】:

您还可以调用其他函数(std::system 就是其中之一),但它们通常最终被实现为 forkexec

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-06
    • 1970-01-01
    • 1970-01-01
    • 2010-12-07
    • 2021-12-29
    • 1970-01-01
    相关资源
    最近更新 更多