GNU/Linux >> Belajar Linux >  >> Linux

Penggunaan memori dari proses saat ini di C

Anda selalu dapat membuka 'file' di /proc sistem seperti yang Anda lakukan pada file biasa (menggunakan symlink 'self' sehingga Anda tidak perlu mencari pid Anda sendiri):

FILE* status = fopen( "/proc/self/status", "r" );

Tentu saja, Anda sekarang harus mengurai file untuk memilih informasi yang Anda perlukan.


Saya menemukan posting ini:http://appcrawler.com/wordpress/2013/05/13/simple-example-of-tracking-memory-using-getrusage/

Versi sederhana:

#include <sys/resource.h>
#include <stdio.h>

int main() {
  struct rusage r_usage;
  getrusage(RUSAGE_SELF,&r_usage);
  // Print the maximum resident set size used (in kilobytes).
  printf("Memory usage: %ld kilobytes\n",r_usage.ru_maxrss);
  return 0;
}

(diuji di Linux 3.13)


Ini adalah cara yang sangat jelek dan tidak portabel untuk mendapatkan penggunaan memori, tetapi karena pelacakan memori getrusage() pada dasarnya tidak berguna di Linux, membaca /proc//statm adalah satu-satunya cara yang saya tahu untuk mendapatkan informasi tentang Linux.

Jika ada yang mengetahui cara yang lebih bersih, atau lebih disukai lintas-Unix untuk melacak penggunaan memori, saya akan sangat tertarik untuk mempelajari caranya.

typedef struct {
    unsigned long size,resident,share,text,lib,data,dt;
} statm_t;

void read_off_memory_status(statm_t& result)
{
  unsigned long dummy;
  const char* statm_path = "/proc/self/statm";

  FILE *f = fopen(statm_path,"r");
  if(!f){
    perror(statm_path);
    abort();
  }
  if(7 != fscanf(f,"%ld %ld %ld %ld %ld %ld %ld",
    &result.size,&result.resident,&result.share,&result.text,&result.lib,&result.data,&result.dt))
  {
    perror(statm_path);
    abort();
  }
  fclose(f);
}

Dari halaman manual proc(5):

   /proc/[pid]/statm
          Provides information about memory usage, measured in pages.  
          The columns are:

              size       total program size
                         (same as VmSize in /proc/[pid]/status)
              resident   resident set size
                         (same as VmRSS in /proc/[pid]/status)
              share      shared pages (from shared mappings)
              text       text (code)
              lib        library (unused in Linux 2.6)
              data       data + stack
              dt         dirty pages (unused in Linux 2.6)

getrusage fungsi perpustakaan mengembalikan struktur yang berisi banyak sekali data tentang proses saat ini, termasuk ini:

long   ru_ixrss;         /* integral shared memory size */
long   ru_idrss;         /* integral unshared data size */
long   ru_isrss;         /* integral unshared stack size */

Namun, dokumentasi linux terbaru mengatakan tentang 3 bidang ini

(unmaintained) This field is currently unused on Linux

yang kemudian didefinisikan oleh manual sebagai:

Tidak semua bidang selesai; bidang yang tidak terawat diatur ke nol oleh kernel. (Kolom yang tidak terpelihara disediakan untuk kompatibilitas dengan sistem lain, dan karena mungkin suatu hari nanti akan didukung di Linux.)

Lihat getrusage(2)


Linux
  1. Penggunaan Memori Linux

  2. Alat Yang Memungkinkan Pencatatan Penggunaan Memori?

  3. Linux – Perlu Penjelasan Tentang Ukuran Resident Set/Ukuran virtual?

  1. Penggunaan memori puncak dari proses linux/unix

  2. Membatasi penggunaan memori proses/CPU di linux

  3. Cara memeriksa ukuran heap untuk suatu proses di Linux

  1. Menumbuhkan penggunaan memori residen (RSS) dari Proses Java

  2. Memanggil dan melacak penggunaan memori dari satu proses

  3. Penggunaan memori puncak dari suatu proses