マルチプロセッサ用リアルタイムOSの解説

第03回 FDMP型OSにおける共有資源の操作方法

今回は,他のプロセッサに所属するオブジェクトの操作方法について解説します.

FDMP型(機能分散マルチプロセッサ)OSは,全プロセッサからアクセスできる共有メモリを持っているが,各プロセッサからのアクセスコストが異なるハードウェアに適用することを想定したOSでした.そのハードウェアアーキテクチャを有効活用するため,タスクは決まったプロセッサでのみ実行します.SMP型(対称型マルチプロセッサ)OSとは異なり,多くのFDMP型OSでは,OSの内部構造を管理するデータ構造はプロセッサ毎に持たせています.そして,そのデータ構造はアクセスコストを考えると,各プロセッサのローカルメモリに格納するのが理想です(図1).




【図1 FDMP型OSのデータ構造】

図1に示したようにFDMP型OSでは,例えばプロセッサ1で使用するオブジェクト(タスク,セマフォ,イベントフラグなど)のデータ構造は,プロセッサ1のローカルメモリ1に格納します.
このような構成において,異なるプロセッサで実行されるタスク間の同期・通信を実現する方法として,2つ考えられます.この2つの方法を次の例を用いて説明します.


<例>
プロセッサ1で実行されるタスクAが,プロセッサ2で実行されるタスクBを起動するサービスコールを発行する.この処理によってプロセッサ2ではディスパッチが行われ,タスクBが実行状態となるものとする.
※この例では,タスクBを管理しているデータ構造(タスクコントロールブロック)は,プロセッサ2のローカルメモリにあるものとします.

先ほどの例の1つめの実現方法は,メモリを共有していることを活用して,タスクBのタスクコントロールブロックをプロセッサ1から直接アクセスする方法です.これを直接操作法と呼びます.タスクBを起動した結果,プロセッサ2でディスパッチが必要になった場合には,プロセッサ1からプロセッサ2にCPU間割込みをかけ,ディスパッチを依頼します.
直接操作法によって,他のプロセッサのオブジェクトを操作する場合には,プロセッサ間での排他制御が必要となります.マルチプロセッサではプロセッサ間の排他制御をロックの取得で実現しています.ロックについては次回詳しく解説します.

先ほどの例を,直接操作法で実現する場合の流れを,図2に示します.




【図2 直接操作法】


<直接操作法による処理の流れ>
TaskAがプロセッサ2に所属するTaskBを起動するサービスコールを発行する.
▲廛蹈札奪1から直接プロセッサ2のローカルメモリにあるタスクコントロールブロックを操作する.
プロセッサ2は,△侶覯魅妊スパッチが必要になったことを知らないので,プロセッサ1からCPU間割込みで通知する.
ぅ廛蹈札奪2でディスパッチが発生し,TaskBが実行状態となる.


先ほどの例の2つ目の実現方法を解説します.プロセッサ1からプロセッサ2にタスクBを起動する依頼を例えば,データキューなどで送ります.そのデータキューを受け取ったプロセッサ2が,タスクBのタスクコントロールブロックへアクセスを行う方法が考えられます.これを遠隔呼出し法と呼びます.

先ほどと同じ例を,遠隔呼出し法で実現する場合の流れを,図3に示します.





【図3 遠隔呼出し法】


<遠隔呼出し法による処理の流れ>
TaskAがプロセッサ2に所属するTaskBを起動するサービスコールを発行する.
プロセッサ1からプロセッサ2に,TaskBを起動する依頼を送る.
プロセッサ2は,タスクコントロールブロックを操作する.
プロセッサ2はプロセッサ1に操作完了通知を送信する.
プロセッサ2は,ディスパッチを行いTaskBを実行状態とする.


