【问题标题】:Why does the same process ran twice does not use exactly the same quantity of memory?为什么同一个进程运行两次不使用完全相同数量的内存?
【发布时间】:2017-03-27 17:22:48
【问题描述】:

考虑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

【问题讨论】:

    标签: memory process ram deterministic


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2013-12-26
      • 1970-01-01
      • 2019-01-02
      • 2017-01-04
      • 2017-08-03
      • 2017-09-16
      • 2014-10-09
      相关资源
      最近更新 更多