システム情報の取得


従来の携帯コンテンツと比べてしまうと、iPhoneはかなりメモリに余裕がある端末だとは思うんですけど、
余裕があれば余裕があっただけ、使ってしまいたくなるのがコンテンツ屋ってもんです.

そんなわけで、開発中、自身のアプリケーションの中で後どのぐらいメモリが使えるのかとか、ある処理を
行ったときにどの程度メモリを消費したのかを把握できるようになっておくと便利です.

xcode には、Shark とか Instruments とか便利なツールが揃っていますが、ツールでは把握しづらい部分を
計測するためにも、利用メモリ量の取得を行えるようにしてみました.

そんなわけで、いつものように足跡を残しておきます.

利用メモリ量の取得

現在のメモリの状況を取得するためには、 host_statistics() を利用する.

こんな感じに、利用すればよい.

#include <mach/host_info.h>
#include <mach/mach_init.h>
#include <mach/mach_host.h>

void vmInfo()
{
    struct vm_statistics a_vm_info;
    mach_msg_type_number_t a_count = HOST_VM_INFO_COUNT;
    host_statistics( mach_host_self(), HOST_VM_INFO, (host_info_t)&a_vm_info ,&a_count);
}

vm_statictics 構造体は、次のように定義されている.

struct vm_statistics {
	natural_t	free_count;		// 空きメモリ容量(ページ数)
	natural_t	active_count;		// 現在使用中のメモリ容量(ページ数)
	natural_t	inactive_count;		// 現在非使用中のメモリ容量(ページ数)
	natural_t	wire_count;		// 現在固定中のメモリ容量(ページ数)
	natural_t	zero_fill_count;	// ゼロで埋まっているページ数(よくわからん)
	natural_t	reactivations;		// よくわからん
	natural_t	pageins;		// よくわからん
	natural_t	pageouts;		// よくわからん
	natural_t	faults;			// よくわからん
	natural_t	cow_faults;		// よくわからん
	natural_t	lookups;		// よくわからん
	natural_t	hits;			// よくわからん
	natural_t	purgeable_count;	// よくわからん
	natural_t	purges;			// よくわからん
	natural_t	speculative_count;	// よくわからん
};

よくわからんって書いてあるところは、私が意味を分かっていない部分.
(教えて偉い人)

ここから取得できるメモリ量の単位は、ページ数なので byte 単位に変換するためにはページサイズを掛ける必要がある.

int a_free_size = a_vm_info.free_count * vm_page_size;

host_basic_info の取得

全体で利用できる(はずの)総メモリサイズなんかを取得したい場合には、 host_info() を利用すればよい.

今のところ意味はなさそうだけれども、CPU種別なんかも取ってくることができる.

#include <mach/host_info.h>
#include <mach/mach_init.h>
#include <mach/mach_host.h>

void hostInfo()
{
    struct host_basic_info a_host;
    mach_msg_type_number_t a_count = HOST_BASIC_INFO_COUNT;
    host_info(mach_host_self(), HOST_BASIC_INFO, (host_info_t)&a_host, &a_count);
}

host_basic_info は、こんな感じに定義されている

struct host_basic_info {
	integer_t		max_cpus;		// 最大のCPU数
	integer_t		avail_cpus;		// 現在利用できるCPUの数
	natural_t		memory_size;		// メモリサイズ(byte)
	cpu_type_t		cpu_type;		// CPU の種別1
	cpu_subtype_t		cpu_subtype;		// CPU の種別2
	cpu_threadtype_t	cpu_threadtype;		// CPU のスレッド種別
	integer_t		physical_cpu;		// 現在利用できる物理的なCPUの数
	integer_t		physical_cpu_max;	// 最大で利用できる物理的なCPUの数
	integer_t		logical_cpu;		// 現在の論理的なCPUの数
	integer_t		logical_cpu_max;	// 最大の論理的なCPUの数
	uint64_t		max_mem;		// 実際の物理メモリサイズ
};

cpu_type / cpu_subtype / cpu_threadtype に割り当てられている定数は、

/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS2.2.sdk/usr/include/mach/machine.h

から確認できる.

必要そうなものだけ引っ張ってきてみるとこんな感じになっているはず

#define CPU_TYPE_X86		((cpu_type_t) 7)
#define CPU_TYPE_ARM		((cpu_type_t) 12)
#define CPU_SUBTYPE_ARM_V6              ((cpu_subtype_t) 6)
#define CPU_THREADTYPE_NONE		((cpu_threadtype_t) 0)

まぁ、いつかお世話になるかもしれない

おまけ

これで、メモリの使用量を測ることができるようになりました.

ただ、非使用中のメモリ容量と空きメモリ容量の違いなんかについてはよく分かっていません.
(非使用中のメモリ容量(非活性のメモリ容量?)は、いつ利用できるようになんのさ?)

他にも、把握していないパラメータ満載です.
(どなたか、是非フォローお願いします)

参考ページ

[The iPhone Development Playground]
2009-01-24 メモリー使用量の謎(2)
http://d.hatena.ne.jp/kimada/20090124/1232809647

iPhone のアプリケーションの "SysStats Lite" の作者さんのページ.
このアプリの存在を知って、自身のアプリから様々な状況を把握できることを知りました.

技術情報がとても丁寧にまとまっているので、一度目を通しておくと良いと思います.

[Christopher-727の日記]
2007-11-10 Macシステムコール
http://d.hatena.ne.jp/Christopher-727/20071110

実際の値の取得方法について参考にさせていただきました.

xcode 付属のドキュメントを漁っても、システムコールのことは書かれていないようだったのでとても参考になりました.
(探し方が悪いだけ?)

ありがとうございました