gpt4 book ai didi

linux - 为什么所有环境变量都加载到进程的堆栈中?

转载 作者:行者123 更新时间:2023-12-04 16:33:53 24 4
gpt4 key购买 nike

我现在正在我的机器上使用 gdb 探索一个简单的 ELF 二进制文件。
如果我没看错的话,所有环境变量都会被加载到进程的堆栈中。

我假设它们是提供给用户应用程序的,以防开发人员或某些 libc 函数(例如 execve)需要它们。

但是,如果只有几个应用程序真正需要它们,操作系统将它们全部复制到每个进程的内存空间中,这不是一点点开销和内存浪费吗?
可能还有其他我没有想到的原因吗?

最佳答案

将变量放置在堆栈上是一个实现细节。它们本可以存放在其他地方;例如,附加到定义每个进程属性的内核结构。它们被放在堆栈上,因为这意味着如果系统内存不足,可以将信息换出(例如,交换空间)。

无论信息存储在何处,UNIX 进程模型都要求每个进程都有其环境变量的私有(private)副本。这就是为什么,例如,您不能修改除当前进程之外的任何进程的环境变量。

内存开销是您应该最小化环境变量数量的原因之一。我见过人们定义了一千多个 env var,坦率地说,这是荒谬的,也是对 env var 机制的滥用。在我的交互式 shell 中定义的 47 个环境变量需要 2050 字节的内存;这几乎是 4 KiB 内存页面的 1/2。这是一个无关紧要的内存量。

关于linux - 为什么所有环境变量都加载到进程的堆栈中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59343364/

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