ELF执行期间的Linux内存/磁盘行为

时间:2017-04-04 14:22:06

标签: linux elf

我在群集上运行一系列可执行文件,在执行开始时读取一些小配置文件,然后进行大量处理几个小时,然后写出一些数据并退出。我们的系统管理员试图告诉我,我们的文件服务器非常慢,因为他的分析显示集群节点花费所有时间使用ELF可执行文件中的NFS磁盘I / O读取执行,很久之后它们已经生成(注意:我们的可执行文件只有几MB大小)。这对我来说听起来并不合适,因为我的印象是动态链接器在运行时将整个可执行文件加载到内存中,然后在内存中运行。我知道内核在运行时会向可执行文件留下一个打开的文件描述符,但我并不认为它是在不断读取它。

我的问题是,我对可执行文件如何加载存在缺陷有所了解吗?我发现很难相信内核不断对可执行文件进行文件读取以获取指令,因为这会非常慢(即使使用缓存)因为分支预测几乎不可靠,所以你要花费很长时间才能阅读如果您的二进制文件频繁跳转,则从磁盘执行。

1 个答案:

答案 0 :(得分:1)

  

我的印象是动态链接器在运行时将整个可执行文件加载到内存中,然后在内存中运行。

您的印象不正确。

首先,一个小的不准确:当动态链接器负责加载共享库时,主动态加载器启动之前,内核会加载主可执行文件。< / p>

其次,大多数当前系统使用demand paging。这些文件是mmap,但在访问该代码(即尝试执行)之前,代码实际上并未加载到内存中。如果你从不执行程序的某些部分,那么这些部分永远不会加载到内存中。

  

我发现很难相信内核不断对可执行文件进行文件读取以获取指令

它不会经常这样做。它通常将代码加载到内存中,代码保留在那里

在没有足够内存的系统上(这称为颠簸),可能会从内存中丢弃代码(如果再次执行则需要重新加载代码)。

  

因为分支预测几乎不可靠,

分支预测

  1. 与您的问题几乎没有任何关系,
  2. 在现代CPU上非常