Ada 202x (31日目) - スケジューリング戦略¶
わずか一ヶ月とはいえ最初の方を読み返すと自分で文体が笑えますね。 リハビリの成果はあったのでしょうか。
taskのスケジューリング戦略¶
今日はスケジューリング戦略に加わった変更をざっと見ていきます。
主にAdaランタイムがコンテキストスイッチも行うようなOSなし環境向けの機能です。 OSありですとOSに任せてしまったほうがいいような部分ですね。
一気に流し見していきます。
まずは task の優先順位から。
pragma Task_Dispatching_Policy¶
task のスケジューリング戦略はpragma Task_Dispatching_Policy で指定します。
標準で FIFO_Within_Priorities 、Non_Preemptive_FIFO_Within_Priorities、Round_Robin_Within_Priorities 等のポリシーが定義されています。
(実装はポリシーを追加しても構いません。)
その戦略の中のEarliest Deadline FirstにAda 202xで大きく手が入りました。
Earliest Deadline First(EDF)はデッドラインの近い task を優先的に実行するスケジューリング戦略です。
それが絶対時刻メインから相対時刻メインへと変更されました。
それに伴いpragma Task_Dispatching_Policy でEDFを指定する際のポリシーの名前も EDF_Across_Priorities から EDF_Within_Priorities へ変更されました。
pragma Generate_Deadlines¶
新しいpragmaです。
現在時刻と task の Relative_Deadline を元に絶対時刻のデッドラインを求めてそれを使うようにします。
このpragmaがない場合はデッドラインは相対時刻で管理されます。
Ada.Dispatching.EDF.Set_Deadline / Set_Relative_Deadline で task ごとにデッドラインを絶対時刻か相対時刻かも含めて設定できます。
Relative_Deadline¶
Relative_Deadline はアスペクトの構文を使うようになりました。
task と protected に指定できます。
従来のpragma Relative_Deadline はobsolescentになっています。
また protected の Relative_Deadline は属性の構文で値を取得できるようになりました。
protected の場合は Task_Id に相当するライブラリに渡すための識別子がないためだと思われます。
Ada.Dispatching.EDF¶
相対時刻がメインになったのに伴いパッケージ Ada.Dispatching.EDF にも大きな変更が加えられています。
キューの戦略¶
ランデブーの際に複数の task が同じエントリを呼び出した場合、要求はキューに積まれて順番に解決されていきます。
pragma Queuing_Policy¶
キューに積まれた要求の優先順位をつけるpragma Queuing_Policy にもポリシーが追加されています。
標準では FIFO_Queuing と Priority_Queuing が定義されていましたが、そこに Ordered_FIFO_Queuing が追加されました。
(実装はポリシーを追加しても構いません。)
Ordered_FIFO_Queuing は FIFO_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の上で使っている分には全く触れることはありませんので私には有り難みが実感できないのですよね。
詳しい方がおられましたら是非解説してください。