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

第07回 TOPPERS/FMPカーネルの概要

マルチプロセッサ向けリアルタイムOSであるTOPPERS/FMPカーネルが一般公開されました.このブログでも,TOPPERS/FMPカーネルについて具体的に見ていきたいと思います.
FMPカーネルが開発された背景をご理解いただくために,これまでにTOPPERSプロジェクトで開発されたマルチプロセッサ用リアルタイムOSについてご紹介します.これまでにTOPPERSプロジェクトにおいて,機能分散型マルチプロセッサ用リアルタイムOSとして,「TOPPERS/FDMPカーネル」,対称型マルチプロセッサ用リアルタイムOSとして,「TOPPERS/SMPカーネル」がそれぞれ開発されていました.


機能分散型マルチプロセッサ用リアルタイムOS
・TOPPERS/FDMPカーネル
  FDMP(Function Distributed Multiprocessor)

対称型マルチプロセッサ用リアルタイムOS
・TOPPERS/SMPカーネル
  SMP(Symmetric MultiProcessor)


マルチプロセッサ型リアルタイムOSに必要な機能として,プロセッサ内通信と互換のプロセッサ間通信機能と,動的な負荷分散機能の2つがありました.(第1回参照)
TOPPERS/FDMPカーネルとTOPPERS/SMPカーネルの両方のOSに共通しているのは,プロセッサ内通信と互換のプロセッサ間通信を持つという点です.それぞれのOSを詳しく見ていきます.



【図1 TOPPERS/FDMPカーネル】

TOPPERS/FDMPカーネルは一般的なAMP型OSに見られるように,プロセッサ毎にレディキューを持ち,タスクは静的にプロセッサに割り当てられます.言い換えれば,タスクはそれぞれのプロセッサに固定されて動作します.そのため,プロセッサ毎のスケジューリングはシングルプロセッサに近いといえます.よって,最悪実行時間の予測がつきやすく,後述のSMPカーネルと比較してリアルタイム性の保証が容易であるといえます.また,タスクはプロセッサに固定して動作するため,カーネルでは動的な負荷分散をサポートしていません.よって,負荷分散が必要な場合には,アプリケーションレベルでサポートする必要があります.

<特徴>
プロセッサ内通信と互換のプロセッサ間通信機能を持つ.
静的なタスク割り当てをサポート

<メリット>
個別のプロセッサの性質はシングルプロセッサに近く,対称型と比較してリアルタイム性の保証が容易.

<デメリット>
OSでは動的な負荷分散をサポートしていないため,アプリケーションレベルでサポートする必要がある.


【図2 TOPERS/SMPカーネル】

TOPPERS/SMPカーネルは,一般的なSMP型OSに見られるように,システム全体でレディキューは1つで,タスクは動的に割り当てられます.よって,カーネルレベルで動的な負荷分散が可能で,システムのスループットを向上させることが可能です.しかし,デメリットとして,各タスクのリアルタイム性の保証が難しくなるという点が挙げられます.

<特徴>
プロセッサ内通信と互換のプロセッサ間通信機能を持つ.
動的なタスクの割り当てをサポート

<メリット>
動的な負荷分散が可能で,システムのスループットを向上させることが可能

<デメリット>
動的な負荷分散を行うため,各タスクのリアルタイム性の保証が困難
優先度を厳密に守ると,タスクの移動が頻発してキャッシュの使用効率が悪化
一本のレディキューをプロセッサで共有するために,カーネルの実行の多くの部分がプロセッサ間でシーケンシャル化してしまう


TOPPERS/FDMPカーネルとTOPPERS/SMPカーネルのデメリットを合わせて考えると,次世代マルチプロセッサ向けリアルタイムOSに求められるものが見えてきます.


【次世代マルチプロセッサ向けリアルタイムOSへの要望】
(1)タスクのマイグレーション(TOPPERS/FDMPカーネルに対して)
サポート範囲はリアルタイム性とのトレードオフ

(2)リアルタイム性(TOPPERS/SMPカーネルに対して)
SMPカーネルではリアルタイム性の保証は困難

(3)アーキテクチャ最適化
     (TOPPERS/FDMPカーネル,TOPPERS/SMPカーネルに対して)
メモリアーキテクチャに対する最適化を可能に

(4)カーネルコード共有(TOPPERS/FDMPに対して)
メモリのバンク数はプロセッサ数より少なく,キャッシュの効率化のためには,カーネルのプログラム(バイナリコード)は,すべてのコアで共有



