linuxシステムの空きメモリを見る方法
このブログはオリジナルです.CC 3.0契約に従い、転載は出所を明記してください.http://blog.csdn.net/lux_veritas/articale/detail/19231993
-------------------------------------------------------------------------------------------------------------------
1.free-m
2.ユーザ状態プログラムでは、sysinfoシステムで呼び出します.
3.カーネル状態のプログラムでは、システムの呼び出しの流れを追跡することによって、良い方法が見つかりませんでした.最終利用dousysinfoの中のsi_meminfo実現
Linuxシステムでは、現在のメモリの使用状況を確認し、簡単な方法はfreeコマンド、コマンドラインのfree-mで、システムの現在の利用可能なメモリ、cache/buffer、swap関連情報を一覧表示します.
freeツールはprocpsプロジェクトが提供する標準procファイルシステム解析ツールであり、分析/proc/meminfoを読み取ることによって、リアルタイムの反応現在システムのメモリ使用状況を読み取る.プロジェクトのホームページ:procps.sourceforg.net
プログラムの中でリアルタイムでシステムの現在利用可能なメモリの状況を確認したいなら、利用できる方法も多様です.
1.ユーザ状態プログラムで確認した場合、「system」システムで呼び出し、freeコマンドを実行したり、proc/meminfoファイルを読み込み、テキスト処理を行うことができます.
2.もちろん1の方法は直観的ではないが、/proc/meminfoの情報はシステムがprocファイルシステムの処理関数を利用して得られたものであり、カーネルコードfs/proc/meminfo.で実現されたものである.
粗読みコードは、struct sysinfoという構造を発見することができる(include/linux/kersnel.hで定義されている)
したがって、ユーザ状態プログラムでは、次のような方法が採用されてもよい.
-------------------------------------------------------------------------------------------------------------------
1.free-m
2.ユーザ状態プログラムでは、sysinfoシステムで呼び出します.
3.カーネル状態のプログラムでは、システムの呼び出しの流れを追跡することによって、良い方法が見つかりませんでした.最終利用dousysinfoの中のsi_meminfo実現
Linuxシステムでは、現在のメモリの使用状況を確認し、簡単な方法はfreeコマンド、コマンドラインのfree-mで、システムの現在の利用可能なメモリ、cache/buffer、swap関連情報を一覧表示します.
freeツールはprocpsプロジェクトが提供する標準procファイルシステム解析ツールであり、分析/proc/meminfoを読み取ることによって、リアルタイムの反応現在システムのメモリ使用状況を読み取る.プロジェクトのホームページ:procps.sourceforg.net
プログラムの中でリアルタイムでシステムの現在利用可能なメモリの状況を確認したいなら、利用できる方法も多様です.
1.ユーザ状態プログラムで確認した場合、「system」システムで呼び出し、freeコマンドを実行したり、proc/meminfoファイルを読み込み、テキスト処理を行うことができます.
2.もちろん1の方法は直観的ではないが、/proc/meminfoの情報はシステムがprocファイルシステムの処理関数を利用して得られたものであり、カーネルコードfs/proc/meminfo.で実現されたものである.
粗読みコードは、struct sysinfoという構造を発見することができる(include/linux/kersnel.hで定義されている)
struct sysinfo {
long uptime; /* Seconds since boot */
unsigned long loads[3]; /* 1, 5, and 15 minute load averages */
unsigned long totalram; /* Total usable main memory size */
unsigned long freeram; /* Available memory size */
unsigned long sharedram; /* Amount of shared memory */
unsigned long bufferram; /* Memory used by buffers */
unsigned long totalswap; /* Total swap space size */
unsigned long freeswap; /* swap space still available */
unsigned short procs; /* Number of current processes */
unsigned short pad; /* explicit padding for m68k */
unsigned long totalhigh; /* Total high memory size */
unsigned long freehigh; /* Available high memory size */
unsigned int mem_unit; /* Memory unit size in bytes */
char _f[20-2*sizeof(long)-sizeof(int)]; /* Padding: libc5 uses this.. */
};
この構造でシステムのメモリ使用が定義されていることが見られます.ソースコードの中でsysinfoを調べたら、システムの情報を調べたり、獲得したりするために呼び出されたシステムがあります.したがって、ユーザ状態プログラムでは、次のような方法が採用されてもよい.
#include
#include
#include
int main()
{
struct sysinfo sys;
int err = sysinfo(&sys);
printf("
error code is: %d
", err);
printf( "free mem:\t%ld
"
"total mem:\t%ld
"
"buffer mem:\t%ld
",
sys.freeram, sys.totalram, sys.bufferram
);
return 0;
}
カーネル状態で実現するには、良い方法が見つけられませんでした.コードを読んで、sysinfoシステムの呼び出しを実行するコールバック関数sys_を見つけました.sysinfo、ソースを調べても、sys_は発見されませんでした.syssinfo関数の実現は、千刀のカーネルのいくつかのマクロによって定義されています.様々なsysscall関連のマクロ定義を試してみて、sysinfoの出現する位置に合わせて、位置を特定します.SYSCALL_DEFINE1(sysinfo, struct sysinfo __user *, info)
マクロ展開SYSCALL_DEFINE 1が検証されました. SYSCALL_DEFINE1(sysinfo, struct sysinfo __user *, info)
{
struct sysinfo val;
do_sysinfo(&val);
if (copy_to_user(info, &val, sizeof(struct sysinfo)))
return -EFAULT;
return 0;
}
コア実現関数はドゥドゥです.sysinfo関数は、内容が多すぎて、不要な操作を免除するために、freamに関する関数だけを使って操作します.meminfo関数 void si_meminfo(struct sysinfo *val)
{
val->totalram = totalram_pages;
val->sharedram = 0;
val->freeram = global_page_state(NR_FREE_PAGES);
val->bufferram = nr_blockdev_pages();
val->totalhigh = totalhigh_pages;
val->freehigh = nr_free_highpages();
val->mem_unit = PAGE_SIZE;
}
sysinfoにおけるram関連コンテンツが割り当てられていることがわかる.カーネルモジュールを書いてテストします.#include
#include
#include
#include
#include
MODULE_LICENSE("GPL");
MODULE_AUTHOR("GuoHongwei");
static int sysinfo_init()
{
struct sysinfo sys;
// int err = do_sysinfo(&sys);
si_meminfo(&sys);
// printk("
error code is: %ld", err);
printk("free mem is: %ld
", (sys.freeram << (PAGE_SHIFT - 10)));
return 0;
}
static void sysinfo_exit()
{
printk("exit module sysinfo_test
");
}
module_init(sysinfo_init);
module_exit(sysinfo_exit);
Makefile:obj-m := sysinfo_test.o
KERNELDIR = /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
default:
make -C $(KERNELDIR) M=$(PWD) modules
clean:
make -C $(KERNELDIR) M=$(PWD) clean
実行結果は以下の通りです.