2012-01-08 7 views
4

システムに存在するRAMの総容量と現在使用されているRAMの合計を取得する必要があるため、パーセンテージを計算できます。その質問に最良の答えはから読み取ることによって、RAMを取得する方法を提案し、Retrieve system information on MacOS X?MacのRAM情報を取得しますか?

しかし:これはと類似しているため、私のプログラムの性質上

/usr/bin/vm_stat 

、私は私がすることができないではないだということが分かりましたそのファイルから読み取る - ファイルを開いて読み込むことなくRAM情報を提供する方法が必要です。私は関数呼び出しと何かを探しています。このようなものは、好ましくはgetTotalRam()getRamInUse()です。

私は明らかに単純ではないと思っていますが、私はファイルから読み込む以外の解決策を探していました。

私はMac OS X Snow Leopardを使用していますが、現行のすべてのMac OS Xプラットフォーム(Lion)で機能するソリューションをお勧めします。

解決策はC++、CまたはObj-Cでもかまいませんが、私の場合はC++が可能な限り最高の解決策になるので、可能であればC++で提供してください。

+2

'/ proc/meminfo'の読み込みが許可されていない場合、システムの物理メモリー統計はおそらくあなたのビジネスではありません。 –

+2

OS Xにはデフォルトで '/ proc'がありません。 – user57368

+0

私はファイルを読むことはできますが、直接読むことはできません。システム機能がそれを必要とするなら、私は手動でそれを自分で行うことはできません – fdh

答えて

7

あなたは/ usr/bin/vm_statから読み込むべきではありません。実行するはずです。それはプログラムです。 (はgetpagesize()によって返される)システムのページサイズによって右の列と複数の数値を追加出力

Pages free:     1880145. 
Pages active:     49962. 
Pages inactive:    43609. 
Pages wired down:    123353. 

の最初の4行を見て、あなたは、システム内の物理メモリの総量での取得バイト。

vm_statはMac OSではsetuidではないので、この情報にアクセスするためのどこかに特権のないAPIがあり、vm_statがそれを使用していると仮定します。しかし、私はそのインターフェースが何であるか分からない。

+0

おかげで、システム全体のRAMが得られます。 – fdh

+0

@Fahrhad - アクティブページ、非アクティブページ、有線ページなどです。まあ、あなたの定義によると、 'used'。 –

+0

@CarlNorum申し訳ありませんが、私はこれに全然慣れていません。通常、「使用済みRAM」とは何ですか?それはアクティブで有線のみですか?また、非アクティブなページも含まれていますか? – fdh

4

topコマンドのソースを調べることで、この質問に対する回答を把握することができます。ソースはhttp://opensource.apple.com/からダウンロードできます。 10.7.2のソースは、アーカイブhereまたはブラウズ可能な形式hereとして入手できます。アーカイブをダウンロードしてtop.xcodeprojを開くことをお勧めします.Xcodeを使用して定義を見つけることができます(コマンドコードをクリックすると非常に便利です)。

topコマンドは、「PhysMem」というラベルの後に物理メモリ(RAM)番号を表示します。その文字列のプロジェクトを検索すると、それはupdate_physmemの中のglobalstats.cというファンクションにあります。構造体libtop_tsamp_tvm_statメンバから使用メモリと空きメモリが計算されます。

"vm_stat"をコマンドクリックすると、libtop_tsamp_tのmemormという宣言がlibtop.hにあります。タイプvm_statistics_data_tと宣言されています。 Commandキーを押しながらクリックすると、/usr/include/mach/vm_statistics.hの定義にジャンプします。

「ではvm_stat」のプロジェクトを検索し、我々はそれがlibtop.cに機能libtop_tsamp_update_vm_statsによって記入されていることを見つける:

mach_msg_type_number_t count = sizeof(tsamp->vm_stat)/sizeof(natural_t); 
kr = host_statistics(libtop_port, HOST_VM_INFO, (host_info_t)&tsamp->vm_stat, &count); 
if (kr != KERN_SUCCESS) { 
    return kr; 
} 

あなたがhost_statisticsを呼び出したい場合は、libtop_portが設定されているか把握する必要があります。私はあなた自身のためにそれを理解することができると確信しています。

9

マシンの物理メモリがsysctlと簡単です行き方:

int mib [] = { CTL_HW, HW_MEMSIZE }; 
int64_t value = 0; 
size_t length = sizeof(value); 

if(-1 == sysctl(mib, 2, &value, &length, NULL, 0)) 
    // An error occurred 

// Physical memory is now in value 

VMの統計は少しだけトリッキーです:

mach_msg_type_number_t count = HOST_VM_INFO_COUNT; 
vm_statistics_data_t vmstat; 
if(KERN_SUCCESS != host_statistics(mach_host_self(), HOST_VM_INFO, (host_info_t)&vmstat, &count)) 
    // An error occurred 

あなたは、あなたがしたい情報を得るためには、vmstatのデータを使用することができますlike:

double total = vmstat.wire_count + vmstat.active_count + vmstat.inactive_count + vmstat.free_count; 
double wired = vmstat.wire_count/total; 
double active = vmstat.active_count/total; 
double inactive = vmstat.inactive_count/total; 
double free = vmstat.free_count/total; 

64ビットバージョンのインターフェイスもあります。

+0

ありがとうございます。ただ1つの質問:物理メモリとVMの違いは何ですか? – fdh

+0

@Farhad:このコンテキストでは、仮想メモリには、ディスクにページアウトされたプロセスの部分も含まれます。 (別の方法で対処しています)。 – MSalters

+0

使用されている物理RAMのみをチェックする方法はありますか? (私はディスクスワップを含めたくありません)sysctlは合計RAMを提供しますが、実際に使用される量は提供しません。 – fdh

2

4年経ちましたが、合計RAMの計算に追加情報を追加したかっただけです。

合計RAMを取得するには、Kyle Jones回答に加えてPages occupied by compressorPages speculativeも考慮する必要があります。

postで問題が発生した場所を確認できます。

関連する問題