Multi-Phase Startup(多段階起動)

Ver 2.1 - 1999,12/12

Ver 1.0 1999,3/16
Ver 2.0 1999,6/16
Ver 2.1 1999,12/12
(株) 永和システムマネジメント
平鍋 健児
Kenji HIRANABE

 


 

■ 目的
相互に依存し合ったサブシステムを,順序良く起動する.

 

■ 別名
ブートストラップ(bootstrap),ランレベル(run level), いち・にの・さん!(One, Two, Three!)

 

■ 動機
リアルタイムシステムや OS などのシステムの起動を考える.システムは複数 のサブシステムから構成されており,それらが相互に依存し合っているため, システム全体の起動時に各サブシステムを1つずつ一度に運用状態に起動する ことができない,という状況が起こり得る.

この様な場合,各サブシステムが提供するサービスを分割し,各サブシステム に渡るサービスの起動手順を確立して徐々に全体を立ち上げる必要がある.し かし,一般にその手順は複雑になり,また,手順の取り決めは全サブシステム の詳細な知識が必要となる.また,起動順序によっては,システム全体がデッ ドロックに陥るなどの危険性も含んでいる.

サブシステムの状態を,「停止」と「運用中」の2つに分けるのではなく,そ の中間レベルの状態(複数の場合もある)を定義する.起動時は,一旦すべての サブシステムを中間レベルで起動し,次に運用状態で起動するといった他段階 のブートストラップを行なうことで,相互依存性の問題を回避することができ る.また,中間レベルを複数持つ場合,それぞれの中間レベル状態をシステム 全体に渡って系統的に定義することができれば,起動手順の見通しが立てやす くなる.

この中間レベルの状態を表現するため,「ランレベル」という整数を定義し, システム全体で各ランレベルに関する申し合わせを規定することで, 起動手順に関する系統的な取り決めとする.

次のような例を考えよう.

ある OS には「ファイルシステム」(以下 FS と略)というサブシステムと, 「ネットワークインターフェイス」(以下 NI と略)というサブシステムが存在 した.従来,起動時にはまず FS を起動し,あるファイルに記述してある NI に必要な IP アドレスなどの情報を取得し,次に NIを起動して,最終的に 運用状態に立ち上がる,というブートストラップ手順を踏んでいた.最近に なってこの OS に,「ネットワークファイルシステム」(以下 NFS と略)と いう新たなファイルシステム種別が追加された.従来,FS は NIに依存してい なかったが,この新機能の導入により,FS と NIの相互依存関係が発生した. 即ち,

 

  1. NI は起動条件取得のために FS に依存する
  2. FS は NFS の起動のために NI に依存する

このように,サブシステム間に相互依存が生じると,まずファイルシステム,次に ネットワークインターフェイス,というように単純にサブシステム毎に起動する ことが出来なくなる.そこで,次のような便宜的な方策が採られた.

 

  1. FS は,まずローカルディスクのファイルシステムのみを起動する.
    ネットワークに接続されておらず,ローカルディスクのみで起動した状態を ランレベル1 と定義する.
  2. NI は,ローカルディスクに記述された起動条件によってネットワークに接続する.
    ローカルディスクおよび,ネットワークの基礎接続まで起動した状態をランレベル2 と定義する.
  3. 最後に,FS は NI が提供しているサービスを利用して NFS が利用できるようにする.
    この状態をランレベル 3 と定義し,これを最終の運用状態とする.

別な例として,java 言語のコンパイラを考える.相互に依存し合った2つ のクラスA.java, B.java を同時にコンパイルする場合,A.java をコンパイル するには B.java の知識が必要となるし,B.java をコンパイルするには A.java の知識が必要となる.この場合も,まず A.java ,次に B.java とい う単純なコンパイル順序では対処できないため,次のような3段階でコンパイ ルする戦略が考えれる.

 

  1. ソースコード中に定義されているクラス名を発見,登録する.(フェーズ1)
  2. クラスの中の,公開インターフェイスを発見,登録する.(フェーズ2)
  3. 上記を使用して,各クラスの実装をコンパイルする.(フェーズ3)

ここでも,相互依存を解きほぐすために,フェーズを分けて徐々に最終目的段 階へと進んで行く方策が採られている.この「多段階起動パターン」では,こ のように多くの場面に登場する「起動時の相互依存関係の解決」という問題と その一解法を提示する.

 

■ 適用可能性

 

■ 構造
構造
structure

 

■ 構成要素

 

■ 協調関係

 

協調関係
collaboration

 

 

■ 実装
実装に置いては,以下の点を考慮する必要がある.

 

■ バリエーション
以下のようなバリエーションが考えられる.

 

■ 結果
 

 

■ 使用例

 

■ 関連するパターン

 

■ 謝辞
このパターンを洗練していく過程で,JPLoP の参加者の方から数多くの 意見を頂いたことに感謝する.中でも,トップダウンなレベル管理を行なわない, より柔軟なバリエーションの提案は平澤さんであり,そのバリエーション では解決できない問題と,このパターンの本質に潜むヒューリスティック性の 発見は藤野さんである.
mailto:hiranabe@esm.co.jp
Last modified: Sun Dec 12 12:55:07 1999