当前位置: 首页 > 面试题库 >

execv()和fork()的时间浪费

东郭弘
2023-03-14
问题内容

我目前正在学习fork()execv()并且对组合的效率存在疑问。

向我显示了以下标准代码:

pid = fork();
if(pid < 0){
    //handle fork error
}
else if (pid == 0){
    execv("son_prog", argv_son);
//do father code

我知道这会fork()克隆整个过程(复制整个堆等),并execv()用新程序替换当前地址空间。考虑到这一点,使用该组合是否会导致效率低下?我们正在复制进程的整个地址空间,然后立即覆盖它。

所以我的问题是:
即使我们浪费了,使用此组合(而不是其他解决方案)有什么好处呢?


问题答案:

使用此组合(而不是其他解决方案)有什么好处,即使我们有浪费,该组合仍然可以使人们继续使用它?

您必须以某种方式创建一个新流程。用户空间程序很少有实现此目的的方法。POSIX曾经有vfork()alognside
fork(),并且某些系统可能具有自己的机制,例如特定于Linux的机制clone(),但是自2008年以来,POSIX仅指定fork()posix_spawn()系列。该fork+
exec路线是比较传统的,是很好理解的,并且有一些缺点(见下文)。该posix_spawn系列专为 特殊用途的
替代品的使用环境中,对于目前的困难fork();
您可以在其规格的

规格
”部分中找到详细信息。

Linux手册页中的以下摘录vfork()可能很有启发性:

在Linux下,fork(2)是使用写时复制页面实现的,因此fork(2)唯一的代价就是复制父级的页表并为子级创建唯一的任务结构所需的时间和内存。但是,在过去的糟糕日子中,fork(2)通常需要不必要地制作呼叫者数据空间的完整副本,因为通常在此之后立即exec完成(3)。因此,为了提高效率,BSD引入了vfork()系统调用,该系统调用没有完全复制父进程的地址空间,而是借用了父进程的内存和控制线程,直到发生对execve(2)的调用或退出。当孩子使用其资源时,父进程被暂停。指某东西的用途vfork()很棘手:例如,在父进程中不修改数据取决于知道哪些变量保存在寄存器中。

(已强调)

因此,您对浪费的担忧在现代系统(不限于Linux)中没有充分的根据,但是从历史上看确实是一个问题,并且确实有一些机制可以避免这种情况。如今,这些机制大多数已过时。



 类似资料:
  • 问题内容: 我正在尝试使用此C代码连续运行两个可执行文件: 尽管有分叉,但在第一个execv()调用之后,程序将退出,它永远不会到达第二个execv()。我试过在第一次fork之后调用wait(),但是我不确定那是缺少的内容。 有什么想法为什么在孩子退出后控制权不返回给父母? 问题答案: 你有几个问题。首先,如果只想运行两个程序,则只需调用一次。然后在父进程中运行一个程序,在子进程中运行一个程序。

  • execv(执行文件) 相关函数 fork,execl,execle,execlp,execve,execvp 表头文件 #include<unistd.h> 定义函数 int execv (const char * path, char * const argv[ ]); 函数说明 execv()用来执行参数path字符串所代表的文件路径,与execl()不同的地方在于execve()只需两个参

  • execv 执行文件 相关函数 fork,execl,execle,execlp,execve,execvp 表头文件 #include<unistd.h> 定义函数 int execv(const char *path, char *const argv[]); 函数说明 execv()用来执行参数path字符串所代表的文件路径,与execl()不同的地方在于execve()只需两个参数,第

  • 问题内容: 我一直想在Google上找到这四个之间的区别,我希望这方面会有大量的信息,但是这四个调用之间确实没有任何可靠的比较。 我着手尝试汇编一下这些系统调用之间的区别的基本概况,这就是我得到的。所有这些信息是否正确/我是否缺少任何重要信息? :fork调用基本上是对当前过程进行复制,几乎在所有方面都相同(例如,并非在某些实现中都复制了所有内容,例如,在某些实现中资源有限,但其想法是创建尽可能近

  • 问题内容: 我一直以为并且是完全相同的,因此可以互换使用。今天,当我尝试在共享服务器上安装与memcached的python绑定 pylibmc时 ,使用的错误给了我,但没有给我 。我想说明原因。 libmemcached 是 pylibmc 的要求。我在主目录下安装了 libmemcached, 因为服务器上没有root。结果,要安装 pylibmc ,我需要确保安装脚本知道在哪里可以找到 li

  • 本文向大家介绍浏览和冲浪之间的区别,包括了浏览和冲浪之间的区别的使用技巧和注意事项,需要的朋友参考一下 浏览 浏览是指没有任何事先目的或目标的网站访问。用户通常浏览互联网时,会注意到他/她需要的信息。 冲浪 冲浪是指使用搜索引擎搜索特定信息。冲浪通常比浏览耗时,因为用户倾向于在Web上搜索和定位所需的信息。 以下是浏览和冲浪之间的重要区别。 序号 键 浏览 冲浪 1 使用完成 使用网络浏览器进行浏