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