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
Libérer: 2024-12-02 16:35:11
original
287 Les gens l'ont consulté

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;
}
Copier après la connexion

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;
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal