Load Average を取得

Load averageはhost_load_info構造体のaverun[]というメンバーに格納される。avenrunには5,15,60秒間でのload averageが格納されている。

#include <mach/host_info.h>
#define CPU_STATE_USER     0
#define CPU_STATE_SYSTEM   1
#define CPU_STATE_IDLE     2

struct host_load_info
{
       integer_t        avenrun[3];
       integer_t    mach_factor[3];
};
typedef struct host_load_info* host_load_info_t;

この構造体を用いて有効な値を取得する時には次のhost_info関数を使う

#include <mach/host_info.h>
kern_return_t   host_info
                (host_t                                    host,
                 host_flavor_t                           flavor,
                 host_info_t                          host_info,
                 mach_msg_type_number_t         host_info_count);

hostは情報を得たいhostをさしてるhost_t構造体。flavorは取得する情報の種類を表す。Load averageを取得するときはHOST_LOAD_INFOと指定。
正常に動作したときはhost_infoに値が格納される。尚、この値はLOAD_SCALEという大きさでスケールされている。host_info_countは入力時にはhost_infoの確保しているメモリの大きさ、正常に動作したときは返り値としてのhost_infoの大きさが格納されている。

また、プログラムを実行するマシンに対応したhost_t構造体を得るときは次の関数を使う。

#include <mach/host_info.h>
host_name_port_t   mach_host_self( void );

以下はサンプルコード。

/* load.c 60秒間で平均を取ったload averageを標準出力に表示する。 */

#include <mach/host_info.h>
/* LOAD_SCALE が定義されている */
#include <mach/processor_info.h>
#include <stdio.h>

int main(int argc, char *argv[])
{
  struct host_load_info hl;
  mach_msg_type_number_t count = HOST_LOAD_INFO_COUNT;
  kern_return_t error = host_statistics(mach_host_self(),HOST_LOAD_INFO,(host_info_t)&hl,&count);
  double res = (double)(hl.avenrun[2])/(double)(LOAD_SCALE);
  printf("%lf\n",res);
  return 0;
}