2016-03-05 76 views
2

我试图衡量内存通过使用getrusage系统调用所使用的子进程用下面的代码的getrusage不工作,我期望

#include <iostream> 
using std::cout; 
using std::endl; 
#include <unistd.h> 
#include <thread> 
#include <chrono> 
#include <sys/wait.h> 
#include <sys/time.h> 
#include <sys/resource.h> 
#include <cassert> 
#include <vector> 

int main() { 

    auto child_pid = fork(); 
    if (!child_pid) { 
     cout << "In child process with process id " << getpid() << endl; 
     cout << "Child's parent process is " << getppid() << endl; 
     std::this_thread::sleep_for(std::chrono::seconds(2)); 

     std::vector<int> vec; 
     vec.resize(10000); 
     for (auto ele : vec) { 
      cout << ele << endl; 
     } 

    } else { 
     // this will wait for the child above to finish 
     waitpid(child_pid, nullptr, 0); 
     struct rusage usage; 
     int return_val_getrusage = getrusage(RUSAGE_CHILDREN, &usage); 
     assert(!return_val_getrusage); 
     cout << "Memory used by child " << usage.ru_maxrss << endl; 
    } 

    return 0; 
} 

我不断变化的内存量,我分配量通过在vector::resize()调用中加入不同的参数。但是,对于儿童的内存使用情况,总是会在2300左右打印一个值。我不确定这是测量子进程内存使用情况的正确方法。即使我在子进程矢量分配前添加调用getrusageRUSAGE_SELFru_maxrss值保持不变。有人能告诉我我能在这里做得更好吗?

+0

尝试添加一些随机化到矢量大小,它可能会改变。否则,子进程的大小和它的堆一直是一样的。 –

+0

@JoachimPileborg对不起,不清楚。每次我运行程序时,我一直在改变'vector :: resize()'的参数,输出仍然是一样的... – Curious

+0

那么也许这堆不算?尝试创建全局数组变量,以增加数据段大小。或者如何执行不同的程序? –

回答

2

堆和的FreeStore的内部管理被实现定义和依赖于底层操作系统。

通常出于性能的考虑不是每个分配将导致从操作系统请求更多的空间:标准库将汇集一些进程的内存,并会延长只有当没有足够大小的块,发现池。

因此我假设varrying大小你试过仍是夫妇开始分配MB的范围内。你应该尝试真正的大分配来找出差异。

+0

谢谢你的回答!这说得通。不过,我还有一个问题 - 通过“正确”的方式来衡量内存使用情况,我花了相当长的一段时间才弄清楚。即使在堆栈溢出问题上广泛研究这样的问题之后,也很难找到正确的手册页。一个人应该如何解决像这个一般的系统问题的答案? – Curious

+0

有人比我更有经验可能会更好! – Curious

+0

我只测量当前进程的使用情况。如果你想从操作系统的角度来看内存分配(即分配给进程的内存与可用的内存),使用'getrusage()'是完全有效的。如果你想对你的代码使用的内存进行细粒度的分析,你需要使用一些工具/库来进行内存调试(例如:[Valgrind](http://www.cprogramming。com/debugging/valgrind.html),MemTrack或[others](http://stackoverflow.com/questions/438515/how-to-track-memory-allocations-in-c-especially-new-delete) – Christophe

相关问题