Mac OS X
Mac OS Xについても同様の情報を見つけたいと思っていました。ここになかったので外に出て自分で掘りました。ここに私が見つけたもののいくつかがあります。誰か他の提案があれば、私はそれらを聞いてみたいです。
合計仮想メモリ
これはLinuxのようにプリセットのスワップパーティションやファイルを使用しないため、Mac OS Xではトリッキーです。Appleのドキュメントのエントリは次のとおりです。
注:ほとんどのUnixベースのオペレーティングシステムとは異なり、Mac OS Xは仮想メモリに事前に割り当てられたスワップパーティションを使用しません。代わりに、マシンのブートパーティションで利用可能なすべてのスペースを使用します。
したがって、まだ利用可能な仮想メモリの量を知りたい場合は、ルートパーティションのサイズを取得する必要があります。あなたはこのようにそれを行うことができます:
struct statfs stats;
if (0 == statfs("/", &stats))
{
myFreeSwap = (uint64_t)stats.f_bsize * stats.f_bfree;
}
現在使用されている仮想の合計
「vm.swapusage」キーを指定してsystclを呼び出すと、スワップの使用に関する興味深い情報が得られます。
sysctl -n vm.swapusage
vm.swapusage: total = 3072.00M used = 2511.78M free = 560.22M (encrypted)
上記のセクションで説明したように、より多くのスワップが必要な場合、ここに表示される合計スワップ使用量は変化する可能性があることに注意してください。したがって、合計は実際には現在のスワップ合計です。C ++では、このデータは次の方法でクエリできます。
xsw_usage vmusage = {0};
size_t size = sizeof(vmusage);
if( sysctlbyname("vm.swapusage", &vmusage, &size, NULL, 0)!=0 )
{
perror( "unable to get swap usage by calling sysctlbyname(\"vm.swapusage\",...)" );
}
sysctl.hで宣言されている「xsw_usage」は文書化されていないようであり、これらの値にアクセスするよりポータブルな方法があると思います。
プロセスで現在使用されている仮想メモリ
task_info
関数を使用して、現在のプロセスに関する統計を取得できます。これには、プロセスの現在の常駐サイズと現在の仮想サイズが含まれます。
#include<mach/mach.h>
struct task_basic_info t_info;
mach_msg_type_number_t t_info_count = TASK_BASIC_INFO_COUNT;
if (KERN_SUCCESS != task_info(mach_task_self(),
TASK_BASIC_INFO, (task_info_t)&t_info,
&t_info_count))
{
return -1;
}
// resident size is in t_info.resident_size;
// virtual size is in t_info.virtual_size;
使用可能な合計RAM
システムで使用可能な物理RAMの量は、次のsysctl
ようなシステム関数を使用して利用できます。
#include <sys/types.h>
#include <sys/sysctl.h>
...
int mib[2];
int64_t physical_memory;
mib[0] = CTL_HW;
mib[1] = HW_MEMSIZE;
length = sizeof(int64_t);
sysctl(mib, 2, &physical_memory, &length, NULL, 0);
現在使用されているRAM
host_statistics
システム関数から一般的なメモリ統計を取得できます。
#include <mach/vm_statistics.h>
#include <mach/mach_types.h>
#include <mach/mach_init.h>
#include <mach/mach_host.h>
int main(int argc, const char * argv[]) {
vm_size_t page_size;
mach_port_t mach_port;
mach_msg_type_number_t count;
vm_statistics64_data_t vm_stats;
mach_port = mach_host_self();
count = sizeof(vm_stats) / sizeof(natural_t);
if (KERN_SUCCESS == host_page_size(mach_port, &page_size) &&
KERN_SUCCESS == host_statistics64(mach_port, HOST_VM_INFO,
(host_info64_t)&vm_stats, &count))
{
long long free_memory = (int64_t)vm_stats.free_count * (int64_t)page_size;
long long used_memory = ((int64_t)vm_stats.active_count +
(int64_t)vm_stats.inactive_count +
(int64_t)vm_stats.wire_count) * (int64_t)page_size;
printf("free memory: %lld\nused memory: %lld\n", free_memory, used_memory);
}
return 0;
}
ここで注意すべき点の1つは、Mac OS Xには5種類のメモリページがあることです。それらは次のとおりです。
- 所定の位置にロックされていて交換できない有線ページ
- 物理メモリに読み込まれていてスワップアウトが比較的難しいアクティブページ
- メモリに読み込まれているが、最近は使用されておらず、まったく必要とされていない非アクティブなページ。これらはスワッピングの潜在的な候補です。このメモリはおそらくフラッシュする必要があります。
- キャッシュされていて、簡単に再利用できる可能性が高いキャッシュページ。キャッシュされたメモリはおそらくフラッシュを必要としません。キャッシュされたページが再びアクティブになる可能性があります
- 完全に無料で使用できる無料のページ。
Mac OS Xが実際の空きメモリをほとんど表示しない場合があるからといって、どれだけすぐに使用する準備ができているかを適切に示すとは限らないことに注意してください。
プロセスで現在使用されているRAM
上記の「現在プロセスで使用されている仮想メモリ」を参照してください。同じコードが適用されます。