遠隔呼出し法は,操作対象のオブジェクトが所属するプロセッサ(プロセッサ2)の動作を阻害してしまい,また,操作を依頼したプロセッサ(プロセッサ1)も操作完了通知を待つ必要があるため,リアルタイム性が悪くなってしまいます.(後ほど,詳しく解説します)よって,共有メモリを持つ場合は,直接操作法の方が有利と言えます.ただし,共有メモリを持つ場合でも,操作対象のプロセッサのローカルメモリへのアクセス遅延が大きい場合には,遠隔呼出し法の方が有効と考えられます.
また,遠隔呼出し法は,疎結合マルチプロセッサ(LCMP)にも適用できる方法です.反対に,直接操作法は,共有メモリを持たないと物理的に実現できません.

今まで見てきた例を遠隔呼出し法で行う場合,プロセッサ1が行うべき処理をプロセッサ2が行っている可能性もあり,プロセッサ2のリアルタイム性を損なう危険性があります.

先ほどの例で具体的に見ていきます.

プロセッサ1に所属するタスクAがプロセッサ2に所属するタスクBを起動する場合に,OS内でどんな処理が必要か見てみます.(マルチプロセッサ用リアルタイムOSであるTOPPERS/FMPカーネルの例を参考にします.詳細は後日解説します.)

.織好Bのタスクコントロールブロックを書き換えます.このデータ構造はプロセッサ2に所属します.
▲廛蹈札奪2のレディキューにタスクBを挿入します.
プロセッサ2でディスパッチをし,タスクBを実行状態とします.



【図4 OS内の必要な処理】

大雑把に書くと,OS内ではタスクBを起動するために以上の3つの処理が必要になります.
では,この3つの処理をどちらのプロセッサが行うのでしょうか?直接操作法と遠隔呼出し法では,その役割分担が異なります.

まず,直接操作法から見てみましょう.
直接操作法の場合は,プロセッサ1が´△僚萢を行います(図5).プロセッサ1がプロセッサ2のタスクコントロールブロックを書き換えます.その結果,TaskBが実行状態となるためにディスパッチが必要ですが,ここまでの処理はプロセッサ1が行っているので,このままではプロセッサ2はそれを知ることができません.そこで,ディスパッチが必要であることをプロセッサ1がプロセッサ2にCPU間割り込みで知らせます.そして,の処理はプロセッサ2が行います.



【図5 直接操作法の場合の役割分担】


それに対して,遠隔呼出し法の場合は,プロセッサ1がプロセッサ2に対して,タスクBの起動を依頼し,その後プロセッサ2が´↓の処理を行う必要があります(図6).タスクコントロールブロックの不可分な操作のために,プロセッサ1は´△僚萢の終了を待つ必要があります.そのため,プロセッサ2は´△料犧遒終わると,プロセッサ1に完了通知を送信します.タスクコントロールブロックの不可分な操作については,次回解説します.



【図6 遠隔呼出し法の場合の役割分担】


このように,直接操作法では,´△僚萢はプロセッサ1が行うのに対して,遠隔呼出し法では,´↓すべての処理をプロセッサ2が行う必要があるため,プロセッサ2に負荷がかかっていると言えます.さらに,遠隔呼出し法では,プロセッサ1がプロセッサ2の完了通知を待つ必要があります.このように遠隔呼び出し法では,リアルタイム性を阻害する可能性があります.


ここで,直接操作法と遠隔呼出し法についてまとめます.


○直接操作法
・共有メモリが必須
・他プロセッサのローカルメモリ上にある,操作対象オブジェクトのデータ構造に直接アクセスする
・操作対象オブジェクトが所属するプロセッサで,タスク切換えが必要になった場合にのみ,そのプロセッサに割込みをかける
・ローカルメモリへのアクセス遅延が大きい場合は不利

○遠隔呼出し法
・対象オブジェクトが所属するプロセッサに操作を依頼する
・操作を依頼した側のプロセッサは,依頼した操作が終わるまで待つ必要がある
・対象オブジェクトが所属するプロセッサの動作を阻害してしまう
・共有メモリを持たない場合は,この方法しか選択できない


一長一短ではありますが,共有メモリを持ち,他プロセッサのローカルメモリへのアクセスコストが小さいのであれば,直接操作法が有利であるといえます.共有メモリを持たない場合は,遠隔呼出し法しか選択できません.