就内存分配效率而言,正确的说法是,在子代码中的fork()之后,如果我使用execve()执行程序,这将比没有execve()的相同程序更有效,因为子程序不会分配父程序的堆栈和堆,而只是自己的?
奈夫例子:
无解
[..some father code...]
int i;
if(!fork()) {
sum() //from an #include "porg.h"
}带着
[..some father code...]
if(!fork()) {
execve("sum", NULL, NULL); //sum is a program which executes i=2+3
}第二种在内存分配方面更好?最好是替换我的进程的整个虚拟地址空间,还是用调用另一个程序中的函数来运行上述代码,该函数包含在#include "prog“中,包括so所执行的操作数量以及在执行程序期间所携带的内存?
发布于 2018-01-31 18:16:16
这样做是不对的。sum和叉子节点都没有显式地使用堆。但是在sum中,C运行时可能会在程序启动时初始化一些堆结构。堆栈也有类似的可能性。
然而,这是一个值得思考的合理问题。如果父进程在子进程运行时也在修改内存,那么子进程将承载所有修改后的内存的副本(在写上复制)。通常,子任务正在执行子任务,并且只使用该数据的一个子集。
对于更大的父进程和运行时间较长的子进程,它可能很重要。
发布于 2018-01-31 17:49:26
第一个片段中的if中的代码包含一个加法和一个赋值。这是尽可能简单的,它将编译成机器代码中的两条指令。
在第二个例子中,有一堆参数加载并推送到堆栈,一个函数调用,一些由libc进行的内部处理,这涉及到将参数移动到系统调用的正确位置,然后系统调用自己。
系统调用需要切换到内核模式(无论花费多少,取决于系统),在内核中查找以找到实际处理的系统调用,然后执行程序sum。执行程序需要找到包含程序的文件,将其加载到内存中(可能是等待磁盘),解释ELF头以知道将程序的每个部分放在内存中的位置,设置一些内存映射,可能是页表等等。
我猜你知道这个主意了。
https://unix.stackexchange.com/questions/420979
复制相似问题