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

标签 linux operating-system environment-variables

我现在正在我的机器上使用 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/

相关文章:

python - 创建使用 Multiprocessing 和 Multiprocessing.Queues 的 linux 守护进程

python - 找不到目录时停止python程序关闭

Java 运行时与操作系统调用

swift - 我可以在 module.modulemap 中使用环境变量或波浪号吗?

bash - 如何在设置了多个环境变量的 bash 中启动命令

linux - 如何在 Ubuntu11.04 中使用 NASM 维护堆栈

linux - 设置 stty 参数

c++ - 将 C++ 从 Linux 移植到 Windows, '__aligned__'

operating-system - 如何判断 SP1 是否安装在 Windows Server 2008 R2 Standard 上?

c# - Environment.SetEnvironmentVariable 需要很长时间才能在用户或机器级别设置变量