next up previous contents index
Next: ヒープ Up: 実装レベルのデータ Previous: 実装レベルのデータ

   
大域データ構造体

include/klic/struct.h 中で、global_variabls として 定義されている構造体である。この構造体の実体は、各プロセスに1つ (よって、逐次版であれば、システム内に1つ)だけ存在する。

KLICでは、大域的に用いられるデータの殆どはこの構造体に格納されている。 一般的に大域な変数をアクセスするためには、そのアドレス、すなわち、 32bit計算機では32bit長即値を扱う必要があり、この処理は 通常効率があまり良くない(例えば、SPARCなどのRISCプロセッサ、つまり、 命令がすべて32bit長である場合には、即値のレジスタへの ロードだけで2命令になってしまう)。 そこで、大域データを構造体にいれておき、その構造体へのポインタをレジスタ上に 持ち、個々の構造体要素データに関しては、 offsetで(つまり、32bitよりも短いデータで) アドレス表現できるようにすることにより、大域データへのアクセスコストを 減らすことを念頭に置いている。

以下でこの構造体の説明を行う(各々の詳細は、個別におこなう)。

struct global_variables {
  q *heapp0;                    /* ヒープ割付点 */
  q * Volatile heaplimit0;      /* heaplimit変数(詳細後述) */
  struct goalrec *current_queue0; /* 実行中優先度のゴールスタック */
  struct goalrec *resumed_goals0; /* リダクション中に生じた再開ゴール群 */
  unsigned long current_prio0;  /* 現在の優先度 */
  unsigned long top_prio0;      /* 実行可能ゴールでの最高優先度 (未使用) */
  struct prioqrec prioq0;       /* 「優先度ゴールスタック」のリストの先頭 */
  q *heaptop0;                  /* 現在のヒープの先頭 */
  q *heapbottom0;               /* 現在のヒープ面中のシステムヒープの割付点 */
  q *real_heaplimit0;           /* heaplimitのマスター(詳細後述) */
  unsigned long heapsize0, maxheapsize0, incrementsize0;
  /* 現在の片面ヒープサイズ、最大ヒープサイズ、ヒープマージンサイズ (in word) */
  unsigned long real_heapbytesize0; /* ヒープサイズ(byte) */
  double maxactiveratio0; /* ヒープ中の最大アクティブセル比 */
  unsigned long this_more_space0; /* 最小の空領域 */
  q *new_space_top0, *old_space_top0; /* ヒープ新領域、旧領域の先頭 */
  unsigned long new_space_size0, old_space_size0;
  /* ヒープ新領域、旧領域のサイズ */
  q **gcstack0; /* GCで用いるスタックの底 */
  q **gcsp0; /* GCで用いるスタックの先頭 */
  q **gcmax0; /* GCで用いるスタックの上限 */
  unsigned long gcstack_size0; /* GCで用いるスタックのサイズ */
  Volatile long interrupt_off0; /* 割り込みフラグ */
  struct goalrec *interrupt_qp0; /* 未仕様 */

  struct { /* 並列実装用の構造 */
   /* parallel comm Imp. */
    long my_num0;
    long num_pes0;
    union {
      /* shared-memory Imp. */
      struct {
        long queued0;
        struct ex_goalrec* ex_qp0;
        long currid0;
        long oldid0;
        long shm_htop0;
        long shm_hbyte0;
        long dummy[10];
      } shm;
      /* dist-memory Imp. */

    } aux;
  } par;

  char *program_name0; /* コマンド名称 */
  int command_argc0;   /* コマンド引数個数 */
  char **command_argv0; /* コマンド引数 */
  q* (**gc_hook_table0)(); /* GC時のフックの表 */
  int gc_hooktab_size0;
  int num_gc_hooks0;
  q* (**after_gc_hook_table0)(); /* GC後のフックの表 */
  int after_gc_hooktab_size0;
  int num_after_gc_hooks0;
  unsigned long /* 計測用のカウンタ */
    suspensions0, resumes0, copied_susp0, cum_susps0, cum_resumps0;
  struct suspended_goal_rec *suspended_goal_list0; /* デッドロック検出用の
                                                      中断ゴールリスト */
  Const struct predicate *postmortem_pred0; /* post mortem 用の述語 */
  q postmortem_args0;
  long generic_argc0; /* ジェネリック・オブジェクトのインターフェース用の引数個数 */
  q generic_arg0[MAXGENERICARGS]; /* ジェネリック・オブジェクトのインターフェース用の引数領域 */
  q reasons0[MAXSUSPENSION];    /* サスペンションスタック領域 */
}

この構造体は各プロセッサ内では、globalsなる名称の変数として 保持されている。 構造体のこれらの要素は、以下のとりきめにより、include/klic/struct.h中で マクロ化されている。 



Sekita Daigo
1998-05-18