Ada 2020 (31日目) - スケジューリング戦略

わずか一ヶ月とはいえ最初の方を読み返すと自分で文体が笑えますね。 リハビリの成果はあったのでしょうか。

taskのスケジューリング戦略

今日はスケジューリング戦略に加わった変更をざっと見ていきます。

主にAdaランタイムがコンテキストスイッチも行うようなOSなし環境向けの機能です。 OSありですとOSに任せてしまったほうがいいような部分ですね。

一気に流し見していきます。 まずは task の優先順位から。

pragma Task_Dispatching_Policy

task のスケジューリング戦略はpragma Task_Dispatching_Policy で指定します。 標準で FIFO_Within_PrioritiesNon_Preemptive_FIFO_Within_PrioritiesRound_Robin_Within_Priorities 等のポリシーが定義されています。 (実装はポリシーを追加しても構いません。)

その戦略の中のEarliest Deadline FirstにAda 2020で大きく手が入りました。 Earliest Deadline First(EDF)はデッドラインの近い task を優先的に実行するスケジューリング戦略です。

それが絶対時刻メインから相対時刻メインへと変更されました。

それに伴いpragma Task_Dispatching_Policy でEDFを指定する際のポリシーの名前も EDF_Across_Priorities から EDF_Within_Priorities へ変更されました。

pragma Generate_Deadlines

新しいpragmaです。

現在時刻と taskRelative_Deadline を元に絶対時刻のデッドラインを求めてそれを使うようにします。

このpragmaがない場合はデッドラインは相対時刻で管理されます。

Ada.Dispatching.EDF.Set_Deadline / Set_Relative_Deadlinetask ごとにデッドラインを絶対時刻か相対時刻かも含めて設定できます。

Relative_Deadline

Relative_Deadline はアスペクトの構文を使うようになりました。 taskprotected に指定できます。

従来のpragma Relative_Deadline はobsolescentになっています。

また protectedRelative_Deadline は属性の構文で値を取得できるようになりました。 protected の場合は Task_Id に相当するライブラリに渡すための識別子がないためだと思われます。

Ada.Dispatching.EDF

相対時刻がメインになったのに伴いパッケージ Ada.Dispatching.EDF にも大きな変更が加えられています。

キューの戦略

ランデブーの際に複数の task が同じエントリを呼び出した場合、要求はキューに積まれて順番に解決されていきます。

pragma Queuing_Policy

キューに積まれた要求の優先順位をつけるpragma Queuing_Policy にもポリシーが追加されています。

標準では FIFO_QueuingPriority_Queuing が定義されていましたが、そこに Ordered_FIFO_Queuing が追加されました。 (実装はポリシーを追加しても構いません。)

Ordered_FIFO_QueuingFIFO_Queuing と大体同じですが動作がより細かく定められています。 FIFO_Queuing はAda 83からありますので今更変えられないということで分けられたようです。

Max_Entry_Queue_Length

キューのサイズを指定する Max_Entry_Queue_Length アスペクトが追加されました。

task または entry に指定できます。

ロックの戦略

protected に対するロックを獲得するやり方のことです。

pragma Admission_Policy

ロックの戦略を選択するpragma Admission_Policy が追加されました。

標準では FIFO_Spinning というポリシーが定義されています。 (実装はポリシーを追加しても構いません。)

FIFO_Spinning はスピンロックを使ったアルゴリズムです。 ビジーループでロックが獲得できるまで待ちます。

AIではMultiprocessor Stack Resource Policy(MSRP)といったアルゴリズムにも触れられています。 調べてみると面白いかもしれません。 (調べてない。)

関連AI

  • AI12-0163-1 Deterministic queue servicing for FIFO_Queueing

  • AI12-0164-1 Max_Entry_Queue_Length aspect for entries

  • AI12-0206-1 Nonoverridable should allow arbitrary kinds of aspects

  • AI12-0230-1 Deadline Floor Protocol

  • AI12-0276-1 Admission policy defined for acquiring a protected object resource

所感

この辺は毎回のように細かく更新されている部分ではあるのですが、普段OSの上で使っている分には全く触れることはありませんので私には有り難みが実感できないのですよね。

詳しい方がおられましたら是非解説してください。