我試圖衡量內存通過使用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左右打印一個值。我不確定這是測量子進程內存使用情況的正確方法。即使我在子進程矢量分配前添加調用getrusage
與RUSAGE_SELF
的ru_maxrss
值保持不變。有人能告訴我我能在這裏做得更好嗎?
嘗試添加一些隨機化到矢量大小,它可能會改變。否則,子進程的大小和它的堆一直是一樣的。 –
@JoachimPileborg對不起,不清楚。每次我運行程序時,我一直在改變'vector :: resize()'的參數,輸出仍然是一樣的... – Curious
那麼也許這堆不算?嘗試創建全局數組變量,以增加數據段大小。或者如何執行不同的程序? –