gpt4 book ai didi

c++ - getrusage 没有像我预期的那样工作

转载 作者:太空狗 更新时间:2023-10-29 21:16:13 26 4
gpt4 key购买 nike

我正在尝试使用以下代码通过 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 的值用于子内存使用。我不确定这是测量子进程内存使用情况的正确方法。即使我在分配 vector 之前在子进程中使用 RUSAGE_SELF 添加对 getrusage 的调用,ru_maxrss 的值保持不变。谁能告诉我在这里可以做得更好吗?

最佳答案

堆和自由存储的内部管理是实现定义的并且取决于底层操作系统。

通常出于性能原因,并非每次分配都会导致从 os 请求更多空间:标准库将汇集一些进程内存,并且只有在找不到足够大小的 block 时才会扩展池。

因此,我假设您尝试过的各种大小仍在开始时分配的几 MB 之内。您应该尝试非常大的分配以找到差异。

关于c++ - getrusage 没有像我预期的那样工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35811654/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com