2012-01-24 4 views
3

최근에 sysinfo 구조체의 freeram 변수가 반환되는 사용 가능한 RAM의 양을 반환하지 않는다는 것을 느낀 시스템 통계를 표시하기 위해 sysinfo systemcall을 사용하여 다음 C 코드를 작성했습니다. 현재의 RAM 사용법. totalram에서 freeram을 빼서 올바른 값을 표시하는 해결 방법을 사용해야했습니다. 이 특정 변수에 대해 인터넷 검색을 시도했지만 아무 소용이 없습니다. 이 이상한 행동에 대한 통찰력은 정말 도움이 될 것입니다.sysinfo 시스템 호출이 올바른 freeram 값을 반환하지 않음

/* 
* C program to print the system statistics like system uptime, 
* total RAM space, free RAM space, process count, page size 
*/ 

#include <sys/sysinfo.h> // sysinfo 
#include <stdio.h> 
#include <unistd.h>  // sysconf 
#include "syscalls.h"  // just contains a wrapper function - error 

int main() 
{ 
    struct sysinfo info; 

    if (sysinfo(&info) != 0) 
     error("sysinfo: error reading system statistics"); 

    printf("Uptime: %ld:%ld:%ld\n", info.uptime/3600, info.uptime%3600/60, info.uptime%60); 
    printf("Total RAM: %ld MB\n", info.totalram/1024/1024); 
    printf("Free RAM: %ld MB\n", (info.totalram-info.freeram)/1024/1024); 
    printf("Process count: %d\n", info.procs); 
    printf("Page size: %ld bytes\n", sysconf(_SC_PAGESIZE)); 

    return 0; 
} 
+0

'info.freeram'은 제 박스에서 올바르게 작동합니다. ''syscalls.h "'를 제거하십시오. –

+0

syscalls.h는 어쨌든 코드에 영향을 미칠 수 없습니다. 아래 @shadyabhi의 답변을 참조하십시오. – k4rtik

답변

1

당신은 어딘가 편집에서 코드를 빌려,

#include "syscalls.h" 

될 수 있습니다 제거합니다. 큰 따옴표는 비공식 헤더 파일을 가져 오는 데 사용됩니다. 이 사용자 정의 헤더 파일은 실제로 필요하지 않습니다.

필요하지 않습니다. 코드가 잘 돌아갑니다.

내 컴퓨터에서 freeram 값 $free -m은 프로그램의 info.freeram과 일치합니다. 외관상으로는, freeram는 당신이 생각하는 것과는 다릅니다.

http://www.redhat.com/advice/tips/meminfo.html

MemFree 대해 자세히 알아은 & MemFree + 버퍼 + 캐시는 (당신이 원하는) 사용 가능한 메모리입니다 가능한 메모리입니다. 그래서, 당신은 단지 프리랜이라는 용어를 잘못 이해하고있는 것입니다.

+0

위에 게시 된 코드를 실행하려는 경우 해결 방법이 코드에 있기 때문에 정확합니다. printf ("사용 가능한 RAM : % ld MB \ n", (info.totalram-info.freeram)/1024/1024); printf ("사용 가능한 RAM : % ld MB \ n", info.freeram/1024/1024)로 교체 후 실행 해보십시오. 또한 syscalls.h에는 래퍼 함수 오류가 있습니다. – k4rtik

+0

동의하시면 free -m도 비슷하게 동작합니다. 내가 제공 한 링크를 살펴 보았지만 아직 freeram/MemFree가 GNOME 시스템 모니터에 표시된 메모리 _used_ 통계에 가까운 값을 제공하는 이유를 아직 이해할 수 없습니다. 이것이 다른 방향 일 것이 아닌가? (또는 다른 말로하면, freeram이 내 시스템의 free ram과 동등하지 않은 이유는 무엇입니까?) – k4rtik

+0

@ k4rtik Gnome System 모니터에서 MemFree + Buffers + Cached를 보여줍니다. (나는 이미 대답에서 그것을 언급했다) –

2

"무료 숫양"필드는 대부분의 사람들에게 의미가 없습니다. 실제 "free ram"값에 가장 가까운 것은 /proc/meminfo에서 필드를 가져 와서 Committed_AS에서 MemTotal을 뺀 것입니다. 스왑이 사용 중일 경우 결과는 음수 일 수 있습니다 (즉, 실제 RAM보다 많은 메모리가 할당 됨). 스왑도 메모리로 계산하려면 MemTotal+SwapTotal을 합계로 사용하십시오.

+0

@r을 읽은 후 자세한 내용을 찾아 냈습니다. 이유는 무엇입니까? – k4rtik

+0

모든 최신 시스템은 항상 모든 메모리를 "사용 중"으로 유지하려고하지만 디스크에 버려지거나 동기화 할 수없는 데이터에 대해서는 장기간 사용하는 것과 차이가 있습니다. "사용중인"메모리의 대부분은 실제로 디스크에 파일의 캐시 된 복사본입니다. 이들 중 일부는 현재 실행중인 프로그램이고, 다른 일부는 커널이 다시 읽어야 할 것으로 예상되는 한 번 읽혀진 파일입니다.* Committed * 메모리는 반면에 디스크에 존재하지 않는 실제 변수 데이터를 저장합니다 (스왑되지 않은 경우). –

+0

실용적인 목적으로 "사용 중"이지만 커밋되지 않은 메모리는 무료입니다. –

1

mem_unit을 곱해야합니다.

관련 문제