2016-03-05 56 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

相關問題