連載
» 2007年02月22日 00時00分 公開

Symbian OS開発の勘所(2):カーネルに見るSymbian OSのデザインポリシー (1/3)

カーネルの構造や仕組みからSymbian OSの特徴に迫る。マイクロカーネル、スレッド、DLLなどから、Symbian OSらしさが見えてくるだろう

[大久保 潤 管理工学研究所,@IT MONOist]

 今回はカーネル回りを中心に、Symbian OSの基本的な仕掛けについて解説します。

 ほかのOSで専らアプリケーション側の開発を行っていた方からすると、この部分は割とどうでもよいところとして扱われがちです。理由はいろいろ考えられますが、ここしばらくアプリケーション側から見たカーネルのモデル(以下プログラミングモデル)があまり変わらなかったことが影響しているように思われます。

 32bitアドレッシング可能で、プロセスごとに保護されたメモリ空間。プリエンプティブ、特にラウンドロビンによりタイムスライスが均等に配分される実行モデル。要するに、メモリのことを気にせず済み、かつ他プロセスのことを考えずに自プロセスのことだけに専念すれば済むプログラミングモデルが確立し一般化したために、わざわざこの辺りのことに興味を持つ人が減ったのではないかと考えています。

 ただし第1回にも書いたとおり、あるアーキテクチャの妥当性というものは、リソースや環境制約次第です。Symbian OSは、

  • 省メモリ
  • 省電力
  • リアルタイム支援
  • マイクロカーネルの採用

といった理由により、カーネルの構造が一般のOSと異なっています。それらがプログラミングモデルにどのような影響を与えるのか。このような視点からSymbian OSの特徴を浮き彫りにしていこうというのが今回のもくろみです。

Symbian OSの構造

 Symbian OSの構造を図1に示します。よく見かける構造図に見えますが、やはり独特な部分が見え隠れしています。アプリケーションに近い側から順番に眺めていきましょう。

Symbian OSの構造 図1 Symbian OSの構造

クライアント/サーバ

 マイクロカーネルの定義をまとめると、

OSが提供する各種機能の中で、必要最小限のものをカーネルとして抱え、そのほかはユーザーレベルに配置する。これにより全体の設計が簡素化でき、結果的に性能も向上するという考え方


となると思います。80年代の終わりから90年代の初めにかけて、マイクロカーネルは大変にもてはやされました。しかし思ったほど性能が出ないということで、すべての機能を抱え込むモノリシックカーネルに逆戻りする動きが続いていました。例えば、Windows NT系のバージョンアップごとの構造変化はまさにこれです。しかし、プロセス間通信の効率を向上させることにより性能低下を回避できることが分かり、近年また流行する兆しを見せつつあります。Symbian OSは、このマイクロカーネル・ルネサンスの流れに位置付けられるOSです。

 図1において、スクリーン管理とイベント管理の機能を提供する「ウィンドウサーバ」、ファイルデバイスを管理しファイルシステムへのアクセスサービスを提供する「ファイルサーバ」など、OSが提供する中核機能がユーザーサイドに配置されています。ここに着目してください。Symbian OSでは、従来カーネルに抱え込まれていた多くの機能がユーザープロセスとして実現されているのです。

Symbian OSのクライアント/サーバアーキテクチャ 図2 Symbian OSのクライアント/サーバアーキテクチャ

 マイクロカーネルアーキテクチャに基づくSymbian OSでは、プログラムがファイルを使用しようとした場合、図2のようにスレッド間通信を発生させてファイルサーバに処理を要求します。このモデルを「クライアント/サーバアーキテクチャ」と呼んでいます。

 Symbian OSで「クライアント/サーバ」といった場合、一般論のクライアント/サーバではなく、ユーザースレッドから特定のサーバへの処理要求のためのスレッド間通信を指すので注意してください。なお、具体的なAPIなどについては連載第6回で詳細に解説する予定です。

ユーザーライブラリ

 続いて図1を眺めていくと、「EUSER」(ユーザーライブラリ)という要素が明記されているところが目を引きます。EUSERには配列、リスト、バッファ、数値計算、クリーンアップ(連載第4回で詳述予定)などの基本的な機能が収められています。また、EUSERはカーネル機能の呼び出しをハンドリングする部分でもあります。Symbian OSは、C++ベースのクラスライブラリでAPIを定義していますが、EUSERも例外ではありません。すべての機能がクラスを通じて提供されているので、プログラミングが容易になるだけではなく、呼び出し側のコードの質がそろいやすいという利点も得られます。

 Symbian OSでは、以下のいずれかの方法でOSが提供する機能の呼び出しを実現しています。

ユーザーライブラリコール
ユーザー空間内で共通コードを実行する。コンテキストスイッチも権限切り替えも引き起こさない。

Execコール
スレッドの実行権限をスーパーバイザーモードに切り替えることにより、カーネル側のコードを実行する。その際、スタックもカレントスレッドのスーパーバイザースタックに切り替えられている。

 EUSERが提供している機能は、その内容に応じてユーザーライブラリコールあるいはExecコールとして実行されることになります。

カーネル

 Symbian OSのカーネルはマイクロカーネルなので、プロセスやユーザーモードのスレッドの管理、スレッド間通信、ライブラリのロードなど、限定された範囲を責務としています。カーネル内にはカーネルサーバ、タイマなど5つのスレッドが動作しています。

 興味深いことに、Symbian OSのカーネルはその内部に「ナノカーネル」というレイヤを抱えています。これはスレッドのスケジュールと同期に特化したサービスを提供するものです。カーネルはナノカーネルによって提供されるシンプルなスレッドとサービスを土台として、階層的に構成されているのです。

メモリモデル

 図1にわざわざ「メモリモデル」という要素が記載されているのには意味があります。Symbian OSは、移植先の多様な環境に合わせてメモリモデルを選択可能にしています。

名称 特徴
moving 仮想タグ付きキャッシュを使用する場合に対応するモデル。OS全体で1個のページディレクトリを使用する。そのためアクティブなプロセスが切り替わるたびに、仮想アドレスの変更によりメモリブロックを移動する(moving)ことになる
multipul 物理タグ付きキャッシュを使用する場合に対応するモデル。プロセスごとに1個のページディレクトリを使用する(multipul)。そのためアクティブなプロセスの切り替えが発生してもMMUのレジスタを書き換えるだけで済む。Windowsなどのメモリモデルに近い
emulator エミュレータ
direct MMUなしのモデル(※一般には使われない)
表1 Symbian OSのメモリモデル

 製品に使われるmoving、multipulいずれのメモリモデルも、プロセスごとに仮想アドレス空間を用意します。MMUのデザインが異なっていても同じプログラミングモデルを提供しているのです。この辺りは非常にSymbian OSらしい部分だと思います。

       1|2|3 次のページへ

Copyright © ITmedia, Inc. All Rights Reserved.