я пытаюсь измерить объем памяти, используемый в дочернем процессе с помощью системы 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
Тогда, может быть, куча не учитывается? Вместо этого попробуйте создать глобальную переменную массива, чтобы увеличить размер сегмента данных. Или как насчет выполнения разных программ? –