あなた自身の答えを説明するには: これは客観的な C コードではなく、カーネルから統計を取得するために Mach API を使用する単純な古い C コードです。Mach API は、XNU によってエクスポートされた低レベル API です。XNU は、トップ レイヤー (UN*X でよく知られている通常のシステム コールと同様に、BSD API をエクスポートします) と最下層 (Mach) で構成されるハイブリッド カーネルです。このコードは、(とりわけ) リソースの OS レベルの使用率に関する統計を提供する Mach の「ホスト」抽象化を使用します。
具体的には、完全な注釈を次に示します。
#import <mach/mach.h> // Required for generic Mach typedefs, like the mach_port_t
#import <mach/mach_host.h> // Required for the host abstraction APIs.
extern "C" // C, rather than objective-c
{
const int HWUtils_getFreeMemory()
{
mach_port_t host_port;
mach_msg_type_number_t host_size;
vm_size_t pagesize;
// First, get a reference to the host port. Any task can do that, and this
// requires no privileges
host_port = mach_host_self();
host_size = sizeof(vm_statistics_data_t) / sizeof(integer_t);
// Get host page size - usually 4K
host_page_size(host_port, &pagesize);
vm_statistics_data_t vm_stat;
// Call host_statistics, requesting VM information.
if (host_statistics(host_port, // As obtained from mach_host_self()
HOST_VM_INFO, // Flavor - many more in <mach/host_info.h>(host_info_t)&vm_stat, // OUT - this will be populated
&host_size) // in/out - sizeof(vm_stat).
!= KERN_SUCCESS)
NSLog(@"Failed to fetch vm statistics"); // log error
/* Stats in bytes */
// Calculating total and used just to show all available functionality
// This part is basic math. Counts are all in pages, so multiply by pagesize
// Memory used is sum of active pages, (resident, used)
// inactive, (resident, but not recently used)
// and wired (locked in memory, e.g. kernel)
natural_t mem_used = (vm_stat.active_count +
vm_stat.inactive_count +
vm_stat.wire_count) * pagesize;
natural_t mem_free = vm_stat.free_count * pagesize;
natural_t mem_total = mem_used + mem_free;
NSLog(@"used: %u free: %u total: %u", mem_used, mem_free, mem_total);
return (int) mem_free;
}