我试图衡量内存通过使用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
那么也许这堆不算?尝试创建全局数组变量,以增加数据段大小。或者如何执行不同的程序? –