首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >叉子()和execve()效率

叉子()和execve()效率
EN

Unix & Linux用户
提问于 2018-01-31 14:44:37
回答 2查看 917关注 0票数 -1

就内存分配效率而言,正确的说法是,在子代码中的fork()之后,如果我使用execve()执行程序,这将比没有execve()的相同程序更有效,因为子程序不会分配父程序的堆栈和堆,而只是自己的?

奈夫例子:

无解

代码语言:javascript
复制
 [..some father code...]
int i;
if(!fork()) {
 sum() //from an #include "porg.h"
}

带着

代码语言:javascript
复制
 [..some father code...]

if(!fork()) {
 execve("sum", NULL, NULL); //sum is a program which executes i=2+3
}

第二种在内存分配方面更好?最好是替换我的进程的整个虚拟地址空间,还是用调用另一个程序中的函数来运行上述代码,该函数包含在#include "prog“中,包括so所执行的操作数量以及在执行程序期间所携带的内存?

EN

回答 2

Unix & Linux用户

回答已采纳

发布于 2018-01-31 18:16:16

这样做是不对的。sum和叉子节点都没有显式地使用堆。但是在sum中,C运行时可能会在程序启动时初始化一些堆结构。堆栈也有类似的可能性。

然而,这是一个值得思考的合理问题。如果父进程在子进程运行时也在修改内存,那么子进程将承载所有修改后的内存的副本(在写上复制)。通常,子任务正在执行子任务,并且只使用该数据的一个子集。

对于更大的父进程和运行时间较长的子进程,它可能很重要。

票数 1
EN

Unix & Linux用户

发布于 2018-01-31 17:49:26

第一个片段中的if中的代码包含一个加法和一个赋值。这是尽可能简单的,它将编译成机器代码中的两条指令。

在第二个例子中,有一堆参数加载并推送到堆栈,一个函数调用,一些由libc进行的内部处理,这涉及到将参数移动到系统调用的正确位置,然后系统调用自己。

系统调用需要切换到内核模式(无论花费多少,取决于系统),在内核中查找以找到实际处理的系统调用,然后执行程序sum。执行程序需要找到包含程序的文件,将其加载到内存中(可能是等待磁盘),解释ELF头以知道将程序的每个部分放在内存中的位置,设置一些内存映射,可能是页表等等。

我猜你知道这个主意了。

票数 2
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/420979

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档