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



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

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

但是,如果只有几个应用程序确实需要它们,那么操作系统在每个进程的内存空间中复制所有这些它们不是有点开销和内存浪费吗? 还有别的原因我没有想到吗?

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

无论信息存储在何处,UNIX 进程模型都要求每个进程都有一个其 env var 的私有副本。这就是为什么,例如,你不能修改当前进程以外的任何进程的 env var。

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

最新更新