TOPPERS/FMPカーネル(FMPは,Flexible Multiprocessor Profileの略.)は,ASPカーネルをマルチプロセッサ対応に拡張したリアルタイムカーネルです.また,上記の次世代マルチプロセッサ向けリアルタイムOSへの要求も実現しています.
FMPカーネルでは,ASPカーネルと同様に,タスクを実行するプロセッサを静的に決定するのが基本であり,カーネルは自動的に負荷分散する機能を持ちませんが,タスクをマイグレーションさせるサービスコールを提供しています.これを用いて,ユーザーがアプリケーションで動的な負荷分散を実現することが可能です.
TOPPERS/FMPカーネルは,TOPPERS/FDMPカーネルとTOPPERS/SMPカーネルの両方のメリットを享受し,リアルタイム性と動的なタスク移動との両立を目指した,TOPPERS新世代カーネルのマルチプロセッサ対応版と言えます.

次に,FMPカーネルの特徴をまとめます.


(1)コアごとのタスクスケジューリング
リアルタイム性の確保が容易であるというTOPPERS/FDMPカーネルのメリットを享受するため,コアごとにレディキューを持ち,タスクスケジューリングを行います.すなわち,プロセッサがディスパッチ保留状態でない限りは,そのプロセッサに割り付けられた実行できるタスクの中で最も高い優先順位を持つタスクが実行状態となり,他は実行可能状態となります.そのため,実行状態のタスクは,プロセッサ毎に存在するということになります.また,各プロセッサのレディキューは個別に管理することが可能なため,各プロセッサがプロセッサに閉じた処理を実行している限りは,他のプロセッサの影響を受けることはありません.それに対してTOPPERS/SMPカーネルの場合は,システム全体で1つのレディキューを持つため,多くのAPIがプロセッサ間で排他的となります.


(2)タスクを移動させるAPIを追加
TOPPERS/FDMPカーネルには,タスクを移動させるAPIがありませんでした.TOPPERS/FMPカーネルでは,負荷変動への対応が可能なようにタスクを移動させるAPIを追加しました.しかし,カーネル自身が動的に負荷分散を行うと,TOPPERS/SMPカーネルのデメリットでもあった,各タスクのリアルタイム性の保証が困難になってしまいます,そこで,TOPPERS/FMPカーネルでは,OS自身が負荷分散を行うことはしませんが,タスクを移動するAPIを用意することで,ユーザーがミドルウェアとして負荷分散を実現することができる仕組みを提供しています.



【図3 TOPPERS/FMPカーネル】


(3)多彩なアーキテクチャに対応
FMPカーネルの適用対象となるターゲットハードウェアのプロセッサは,Homo(ホモジニアス)なマルチプロセッサシステムです.各プロセッサが全く同一のものである必要はありませんが,すべてのプロセッサでカーネルのプログラムのバイナリコードを共有することから,同じバイナリコードを実行できることが必要です.
次に,ターゲットハードウェアのメモリアーキテクチャは,共有型であれば,対称共有メモリ型(UMA),分散共有メモリ型(NUMA)どちらにも対応できます.

【表1 各ハードウェアアーキテクチャに対する,TOPERS/FMPカーネルの対応】

  Homo Hetero
UMA Homo-UMA型対応
   
   
Hetero-UMA型→△
すべてのプロセッサが同じバイナリコードを実行できれば対応
NUMA Homo-NUMA型→対応



Hetero-NUMA型→△
すべてのプロセッサが同じバイナリコードを実行できれば対応



(4)シングルプロセッサ用RTOS(TOPPERS/ASPカーネル)との互換性
TOPPERS/FMPカーネルは,新世代カーネルの基盤であるASPカーネルのマルチプロセッサ対応版です.よって,TOPPERS/ASPカーネルで提供しているAPIは,TOPPERS/FMPカーネルでもそのまま提供されます.マルチプロセッサ用に追加されたAPIと,機能拡張されたAPIについては,今後解説します.


(5)スピンロック機能の追加
あるプロセッサがCPUロック状態にある間は,そのプロセッサにおいてのみ,すべてのカーネル管理の割込みがマスクされ,ディスパッチが保留されます.それに対して他のプロセッサにおいては,割込みはマスクされず,ディスパッチも起こるため,CPUロック状態を使って他のプロセッサで実行される処理単位との排他制御を実現することはできません.よって,第4回で解説したように,スピンロックを使ってCPU間の排他制御を実現しています.