【问题标题】:Why are all environment variables loaded into the stack of a process?为什么所有环境变量都加载到进程的堆栈中?
【发布时间】:2020-04-08 03:12:44
【问题描述】:

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

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

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

【问题讨论】:

  • 也许 TOS 的某些页面是被映射进来的,而不是被复制的?

标签: linux operating-system environment-variables


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-19
    • 2019-04-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多