考虑MyProcess
,这是一个纯粹的确定性过程。如果我多次运行此流程,请使用max memory
来衡量usz time
使用情况
time ./MyProcess
max memory: 86624 KB
time ./MyProcess
max memory: 85740 KB
time ./MyProcess
max memory: 86156 KB
RAM的使用量度量当然非常相似,但它们略有不同。是什么造成了这些差异?
仅供参考,我使用MACOSX 10.11.3
答案 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