>백엔드 개발 >C++ >Linux에서 C 런타임 메모리 사용량을 안정적으로 얻는 방법은 무엇입니까?

Linux에서 C 런타임 메모리 사용량을 안정적으로 얻는 방법은 무엇입니까?

Barbara Streisand
Barbara Streisand원래의
2024-12-02 16:35:11289검색

How to Reliably Get C   Runtime Memory Usage on Linux?

C를 사용하여 런타임 시 메모리 사용량 정보를 얻는 방법

소개

메모리 사용량 모니터링 프로그램 성능을 최적화하고 메모리 누수를 방지하는 데 중요합니다. C에서는 다양한 디버깅 및 최적화 목적을 위해 메모리 소비에 대한 실시간 정보를 얻는 것이 필수적일 수 있습니다.

문제 설명

OP는 getrusage()를 활용하여 프로그램 실행 중에 메모리 사용량 통계(VIRT 및 RES)를 검색했지만 지속적으로 0이 발생했습니다. 값.

해결책

Linux 시스템에서는 ioctl()을 통해 메모리 사용량을 검색하는 것이 어려울 수 있습니다. 대신, 보다 안정적인 접근 방식은 /proc/pid 내의 파일에서 정보에 액세스하는 것입니다. 다음 C 코드 조각은 이 접근 방식을 구현하는 방법을 보여줍니다.

#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;
}

사용 예

메모리 사용량 정보를 표시하기 위해 process_mem_usage() 함수를 활용하려면 다음을 수행할 수 있습니다. 다음과 같이 간단한 main 함수를 작성합니다.

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

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

프로그램 중에 이 코드를 실행하여 실행하면 런타임에 가상 메모리 사용량(VM)과 상주 세트 크기(RSS)를 얻을 수 있습니다.

위 내용은 Linux에서 C 런타임 메모리 사용량을 안정적으로 얻는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.