为什么同一个进程运行两次不会使用完全相同的内存量?

时间:2017-03-27 17:22:49

标签: memory process ram deterministic

考虑MyProcess,这是一个纯粹的确定性过程。如果我多次运行此流程,请使用max memory来衡量usz time使用情况

time ./MyProcess
max memory:                86624 KB

time ./MyProcess
max memory:                85740 KB

time ./MyProcess
max memory:                86156 KB

RAM的使用量度量当然非常相似,但它们略有不同。是什么造成了这些差异?

  • 是因为最大内存计算为在多个点测量中随时间观察到的最大RAM使用量。最大内存实际上完全相同。
  • 是不是因为即使在确定性过程中,也会出现很小的差异,例如内存分配时可用的RAM
  • 其他原因......

仅供参考,我使用MACOSX 10.11.3

1 个答案:

答案 0 :(得分:1)

这很可能是由于地址空间布局随机化,即ASLR。

现代操作系统在每次新执行时移动并调整进程的内存布局,以便攻击者无法知道有趣地址的位置。

通常程序员不会注意到,除非通过使用内存的微小更改或所有指针都有不同的值(例如通过键入指针的哈希表导致不同的迭代顺序)。

这是一个Linux的示例程序,它也是ASLR:

#include <stdio.h>

int main() {
  char c;
  printf("Address: %lx\n", &c);
  return 0;
}

如果我们多次运行它,我们会看到不同的地址和内存使用情况:

$ gcc foo.c -o foo

$ command time -f 'Memory: %M' ./foo
Address: 7ffc1995f2df
Memory: 1288

$ command time -f 'Memory: %M' ./foo
Address: 7ffcdfd2427f
Memory: 1324

$ command time -f 'Memory: %M' ./foo
Address: 7ffe3022a23f
Memory: 1368

如果我们禁用ASLR(这是特定于Linux的,并且在OSX上不起作用):

sudo tee /proc/sys/kernel/randomize_va_space <<< 0

地址和已用内存始终相同:

$ command time -f 'Memory: %M' ./foo
Address: 7fffffffe4bf
Memory: 1272

$ command time -f 'Memory: %M' ./foo
Address: 7fffffffe4bf
Memory: 1272

$ command time -f 'Memory: %M' ./foo
Address: 7fffffffe4bf
Memory: 1272