C에서 현재 프로세스의 메모리 사용량
C에서 현재 공정의 메모리 사용량을 파악해야 합니다.리눅스 플랫폼에서 이 작업을 수행하는 방법에 대한 코드 샘플을 제공해 줄 수 있는 사람이 있습니까?
나는 알고 있습니다.cat /proc/<your pid>/status
메모리 사용량을 구하는 방법인데 C에서 캡처하는 방법을 모르겠어요.
그건 그렇고, 내가 수정하는 PHP 확장을 위한 것입니다. (물론, 나는 초보입니다.).PHP 확장 API 내에 이용 가능한 단축키가 있다면 더욱 도움이 될 것입니다.
그getrusage
library 함수는 다음을 포함하여 현재 프로세스에 대한 많은 데이터를 포함하는 구조를 반환합니다.
long ru_ixrss; /* integral shared memory size */
long ru_idrss; /* integral unshared data size */
long ru_isrss; /* integral unshared stack size */
그러나 가장 최신의 리눅스 문서는 이 세가지 필드에 대해 말합니다.
(unmaintained) This field is currently unused on Linux
설명서는 다음과 같이 정의합니다.
모든 필드가 완료된 것은 아닙니다. 커널에 의해 유지 관리되지 않는 필드가 0으로 설정됩니다. (유지 관리되지 않는 필드는 다른 시스템과의 호환성을 위해 제공되며 언젠가 Linux에서 지원될 수도 있기 때문입니다.)
당신은 항상 '파일'을 열 수 있습니다./proc
일반 파일과 같은 시스템(자신의 pid를 조회할 필요가 없도록 'self' symlink를 사용):
FILE* status = fopen( "/proc/self/status", "r" );
물론 지금은 파일을 파싱해서 필요한 정보를 골라내야 합니다.
이것은 메모리 사용량을 얻기 위한 아주 보기 흉하고 휴대하기 어려운 방법이지만, 리눅스에서는 getrusage()의 메모리 추적이 본질적으로 쓸모가 없기 때문에 /proc/<pid>/statm을 읽는 것만이 리눅스에서 정보를 얻을 수 있는 유일한 방법입니다.
메모리 사용량을 추적하는 더 깨끗한, 또는 가급적이면 더 많은 유닉스 간의 방법을 아는 사람이 있다면, 저는 그 방법을 배우는 데 매우 흥미가 있을 것입니다.
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);
}
절차(5) man-page에서:
/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)
나는 이 게시물을 우연히 발견했습니다: http://appcrawler.com/wordpress/2013/05/13/simple-example-of-tracking-memory-using-getrusage/
단순화 버전:
#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;
}
(리눅스 3.13에서 테스트됨)
#include <sys/resource.h>
#include <errno.h>
errno = 0;
struct rusage memory;
getrusage(RUSAGE_SELF, &memory);
if(errno == EFAULT)
printf("Error: EFAULT\n");
else if(errno == EINVAL)
printf("Error: EINVAL\n");
printf("Usage: %ld\n", memory.ru_ixrss);
printf("Usage: %ld\n", memory.ru_isrss);
printf("Usage: %ld\n", memory.ru_idrss);
printf("Max: %ld\n", memory.ru_maxrss);
이 코드를 사용했지만 어떤 이유에서인지 4개의 printf()에 대해 항상 0이 나옵니다.
파티에 늦었지만, 리눅스에서 상주 메모리와 가상 메모리(그리고 지금까지의 최고치)를 찾고 있는 다른 사람들에게 도움이 될 수 있습니다.
아마 꽤 끔찍한 일이겠지만, 그 일은 끝이 납니다.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*
* Measures the current (and peak) resident and virtual memories
* usage of your linux C process, in kB
*/
void getMemory(
int* currRealMem, int* peakRealMem,
int* currVirtMem, int* peakVirtMem) {
// stores each word in status file
char buffer[1024] = "";
// linux file contains this-process info
FILE* file = fopen("/proc/self/status", "r");
// read the entire file
while (fscanf(file, " %1023s", buffer) == 1) {
if (strcmp(buffer, "VmRSS:") == 0) {
fscanf(file, " %d", currRealMem);
}
if (strcmp(buffer, "VmHWM:") == 0) {
fscanf(file, " %d", peakRealMem);
}
if (strcmp(buffer, "VmSize:") == 0) {
fscanf(file, " %d", currVirtMem);
}
if (strcmp(buffer, "VmPeak:") == 0) {
fscanf(file, " %d", peakVirtMem);
}
}
fclose(file);
}
위의 구조는 4.3에서 가져온 것입니다.BSD 리노.리눅스에서 모든 필드가 의미 있는 것은 아닙니다.Linux 2.4에서는 ru_utime, ru_stime, ru_minflt 및 ru_majflt 필드만 유지됩니다.리눅스 2.6 이후에는 ru_nvcsw와 ru_nivcsw도 유지됩니다.
http://www.atarininja.org/index.py/tags/code
언급URL : https://stackoverflow.com/questions/1558402/memory-usage-of-current-process-in-c
'programing' 카테고리의 다른 글
WooCommerce 상품 카테고리 수 (0) | 2023.10.12 |
---|---|
MySQL의 create index와 alter add index의 차이점은 무엇입니까? (0) | 2023.10.12 |
innoDB인지 MyISAM인지 mysql 데이터베이스의 유형을 어떻게 결정할 수 있습니까? (0) | 2023.10.12 |
제출 전 POST 매개변수 추가 (0) | 2023.10.12 |
Gmail과 Google Chrome 12+에서 클립보드 기능의 붙여넣기 이미지는 어떻게 작동합니까? (0) | 2023.10.12 |