オブジェクトベース・マルチプロセス制御・グラフィカルユーザーインタフェースOS(開発コード《GUIDE》)は、GUIベースのアプリケーションをマルチウィンドウ・マルチタスク制御するオブジェクトベース・オペレーティングシステムです。
《GUIDE》のコンセプトは、通信機能およびパフォーマンスの強化、マルチメディア対応を前提として、省メモリー資源、高速イベント対応、高移植性、高柔軟性を追求しています。おもな特徴を以下に示します。
GUIDEの主な特長
- オブジェクトベース・プロセス制御
処理の最少単位として、“チップ”という概念を導入しました。チップとは、単機能ながら実行頻度の最も高いプログラムコードの集まりです。ちょうどTTLなどのIC部品と同じ位置付けです。このチップを複数組み合わせて、モジュールを構成します。
モジュールは、独立したプロセス資源(スタック、ダイナミックメモリー、レジスタ)を持ち、プロセッシングオブジェクト(以下プロセスといいます)として動的に生成および消滅します。モジュールのプログラムコード部分をメソッドとよび、資源部分をインスタンスと呼びます。同じメソッドを共有する複数のプロセスは同時に存在し、並行に実行することができ、各プロセスはスケジューリング機構によって処理のためのプロセッサ資源(CPU)を割り当てられます。
例えばマルチウィンドウ表示では、同時に表示されるウィンドウの各々が独立したプロセスであり、同一のメソッド(チップの集まり)で処理されます。この方法により、OS自体のコードサイズを大幅に減らすことができました。
- プロセッサ資源管理
マルチタスク環境では、プロセスは実行可能状態になったとき、スケジューラ(ディスパッチャともいう)によってCPUを割り当てられて実行します。プロセッサをも資源としてとらえることによって、プロセス・スケジューリングは単純化されました。また、マルチプロセッサへの対応も容易になります。
- 多階層プロセッシングオブジェクト
実行形式ファイルとしてまとまった処理概念をタスクと呼びますが、タスクはメインプロセスだけでなはく、スレッドと呼ばれる複数のプロセスから構成されることもあります。このような場合はプロセス間に階層化された主従関係ができており、上位プロセスを消滅すると下位プロセスも自動的に消滅します。
複数階層のプロセス全体で1つのプロセスとして振る舞うことができます。また、プロセスは同一CPUで実行される必要はなく、スレーブCPUに依頼したり通信を介した他のプロセッサに依頼することもできます。
- ダイナミックマルチプロセッシング
従来のマルチタスクOSの概念に加えて、マネージャによるダイナミックプロセスの概念を導入しました。この方式は、アプリケーションのプログラミング量を大幅に削減することができます。
従来のマルチタスクOSでは1タスク(実行プログラム単位)1プロセスとしてマルチタスク制御していましたが、マネージャがプロセスを生成するダイナミックプロセッシング機能が組み込まれたことにより、タスクが複数のプロセスから構成されます。たとえば、アプリケーションが3
つのウィンドウ作成をウィンドウマネージャに依頼した場合、3つの独立したウィンドウ制御プロセスが生成されます。このプロセスの制御はマネージャが担当し、アプリケーションは明示的な処理をする必要はありませんが、タスクプロセスの従属プロセスですから、タスクが終了すれば生成されたダイナミックプロセスも同時に終了します。
- 統一された通信オブジェクト
通信はオブジェクトを対象とします。1文字単位など、それ自身で意味をもたないオブジェクトは通信の対象としないかわりに、画像、音声といった、まとまって意味を持つオブジェクトであれば種類を問いません。この場合のオブジェクトは、データとその処理方法がセットになっています。もし受け取った相手がその処理方法を知らない場合は、応答として処理方法を知らないといった通知を返します。送信側は必要に応じて処理コードまで含めたオブジェクトを送信することもできます。通信手順は、電話をかける→相手が応答する→話す(オブジェクトを送信する)→聞く(応答オブジェクトを受信する)→受話器を置くといった日常的な概念で実現します。アプリケーションは通信相手を電話番号(国際電話と同じ)と内線番号およびプロセス名で指定します。この方法によってWAN、LANの識別も吸収してしまいます。国際電話などでも衛星回線なのか海底ケーブル回線なのか意識しないように、アプリケーションはイーサネットなのか、公衆回線モデムなのかといった通信手段にかかわる一切の手続きを意識しません。
- 伸縮可能なファイルストレージ
DOSおよびUNIXファイルなどは最も単純なストレージです。これらはリニアな空間として扱うことはできますが、データの書き込みは上書きと追加に限られています。ファイルの途中にデータを追加挿入したり、途中の一部を削除したりといった処理は、ファイルの書き換えを前提にして、すべてアプリケーションにまかされてきました。
ストレージマネージャは、挿入書き込みと部分削除機能を提供しますので、テキストエディタなどで日常的におこなわれる操作をそのまま実現できます。
- 仮想メモリーマネージャ
プロセスは、動作に応じて必要なメモリーを要求して確保します。この際実メモリーが不足している場合は、外部メモリーまたはストレージに確保し、実際に使用する際に実メモリーに置き換えます。LRUアルゴリズムに従ったマッピング管理をおこないますので、オーバヘッドも少なくなっています。
- オブジェクト指向グラフィックスマネージャによるGUI
メニュー、ボタンといったユーザーインタフェースはすべてグラフィック化しています。その生成・消滅・制御は、一括してグラフィックスコントロールマネージャが独立したプロセスとしておこないます。アプリケーションはこのマネージャにメッセージを送ることで、簡単に部品として利用できます。
- ハードウェアアーキテクチャをアプリケーションから隠蔽
アプリケーションは、すべての機能をマネージャを介しておこないます。マネージャはハードウェアに対応して用意されますが、アプリケーションに対する機能は共通です。また、シュードマネージャ(通信マネージャなどが相当します)を利用すると、エミュレーション機能を実現できた
り、既存のマネージャにさらに機能を追加したりもできます。
シュードマネージャとは、実マネージャと同名のプロセス名を持ち、実マネージャの上位に位置します。アプリケーションが実マネージャとコンタクトしようとした場合、自動的にシュードマネージャに振り向けられます。シュードマネージャは、アプリケーションからのメッセージを自身で処理したり、実マネージャに依頼して処理します。例えば、通信マネージャにメールオブジェクトの送信を依頼した場合、実際に相手が接続されていなければ、いったんシュードマネージャが受領して保有し、実際に接続してから配達するといった、書き留め郵便のような機能を実現できます。
- ハイブリッドスケジューリング機構
ダイナミックプロセスには、単一チップから構成される極めて寿命の短いものから、内部でループ処理が続くような寿命の長いものまであります。
また、アプリケーションのように、コードがメモリーにある間はプロセスとして常駐するようなスタティックプロセスもあります。寿命の短いプロセス実行途中に割り込みイベントが発生した場合はプリエンプティブスケジューリングではコンテクストの切替えが発生する可能性があり、結果として待ち行列につながるプロセスが多くなってしまうためにオーバーヘッドが増加することになります。
このような場合、従来は割り込み禁止などの対処をおこなっていましたが、単寿命プロセスごとにノンプリエンプティブ指定することによって、発生イベントをいったんイベントキューに接続してからまとめて処理しますので、イベントの滞留を引き起こすことなく、割り込みの保留を避けることができます。
- リモートオペレーション機能
通信マネージャは通信内容としてのオブジェクトに関知しないため、通信を通じてキー、ポインティングなどオペレーションに直接結び付いたオブジェクトを送信できます。
同じく、相手の表示指令もシュードマネージャを介して通信できます。この機構はXウィンドウのサーバー・クライアントイメージに相当します。
GUIDE FAQ
●なぜコンパクトなのですか?
オブジェクトベース処理を徹底していますので、共通した概念は同一の取り扱い手順(メソッド)で構成しています。例えば、CPU自体も資源として扱いますので、プロセス・スケジューリングとメモリー、ファイルなどの資源スケジューリングを同じメソッドで実現しています。
メソッドはすべて部品として階層化され、かつリカーシブコールされるように設計しています。
各々の部品の実行頻度は下位部品ほど高く、キャッシュをもったCPUではキャッシュ効果が高くなるため実行速度向上にもつながります。
●マルチタスク処理はできますか?
階層化したプロセス(タスクはプロセスの派生クラスと位置付けています)をイベントドリブン方式によるプリエンティブ・スケジューリングによって実行します。これらの仕組みは、それ自体を目的とするのではなく、オブジェクトベースプログラミングおよびコンポーネント・プログラミングを実現する上での必然性から用意されています。したがって、使用する上でも、プログラミングする上でもマルチタスクを意識する必要はありません。また、プロセスごとにプリエンティブ・スケジューリングを任意に禁止・許可できます。
●マルチスレッド機能はありますか?
ひとつのプログラムファイル(タスクファイル)の中に、1つのスタティックプロセス・コードと複数のダイナミックプロセス・コードを記述できます。
C言語またはC++言語で記述した main(){...}というスタイルのプログラムはスタティックプロセスといい、これをタスクのメインプロセスといいます。一方、同じプログラム内に、GUIDEで規定された関数の形式で記述したプログラムを、各々プロセスとして登録して実行できます。
この関数は、スタティックプロセスの関数としても使用できますし、独立したプロセスとしても動作します。このプロセスをダイナミックプロセスといい、マルチスレッドと同じ動作を行ないます。
●タスク間通信はどのようにおこないますか?
ダイナミックメモリーブロックを、タスク間(プロセス間)で交換します。ダイナミックメモリーブロックの内容は、交換するタスク同士で取り決めしてあれば自由です。
また、イベント通知という方法でタスク間通知を行なうこともできます。イベント通知およびダイナミックメモリーブロックの交換とも、タスクスケジューリングの事象として利用できます。
●DLL(ダイナミックリンクライブラリ)に相当する仕組みはありますか?
プログラムファイルの形式は、TSK形式(タスク)、MAN形式(マネージャ)、DLF形式(ダイナミックリンクファンクション)があります。
MAN形式と、DLF形式がWindowsのDLLに相当します。MAN形式はオブジェクトマネージャと呼ぶダイナミックプロセス・サーバーとして機能します。最近話題のAgent機能を提供します。DLF形式は、関数サーバーとして機能しますので、複数のタスクから共通に使用する関数をDLF形式にしておけばプログラムサイズをコンパクトにできます。
●OLEのようなことはできますか?
マルチシート環境は、各々のシートがプロセスとして機能します。
シートは階層化に加え、従属化と独立化を自由に扱うことができますので、OLEなどの概念を導入するまでもなく同様の機能が最初から備わっています。1枚のシートに配置した機能シート(各々がタスクとして動作する)の組み合わせは自由です。任意の位置に機能シートを割り当ててそこにタスクをロードすれば、OLEと同じ効果が得られます。
●アプリケーション開発はどのようにおこないますか?
C言語、またはC++言語で開発します。MS−DOS、Windowsの環境で開発できます。
●簡単なプログラミングは可能ですか?
もっとも手軽な方法はControlManagerとよぶオブジェクトマネージャを利用して機能部品をシート上に配置する方法です。
コントロールシートという機能シートの上に、ボタン、メニュー、テキストなどを自由に配置できます。各々の部品は、マウス操作、キー操作などに対応してコールバックとよぶユーザー定義関数を呼び出します。『このボタンをクリックしたらxxする。』のようなプログラムを考える場合でも、【xxする】の部分をコールバック関数として記述するだけで、ボタンの配置、大きさなどをパラメータとして指定してプログラムは完成します。
●機能部品は簡単に作成できますか?
部品作成はC++言語で、イベントメソッドという関数を定義するだけです。関数は、部品の動作を規定する構造体を定め(C++ではクラスといいます)、マウス操作、キー入力、リライト要求などのイベントに対してどのように振る舞うかを記述します。
ユーザ定義部品を作成するにあたっては、マウス操作、ボタン操作、メニュー選択など、基本的なクラスについてのGFCクラスライブラリを利用できます。
機能部品はさらに他の部品を利用して、その組み合わせとして定義することもできますし、DLFおよびオブジェクトマネージャを利用して記述することもできます。
用語解説
GFC
- Guide Faundation Classといい、GUIDEの基本クラスを定義しています。
DLF
- Dynamic Link Functionといい、アプリケーション実行時に必要に応じて呼び出す関数サーバーです。動作は従来のオーバーレイと同様ですが、どのアプリケーションからも制限なく利用でき、かつ独立している点が異なります。WindowsのDLLと同じように振る舞います。
(C)1994 アクト株式会社