2012-01-24 9 views
3

最近sysinfoシステムコールを使用してシステム統計情報を表示すると、sysinfo構造体のfreeram変数が空きRAM量を返さない現在のRAM使用量私はtotalramからfreeramを差し引いて正しい値を表示するための回避策を使用しなければなりませんでした。私はこの特定の変数についてグーグルで試してみましたが、無駄です。この奇妙な行動の洞察は本当に役に立ちます。sysinfoシステムコールが正しいフリーラーム値を返さない

/* 
* 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" 

を削除し、あなたはどこかと、編集されたからコードを借りました。二重引用符は、非公式のヘッダーファイルをインポートするために使用されます。そのカスタムヘッダーファイルは実際には必要ありません。

必要ありません。コードは正常に動作します。

私のPCで、freeramの値が$free -mの場合、プログラムのinfo.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 System Monitorによって表示されたメモリ_used_統計値に近い値を与えるのかをまだ理解できません。これは逆になるべきではないでしょうか?言い換えれば、freeramが私のシステムでfree ramと等しくないのはなぜですか? – k4rtik

+0

@ k4rtik Gnome Systemのモニターでは、MemFree + Buffers + Cachedと表示されています。 (私はすでにそれを答えて言いました) –

2

「フリーラム」フィールドは、ほとんどの人にとって無意味です。実際の「フリーラム」値に最も近いのは、フィールドを/proc/meminfoから取り、Committed_ASからMemTotalを引いた値です。スワップが使用されていると、結果は負の値になります(これは、物理RAMよりも多くのメモリが割り当てられていることを意味します)。スワップをメモリとしてカウントしたい場合は、合計としてMemTotal+SwapTotalを使用してください。

+0

@rを読んだ後、その詳細な解答が見つかりました。何故それが意味をなさないのかを明らかにしてください。 – k4rtik

+0

最近のシステムでは、すべてのメモリを常時「使用中」に保つことを目指していますが、破棄またはディスクに同期できないデータの長期使用には違いがあります。あなたが見る "使用中の"メモリの大部分は、実際にディスク上のファイルのキャッシュされたコピーです。これらのうちのいくつかは現在実行中のプログラムであり、もう1つはカーネルが再度読み込むことができると期待される一度だけ読み込まれたファイルです。*コミットされた*メモリは、(スワップされない限り)ディスク上のどこにも存在しない実際の変数データを格納します。 –

+0

実用的には、「使用中」でコミットされていないメモリはフリーです。 –

1

mem_unitを掛ける必要があります。

関連する問題