Maison >développement back-end >C++ >Comment obtenir de manière fiable l'utilisation de la mémoire d'exécution C sous Linux ?

Comment obtenir de manière fiable l'utilisation de la mémoire d'exécution C sous Linux ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-02 16:35:11293parcourir

How to Reliably Get C   Runtime Memory Usage on Linux?

Comment obtenir des informations sur l'utilisation de la mémoire lors de l'exécution à l'aide de C

Introduction

Surveillance de l'utilisation de la mémoire est crucial pour optimiser les performances du programme et prévenir les fuites de mémoire. En C, obtenir des informations en temps réel sur la consommation de mémoire peut être essentiel à diverses fins de débogage et d'optimisation.

Énoncé du problème

L'OP a tenté d'utiliser getrusage() pour récupérer les statistiques d'utilisation de la mémoire (VIRT et RES) pendant l'exécution du programme mais rencontrer systématiquement zéro valeurs.

Solution

Sur les systèmes Linux, récupérer l'utilisation de la mémoire via ioctl() peut être difficile. Au lieu de cela, une approche plus fiable consiste à accéder aux informations à partir des fichiers dans /proc/pid. L'extrait de code C suivant montre comment implémenter cette approche :

#include <unistd.h>
#include <ios>
#include <iostream>
#include <fstream>
#include <string>

void process_mem_usage(double& vm_usage, double& resident_set) {
  using namespace std;
  ifstream stat_stream("/proc/self/stat", ios_base::in);

  // Ignore irrelevant fields
  string pid, comm, state, ppid, pgrp, session, tty_nr, tpgid, flags, minflt, cminflt, majflt, cmajflt;
  string utime, stime, cutime, cstime, priority, nice, O, itrealvalue, starttime;

  // Read desired fields
  unsigned long vsize;
  long rss;

  stat_stream >> pid >> comm >> state >> ppid >> pgrp >> session >> tty_nr >> tpgid >> flags >> minflt >> cminflt >> majflt >> cmajflt
              >> utime >> stime >> cutime >> cstime >> priority >> nice >> O >> itrealvalue >> starttime >> vsize >> rss; // Ignore rest

  stat_stream.close();

  // Convert values to KB
  long page_size_kb = sysconf(_SC_PAGE_SIZE) / 1024;
  vm_usage = vsize / 1024.0;
  resident_set = rss * page_size_kb;
}

Exemple d'utilisation

Pour utiliser la fonction process_mem_usage() pour afficher les informations sur l'utilisation de la mémoire, vous pouvez écrivez une fonction principale simple comme suit :

int main() {
  using std::cout;
  using std::endl;

  double vm, rss;
  process_mem_usage(vm, rss);
  cout << "VM: " << vm << "; RSS: " << rss << endl;
}

En exécutant ce code pendant l'exécution du programme, vous pouvez obtenir l'utilisation de la mémoire virtuelle (VM) et taille de l'ensemble résident (RSS) au moment de l'exécution.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn