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

Memory 为什么运行两次的同一进程不使用完全相同的内存量?,memory,process,ram,deterministic,Memory,Process,Ram,Deterministic,考虑一下MyProcess,这是一个纯粹的确定性过程。如果我使用usz time测量max memory使用情况,多次运行此过程,我会得到 time ./MyProcess max memory: 86624 KB time ./MyProcess max memory: 85740 KB time ./MyProcess max memory: 86156 KB 当然,RAM使用的度量方法非常相似,

考虑一下
MyProcess
,这是一个纯粹的确定性过程。如果我使用
usz time
测量
max memory
使用情况,多次运行此过程,我会得到

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这很可能是由于地址空间布局随机化,也称为ASLR

现代操作系统会在每次新执行时移动和洗牌进程的内存布局,以便攻击者不知道感兴趣的地址在哪里

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

下面是一个Linux示例程序,它也执行ASLR:

#include <stdio.h>

int main() {
  char c;
  printf("Address: %lx\n", &c);
  return 0;
}
如果我们禁用ASLR(这是特定于Linux的,在OSX上不起作用),请执行以下操作:

$ 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
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