gpt4 book ai didi

linux - fork() 和 execve() 效率

转载 作者:太空宇宙 更新时间:2023-11-04 04:55:14 25 4
gpt4 key购买 nike

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

Naife 示例:

没有执行

 [..some father code...]
int i;
if(!fork()) {
sum() //from an #include "porg.h"
}

使用execve

 [..some father code...]

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

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

最佳答案

仔细阅读一些关于 Linux 或 POSIX 编程的书,也许是旧的 ALP 。另请阅读intro(2) , fork(2) , execve(2) .

成功execve后,整个virtual address space您的process已被替换并重新初始化,根据 ELF已执行的可执行文件(请参阅 elf(5) ;因此 execve 除非失败,否则不会返回)。

因此,您的 sum 程序看不到执行它的前一个程序的任何内容(除了强制的 argvenviron,它们由 execve 复制)。顺便说一句,您对 execve 的使用是错误的。您应该提供一些 argv 数组和一些 environ 数组(两者都应该是非空的,argv 应该是非空的,并且都应该以 NULL 字符串结尾)...您通常会更喜欢一些 exec*(3)功能。

成功fork后,两个进程(子进程和父进程)都有自己的虚拟地址空间(最初,几乎相同的副本)。顺便说一句,您的代码忘记检查fork的失败。

The second in terms of memory allocation is better?

所以这个问题没有任何意义。整个“内存”(实际上是虚拟地址空间)已被重置并重新初始化(包括调用堆栈和堆)。

您可以使用 /proc/ 探索进程的虚拟地址空间。请参阅proc(5) 。尝试使用 cat/proc/$$/mapscat/proc/self/maps 来更好地了解虚拟地址空间。

也可以玩strace(1)了解system calls由某些程序或进程完成。尝试例如 strace date (另请参阅 this )。

than the same program executed without execve()

这是不可能的,因为 execve 是执行程序的唯一方式(当然 init 除外,今天称为 systemd - 请参阅 init(1) ,它在启动时由内核神奇地启动;以及其他一些奇怪的内核启动的进程......)

关于linux - fork() 和 execve() 效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48546755/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com